todoList
结合之前 Vuejs 基础与语法
- 使用
v-model
双向绑定input
输入内容与数据data
- 使用
@click
和methods
关联事件 - 使用
v-for
进行数据循环展示
<!DOCTYPE html><html lang="en"><head> ?<meta charset="UTF-8"> ?<title>TodoList</title> ?<script src="./vue.js"></script></head><body> ?<div id="root"> ???<div> ?????<input v-model="inputValue"/> ?????<button @click="handleSubmit">提交</button> ???</div> ???<ul> ?????<li v-for="(item,index) of list" :key="index"> ???????{{item}} ?????</li> ???</ul> ?</div> ?<script> ???new Vue({ ?????el: "#root", ?????data: { ???????inputValue: ‘‘, ???????list: [] ?????}, ?????methods: { ???????handleSubmit: function(){ ?????????this.list.push(this.inputValue) ?????????this.inputValue = ‘‘ ???????} ?????} ???}) ?</script></body></html>
JSbin 预览
todoList 组件拆分
Vuejs 组件相关 详细参考组件基础
全局组件
注册全局组件,并在 HTML 中通过模板调用组件
???//注册全局组件 ???Vue.component(‘todo-item‘,{ ?????template: ‘<li>item</li>‘ ???}) ???<ul> ?????<!-- <li v-for="(item,index) of list" :key="index"> ???????{{item}} ?????</li> --> ?????<todo-item></todo-item> ?????<!-- 通过模板使用组件 --> ???</ul>
JSbin 预览
局部组件
在注册了局部组件之后,直接通过模板调用是不可以的,必须要在最外层的 Vue 的实例中添加 components: { }
进行组件声明。
???//注册局部组件 ???var TodoItem = { ?????template: ‘<li>item</li>‘ ???} ???new Vue({ ?????el: "#root", ?????components: { ??//局部组件需要声明的 components ???????‘todo-item‘: TodoItem ?????}, ?????data: { ???????inputValue: ‘‘, ???????list: [] ?????}, ?????methods: { ???????handleSubmit: function(){ ?????????this.list.push(this.inputValue) ?????????this.inputValue = ‘‘ ???????} ?????} ???})
JSbin 预览
即通过局部注册的组件,需要在其他的 Vue 实例中使用该局部组件。必须使用 components
对该局部组件进行注册。
上面的实例中,要在 Vue 实例中使用 TodoItem
这个局部组件,就通过 todo-item
这个标签来使用。当在实例中 注册好了以后,才可以在模板里面使用这个标签。这样就算正确的使用了局部组件。
外部传递参数
给 todo-item
标签添加 :content
属性,值为循环的每一项的内容 "item"
,
这样就可以吧 content
传递给 todo-item
这个组件
<todo-item v-for="(item,index) of list" :key="index" :content="item"></todo-item>
但是直接将组件改成是不行的
???Vue.component(‘todo-item‘,{ ?????template: ‘<li>{{content}}</li>‘ ???})
需要让组件接收属性,所以要在todo-item
组件里面定义props
属性,其值为一个数组 ‘content‘ 。
其含义是,该组件接收从外部传递的进来的名字叫做 content
的属性
???Vue.component(‘todo-item‘,{ ?????props: [‘content‘], ?????template: ‘<li>{{content}}</li>‘ ???})
JSbin 预览
组件与实例的关系
Vue 之中,每一个组件其实也是一个 Vue 的实例。因此在 Vue 项目中,是一个个实例构建而成的。
因此组件之中,也可以绑定 @click
事件,添加 methods
属性。
???Vue.component(‘todo-item‘,{ ?????props: [‘content‘], ?????template: ‘<li @click="handleClick">{{content}}</li>‘, ?????methods: { ???????handleClick: function(){ ?????????alert(‘clicked‘) ???????} ?????} ???})
JSbin 预览
同样的实例也可以被称作一个组件,那么我们这个根实例当中的 template
模板是什么呢 ?
如果一个 Vue 实例没有模板,会到挂载点去找。如下实例,根实例会找到 #root
下面挂载点的所有内容作为模板。
???new Vue({ ?????el: "#root", ?????data: { ???????inputValue: ‘‘, ???????list: [] ?????}, ?????methods: { ???????handleSubmit: function(){ ?????????this.list.push(this.inputValue) ?????????this.inputValue = ‘‘ ???????} ?????} ???})
为 todoList 添加删除功能
通过 发布 / 订阅,当子组件点击时,通知父组件把数据删除掉。在子组件中,发布自定义一个 ‘delete‘
事件。调用 this.$emit
方法,并传递 index
的值。
子组件向外部进行发布
???//子组件 ???Vue.component(‘todo-item‘,{ ?????props: [‘content‘,‘index‘], ?????template: ‘<li @click="handleClick">{{content}}</li>‘, ?????methods: { ???????handleClick: function(){ ?????????//发布 ?????????this.$emit(‘delete‘, this.index) ???????} ?????} ???})
父组件在模板里创建子组件的时候,监听子组件向外触发的 delete
事件,如果监听到 delete
事件,执行 handleDelete
函数。
?????<todo-item v-for="(item,index) of list" ????????????????:key="index" ????????????????:content="item" ????????????????:index="index" ????????????????@delete="handleDelete"> ?<!-- 监听delete事件 --> ?????</todo-item> ?????<!-- 通过模板使用组件 -->
然后在父组件的 methods
中,写好 handleDelete
方法。
???//最外层实例,父组件 ???new Vue({ ?????el: "#root", ?????data: { ???????inputValue: ‘‘, ???????list: [] ?????}, ?????methods: { ???????handleSubmit: function(){ ?????????this.list.push(this.inputValue) ?????????this.inputValue = ‘‘ ???????}, ???????handleDelete: function(index){ ?????????this.list.splice(index,1) ?//使用splice方法删除list ???????} ?????} ???})
JSbin 预览
Vuejs 实现简易 todoList 功能 与 组件
原文地址:https://www.cnblogs.com/evenyao/p/9608937.html