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 相关文章推荐
js检测客户端不是firefox则提示下载
Apr 07 Javascript
js作用域及作用域链概念理解及使用
Apr 15 Javascript
JS实现字体选色板实例代码
Nov 20 Javascript
根据Bootstrap Paginator改写的js分页插件
Dec 25 Javascript
AngularJS路由切换实现方法分析
Mar 17 Javascript
json2.js 入门教程之使用方法与实例分析
Sep 14 Javascript
PHP 实现一种多文件上传的方法
Sep 20 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
Mar 08 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
Aug 13 Javascript
vue中前进刷新、后退缓存用户浏览数据和浏览位置的实例讲解
Sep 21 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
May 29 Javascript
基于Vue和Element-Ui搭建项目的方法
Sep 06 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中防止SQL注入最好的方法是什么
2013/06/10 PHP
PHP遍历数组的三种方法及效率对比分析
2015/02/12 PHP
smarty学习笔记之常见代码段用法总结
2016/03/19 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
2016/07/25 PHP
php中foreach结合curl实现多线程的方法分析
2016/09/22 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
PHP 断点续传实例详解
2017/11/11 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
理解JAVASCRIPT中hasOwnProperty()的作用
2013/06/05 Javascript
jquery自定义类似$.ajax()的方法实现代码
2013/08/13 Javascript
JSF中confirm弹出框的用法示例介绍
2014/01/07 Javascript
jquery实现页面图片等比例放大缩小功能
2014/02/12 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
jQuery中用dom操作替代正则表达式
2014/12/29 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
Javascript的动态增加类的实现方法
2016/10/20 Javascript
JavaScript原型继承_动力节点Java学院整理
2017/06/30 Javascript
jQuery中复合选择器简单用法示例
2018/03/31 jQuery
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
原生JS实现的跳一跳小游戏完整实例
2019/01/27 Javascript
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
vue实现二级导航栏效果
2019/10/19 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
Python中使用Boolean操作符做真值测试实例
2015/01/30 Python
Python实现计算最小编辑距离
2016/03/17 Python
python多线程并发及测试框架案例
2019/10/15 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
HTML5的语法变化介绍
2013/08/13 HTML / CSS
SQL Server 2000数据库的文件有哪些,分别进行描述
2013/03/30 面试题
深圳茁壮笔试题
2015/05/28 面试题
机械专业个人求职自荐信格式
2013/09/21 职场文书
大学生创业计划书
2014/08/14 职场文书
学校推普周活动总结
2015/05/07 职场文书
居委会工作总结2015
2015/05/18 职场文书
元素水平垂直居中的方式
2021/03/31 HTML / CSS