写几个小案例来理解vue的组件化编程思想,下面是一个demo.

效果图示:



功能: Add组件用于添加用户评论,提交后右边评论回复会立马显示数据.Item组件点击删除可以删除当前用户评论.当List组件中用户评论为空时,会提示"暂无评论,点击左侧添加评论".

项目目录:



代码:

1.index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>vue_demo</title>
<link rel="stylesheet" href="./static/css/bootstrap.css">
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

2.main.js

import Vue from 'vue'
import App from './App' new Vue({
el: '#app',
components: { App },
template: '<App/>'
})

3.App.vue

<template>
<div>
<header class="site-header jumbotron">
<div class="container">
<div class="row">
<div class="col-xs-12">
<h1>请发表对Vue的评论</h1>
</div>
</div>
</div>
</header>
<div class="container">
<Add :addComment="addComment" />
<!-- 组件通信:属性名最好与model中一致(绑定表达式) -->
<List :comments="comments" :deleteComment="deleteComment"/> </div>
</div>
</template> <script>
import Add from './components/Add'
import List from './components/List' export default {
name: 'App',
data(){
return {
comments: [ // 数据在哪个组件,更新数据的行为(方法)就应该定义在哪个组件
{
name: 'Jack',
content: 'vue so easy'
},
{
name: 'Tom',
content: 'vue so nice'
},
{
name: 'Cat',
content: 'vue so cool'
},
],
}
},
methods: {
// 添加评论
addComment (comment) {
this.comments.unshift(comment)
},
// 删除指定下标的评论
deleteComment (index) {
this.comments.splice(index,1)
}
},
components: {Add ,List}, }
</script> <style> </style>

4.Add.vue

<template>
<div class="col-md-4">
<form class="form-horizontal">
<div class="form-group">
<label>用户名</label>
<input type="text" class="form-control" placeholder="用户名" v-model="name">
</div>
<div class="form-group">
<label>评论内容</label>
<textarea class="form-control" rows="6" placeholder="评论内容" v-model="content"></textarea>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="button" class="btn btn-default pull-right" @click="add">提交</button>
</div>
</div>
</form>
</div>
</template> <script>
export default {
name: "Add",
props: { // 声明接受属性
addComment: { //指定属性名/属性值类型/必要性
type: Function,
required: true
}
},
data () {
return {
name: '',
content: ''
}
},
methods: {
add () {
// 1.检查输入的合法性
const name = this.name.trim()
const content = this.content.trim()
if (!name || !content) {
alert('name和content不能为空')
return
}
// 2.根据输入的数据,封装成一个comment对象
const comment = {
name,
content
}
// 3.添加到comments中
this.addComment(comment)
// 4.清楚输入
this.name = ''
this.content = ''
}
}
}
</script> <style scoped> </style>

5.List.vue

<template>
<div class="col-md-8">
<h3 class="reply">评论回复:</h3>
<h2 v-show="comments.length===0">暂无评论,点击左侧添加评论!!!</h2>
<ul class="list-group">
<!-- 使用Item标签: 遍历数组,数组通信 -->
<Item v-for="(comment,index) in comments" :key="index" :comment="comment"
:deleteComment="deleteComment" :index="index"/> </ul>
</div>
</template> <script>
// 引入Item组件
import Item from './Item' export default {
name: "List",
// 声明接受属性: 会成为组件对象的属性(类似与vm: data(){return {comments: []}})
props: ['comments','deleteComment'], //只指定属性名
components: { // 组件映射标签
Item
} }
</script> <style scoped>
.reply {
margin-top: 0px;
} </style>

6.Item.vue

<template>
<li class="list-group-item">
<div class="handle">
<a href="javascript:;" @click="deleteItem">删除</a>
</div>
<p class="user"><span >{{comment.name}}</span><span>说:</span></p>
<p class="centence">{{comment.content}}</p>
</li>
</template> <script>
export default {
name: "Item",
// 声明接受属性
props: { // 指定属性名和属性值的类型
comment: Object,
deleteComment: Function,
index: Number
},
methods: {
deleteItem () {
const {comment,deleteComment,index} = this
if (window.confirm(`是否确定删除${comment.name}的评论?`)) {
deleteComment(index)
}
}
}
}
</script> <style scoped>
li {
transition: .5s;
overflow: hidden;
} .handle {
width: 40px;
border: 1px solid #ccc;
background: #fff;
position: absolute;
right: 10px;
top: 1px;
text-align: center;
} .handle a {
display: block;
text-decoration: none;
} .list-group-item .centence {
padding: 0px 50px;
} .user {
font-size: 22px;
}
</style>

最新文章

  1. java多线程系类:JUC线程池:06之Callable和Future(转)
  2. python Gunicorn
  3. Hadoop: MapReduce2的几个基本示例
  4. 修改Widows网络设置提升网速
  5. SparkSQL项目中的应用
  6. log4j.xml配置文件
  7. 如何用ASP.NET实现bosh模拟http双向长连接请求
  8. Python脚本控制的WebDriver 常用操作 &lt;二十六&gt; 上传文件
  9. Call to undefined function imagettftext()解决方法
  10. table完美css样式,table的基本样式,table样式
  11. Hibernate之配置文件
  12. 【开发记录】如何在B/S项目中使用中国天气的实时天气功能
  13. MySQL单机单实例安装脚本(转载)
  14. mybatis关于ORM的使用以及设计(一)[ORM的初始化]
  15. 【原创】ucos信号量的操作及原理
  16. XSS-HTML&amp;javaSkcript&amp;CSS&amp;jQuery&amp;ajax-CSS
  17. python使用matplotlib绘制折线图教程
  18. 第三章:Activity的生命周期
  19. 《Django By Example》第一章 学习笔记
  20. 并发编程之 CountDown 源码分析

热门文章

  1. 百度地图api的简单应用(一):POI检索
  2. postman—创建collection,执行collection和批量执行
  3. 阿里云移动研发平台 EMAS 助力银行业打造测试中台,提升发版效能
  4. BZOJ 4597: [Shoi2016]随机序列 线段树 + 思维
  5. max pool实现
  6. npm安装源修改为淘宝源
  7. 密度聚类 DBSCAN
  8. 在JS中统计函数执行次数
  9. Django REST framework的解析器与渲染器
  10. C# 读取Excel中的数据到DataTable中