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 相关文章推荐
a标签的href与onclick事件的区别详解
Nov 12 Javascript
jQuery 中DOM 操作详解
Jan 13 Javascript
jquery搜索框效果实现方法
Jan 16 Javascript
简单理解Vue条件渲染
Dec 03 Javascript
使用yeoman构建angular应用的方法
Aug 14 Javascript
Vue实现typeahead组件功能(非常靠谱)
Aug 26 Javascript
浅谈React Native 中组件的生命周期
Sep 08 Javascript
vue组件间通信子与父详解(二)
Nov 07 Javascript
JS中‘hello’与new String(‘hello’)引出的问题详解
Aug 14 Javascript
使用NestJS开发Node.js应用的方法
Dec 03 Javascript
ES6 class的应用实例分析
Jun 27 Javascript
浅入深出Vue之组件使用
Jul 11 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
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
2010/02/16 PHP
PHP函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
php实现文件下载(支持中文文名)
2013/12/04 PHP
PHP中使用memcache存储session的三种配置方法
2014/04/05 PHP
PHP中的session安全吗?
2016/01/22 PHP
PHP中number_format()函数的用法讲解
2019/04/08 PHP
HTML TO JavaScript 转换
2006/06/26 Javascript
js兼容标准的表格变色效果
2008/06/28 Javascript
jquery使用append(content)方法注意事项分享
2014/01/06 Javascript
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
JS判断是否长按某一键的方法
2016/03/02 Javascript
jQuery使用正则表达式限制文本框只能输入数字
2016/06/18 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
AJAX在JQuery中的应用详解
2019/01/30 jQuery
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
JS forEach跳出循环2种实现方法
2020/06/24 Javascript
vue点击按钮实现简单页面的切换
2020/09/08 Javascript
[02:05]2014DOTA2西雅图邀请赛 老队长全明星大猜想谁不服就按进显示器
2014/07/08 DOTA
Python 文件管理实例详解
2015/11/10 Python
利用Opencv中Houghline方法实现直线检测
2018/02/11 Python
python和flask中返回JSON数据的方法
2018/03/26 Python
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
python列表使用实现名字管理系统
2019/01/30 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
用python解压分析jar包实例
2020/01/16 Python
多个python文件调用logging模块报错误
2020/02/12 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
美国一家主打母婴用品的团购网站:zulily
2017/09/19 全球购物
玲玲的画教学反思
2014/02/04 职场文书
安全宣传标语
2014/06/10 职场文书
公司授权委托书范文
2014/09/21 职场文书
2015年转正工作总结范文
2015/04/02 职场文书
《牧场之国》教学反思
2016/02/22 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书
2019暑期安全倡议书!
2019/06/27 职场文书