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 相关文章推荐
对xmlHttp对象方法和属性的理解
Jan 17 Javascript
jQuery 常见操作实现方式和常用函数方法总结
May 06 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
May 20 Javascript
jquery.cookie用法详细解析
Dec 18 Javascript
JavaScript省市联动实现代码
Feb 15 Javascript
jQuery响应enter键的实现思路
Apr 18 Javascript
jQuery实现的输入框选择时间插件用法实例
Feb 28 Javascript
AngularJS 工作原理详解
Aug 18 Javascript
vue.js开发环境搭建教程
May 04 Javascript
微信小程序简单实现form表单获取输入数据功能示例
Nov 30 Javascript
Javascript格式化并高亮xml字符串的方法及注意事项
Aug 13 Javascript
react中Suspense的使用详解
Sep 01 Javascript
浅谈微信小程序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
PHP定时自动生成静态HTML的实现代码
2010/06/20 PHP
Thinkphp实现自动验证和自动完成
2015/12/19 PHP
PHP实现中国公民身份证号码有效性验证示例代码
2017/05/03 PHP
Apply an AutoFormat to an Excel Spreadsheet
2007/06/12 Javascript
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
jQuery下通过$.browser来判断浏览器.
2011/04/05 Javascript
给页面渲染时间加速 干掉Dom Level 0 Event
2012/12/19 Javascript
JS对文本框值的判断示例
2014/03/10 Javascript
JavaScript中对循环语句的优化技巧深入探讨
2014/06/06 Javascript
jQuery中offsetParent()方法用法实例
2015/01/19 Javascript
javascript转换日期字符串为Date日期对象的方法
2015/02/13 Javascript
JavaScript将数组转换成CSV格式的方法
2015/03/19 Javascript
基于JavaScript FileReader上传图片显示本地链接
2016/05/27 Javascript
JS HTML5拖拽上传图片预览
2016/07/18 Javascript
Jquery获取radio选中的值
2017/05/05 jQuery
jQuery图片缩放插件smartZoom使用实例详解
2017/08/25 jQuery
es6系列教程_ Map详解以及常用api介绍
2017/09/25 Javascript
vue 使用eventBus实现同级组件的通讯
2018/03/02 Javascript
JavaScript递归函数定义与用法实例分析
2019/01/24 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
Vue数据绑定实例写法
2019/08/06 Javascript
Node.js API详解之 Error模块用法实例分析
2020/05/14 Javascript
基于JS实现快速读取TXT文件
2020/08/25 Javascript
[03:01]2014DOTA2国际邀请赛 小组赛7月13日TOPPLAY
2014/07/14 DOTA
[42:27]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第三局
2016/03/05 DOTA
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
利用python编写一个图片主色转换的脚本
2017/12/07 Python
Python3单行定义多个变量或赋值方法
2018/07/12 Python
Python Pandas对缺失值的处理方法
2019/09/27 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
Python根据指定文件生成XML的方法
2020/06/29 Python
京东港澳售:京东直邮港澳台
2018/01/31 全球购物
Skyscanner新西兰:全球领先的旅游搜索网站
2019/08/26 全球购物
十岁生日家长答谢词
2014/01/17 职场文书
协商一致解除劳动合同协议书
2014/09/14 职场文书
Redis6.0搭建集群Redis-cluster的方法
2021/05/08 Redis