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


Posted in Javascript onSeptember 10, 2018

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
    }
   }
  })

总结

以上所述是小编给大家介绍的Vuejs 实现简易 todoList 功能 与 组件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Javascript-Mozilla和IE中的一个函数直接量的问题
Jan 09 Javascript
超棒的javascript页面顶部卷动广告效果
Dec 01 Javascript
用javascript获取textarea中的光标位置
May 06 Javascript
js捕获鼠标右键菜单中的粘帖事件实现代码
Apr 01 Javascript
浅谈JavaScript函数参数的可修改性问题
Dec 05 Javascript
直接在JS里创建JSON数据然后遍历使用
Jul 25 Javascript
javascript定时器完整实例
Feb 10 Javascript
跟我学习javascript解决异步编程异常方案
Nov 23 Javascript
Bootstrap 过渡效果Transition 模态框(Modal)
Mar 17 Javascript
常见的浏览器Hack技巧整理
Jun 29 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
May 23 Javascript
VUE之图片Base64编码使用ElementUI组件上传
Apr 09 Vue.js
浅谈微信小程序flex布局基础
Sep 10 #Javascript
微信小程序文章详情页面实现代码
Sep 10 #Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
Sep 10 #Javascript
JavaScript读写二进制数据的方法详解
Sep 09 #Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
Sep 08 #Javascript
在vue项目中集成graphql(vue-ApolloClient)
Sep 08 #Javascript
React Native开发封装Toast与加载Loading组件示例
Sep 08 #Javascript
You might like
星际实力自我测试
2020/03/04 星际争霸
php插件Xajax使用方法详解
2017/08/31 PHP
js 事件小结 表格区别
2007/08/13 Javascript
jQuery 中使用JSON的实现代码
2011/12/01 Javascript
一个JQuery操作Table的代码分享
2012/03/30 Javascript
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
javascript判断chrome浏览器的方法
2014/03/26 Javascript
javascript浏览器窗口之间传递数据的方法
2015/01/20 Javascript
浅谈javascript的call()、apply()、bind()的用法
2016/02/21 Javascript
利用原生js和jQuery实现单选框的勾选和取消操作的方法
2016/09/04 Javascript
js实现rem自动匹配计算font-size的示例
2017/11/18 Javascript
基于jquery的on和click的区别详解
2018/01/15 jQuery
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
javascript 数组精简技巧小结
2020/02/26 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
2020/03/26 Javascript
JavaScript事件概念详解(区分静态注册和动态注册)
2021/02/05 Javascript
Python创建文件和追加文件内容实例
2014/10/21 Python
Python Matplotlib库入门指南
2015/05/18 Python
Python字符编码判断方法分析
2016/07/01 Python
Python验证文件是否可读写代码分享
2017/12/11 Python
对Python 内建函数和保留字详解
2018/10/15 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
pandas分别写入excel的不同sheet方法
2018/12/11 Python
树莓派极简安装OpenCv的方法步骤
2019/10/10 Python
Python 3 使用Pillow生成漂亮的分形树图片
2019/12/24 Python
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
时尚孕妇装:HATCH Collection
2019/09/24 全球购物
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
嘻哈珠宝品牌:KRKC&CO
2020/10/19 全球购物
学校爱国卫生月活动总结
2014/06/25 职场文书
群众路线领导对照材料
2014/08/23 职场文书
幼师中班个人总结
2015/02/12 职场文书
培训班通知
2015/04/25 职场文书
python解析json数据
2022/04/29 Python
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS