Vuejs 实现简易 todoList 功能 与 组件实例代码

2019-03-2907:39:41网站建设与开发Comments2,321 views字数 2663阅读模式

todoList
结合之前 Vuejs 基础与语法
•使用 v-model 双向绑定 input 输入内容与数据 data
•使用 @click 和 methods 关联事件
•使用 v-for 进行数据循环展示文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

<!DOCTYPE html>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

<html lang="en">文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

<head>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

<meta charset="UTF-8">文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

<title>TodoList</title>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

<script src="./"></script>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

</head>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

<body>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

<div>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

<div>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

<input v-model="inputValue"/>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

<button @click="handleSubmit">提交</button>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

</div>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

<ul>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

<li v-for="(item,index) of list" :key="index">文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

{{item}}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

</li>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

</ul>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

</div>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

<script>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

new Vue({文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

el: "#root",文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

data: {文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

inputValue: '',文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

list: []文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

},文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

methods: {文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

handleSubmit: function(){文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

()文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

= ''文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

})文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

</script>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

</body>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

</html>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

JSbin 预览文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

[color=#ff0000][b]todoList 组件拆分[/b][/color]文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

Vuejs 组件相关 详细参考组件基础文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

[b]全局组件[/b]文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

注册全局组件,并在 HTML 中通过模板调用组件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

 文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

//注册全局组件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

('todo-item',{文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

template: '<li>item</li>'文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

})文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

<ul>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

<!-- <li v-for="(item,index) of list" :key="index">文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

{{item}}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

</li> -->文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

<todo-item></todo-item>   <!-- 通过模板使用组件 -->文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

</ul>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

复制代码

JSbin 预览
局部组件
在注册了局部组件之后,直接通过模板调用是不可以的,必须要在最外层的 Vue 的实例中添加 components: { }进行组件声明。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

//注册局部组件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

var TodoItem = {文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

template: '<li>item</li>'文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

new Vue({文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

el: "#root",文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

components: {  //局部组件需要声明的 components文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

'todo-item': TodoItem文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

},文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

data: {文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

inputValue: '',文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

list: []文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

},文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

methods: {文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

handleSubmit: function(){文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

()文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

= ''文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

})文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

复制代码

JSbin 预览
即通过局部注册的组件,需要在其他的 Vue 实例中使用该局部组件。必须使用 components 对该局部组件进行注册。
上面的实例中,要在 Vue 实例中使用 TodoItem 这个局部组件,就通过 todo-item 这个标签来使用。当在实例中 注册好了以后,才可以在模板里面使用这个标签。这样就算正确的使用了局部组件。
外部传递参数
给 todo-item 标签添加 :content 属性,值为循环的每一项的内容 "item",文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

这样就可以吧 content 传递给 todo-item 这个组件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

<todo-item v-for="(item,index) of list" :key="index" :content="item"></todo-item>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

复制代码

但是直接将组件改成是不行的文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

  ('todo-item',{文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

template: '<li>{{content}}</li>'文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

})文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

复制代码

需要让组件接收属性,所以要在todo-item组件里面定义props属性,其值为一个数组 'content' 。
其含义是,该组件接收从外部传递的进来的名字叫做 content 的属性文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

  ('todo-item',{文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

props: ['content'],文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

template: '<li>{{content}}</li>'文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

})文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

复制代码

JSbin 预览
组件与实例的关系
Vue 之中,每一个组件其实也是一个 Vue 的实例。因此在 Vue 项目中,是一个个实例构建而成的。
因此组件之中,也可以绑定 @click 事件,添加 methods 属性。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

('todo-item',{文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

props: ['content'],文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

template: '<li @click="handleClick">{{content}}</li>',文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

methods: {文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

handleClick: function(){文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

alert('clicked')文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

})文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

复制代码

JSbin 预览
同样的实例也可以被称作一个组件,那么我们这个根实例当中的 template 模板是什么呢 ?
如果一个 Vue 实例没有模板,会到挂载点去找。如下实例,根实例会找到 #root 下面挂载点的所有内容作为模板。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

new Vue({文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

el: "#root",文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

data: {文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

inputValue: '',文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

list: []文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

},文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

methods: {文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

handleSubmit: function(){文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

()文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

= ''文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

})文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

复制代码

为 todoList 添加删除功能
通过 发布 / 订阅,当子组件点击时,通知父组件把数据删除掉。在子组件中,发布自定义一个 'delete' 事件。调用 this.$emit 方法,并传递 index 的值。
子组件向外部进行发布文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

  //子组件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

('todo-item',{文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

props: ['content','index'],文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

template: '<li @click="handleClick">{{content}}</li>',文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

methods: {文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

handleClick: function(){文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

//发布文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

this.$emit('delete', )文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

})文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

复制代码

父组件在模板里创建子组件的时候,监听子组件向外触发的 delete 事件,如果监听到 delete 事件,执行 handleDelete 函数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

   <todo-item v-for="(item,index) of list"文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

:key="index"文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

:content="item"文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

:index="index"文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

@delete="handleDelete"> <!-- 监听delete事件 -->文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

</todo-item>   <!-- 通过模板使用组件 -->文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

复制代码

然后在父组件的 methods 中,写好 handleDelete 方法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

  //最外层实例,父组件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

new Vue({文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

el: "#root",文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

data: {文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

inputValue: '',文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

list: []文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

},文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

methods: {文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

handleSubmit: function(){文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

()文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

= ''文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

},文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

handleDelete: function(index){文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

(index,1) //使用splice方法删除list文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

})文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/10642.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/cms/10642.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定