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的面向对象(一)
Nov 09 Javascript
Javascript与vbscript数据共享
Jan 09 Javascript
解析John Resig Simple JavaScript Inheritance代码
Dec 03 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
May 13 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
Jun 20 Javascript
JavaScript的函数式编程基础指南
Mar 19 Javascript
javascript jquery对form元素的常见操作详解
Jun 12 Javascript
JavaScript原生节点操作小结
Jan 17 Javascript
Bootstrap一款超好用的前端框架
Sep 25 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
Oct 18 Javascript
vue插件mescroll.js实现移动端上拉加载和下拉刷新
Mar 07 Javascript
如何将JavaScript将数组转为树形结构
Jun 02 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 mcrypt可逆加密算法分析
2011/07/19 PHP
关于svn冲突的解决方法
2013/06/21 PHP
php开发工具有哪五款
2015/11/09 PHP
php创建桌面快捷方式实现方法
2015/12/31 PHP
php解决crontab定时任务不能写入文件问题的方法分析
2019/09/16 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
Laravel 创建可以传递参数 Console服务的例子
2019/10/14 PHP
JavaScript 实现模态对话框 源代码大全
2009/05/02 Javascript
自用js开发框架小成 学习js的朋友可以看看
2010/11/16 Javascript
js 使用form表单select类实现级联菜单效果
2012/12/19 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
微信小程序 开发之全局配置
2017/05/05 Javascript
js实现音乐播放控制条
2017/09/09 Javascript
手把手教你使用vue-cli脚手架(图文解析)
2017/11/08 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
vue-cli脚手架build目录下utils.js工具配置文件详解
2018/09/14 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
微信小程序实现用table显示数据库反馈的多条数据功能示例
2019/05/07 Javascript
js事件触发操作实例分析
2019/06/21 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
JavaScript监听键盘事件代码实现
2020/06/03 Javascript
[03:11]完美世界DOTA2联赛PWL DAY8集锦
2020/11/09 DOTA
python开发之文件操作用法实例
2015/11/13 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
2016/06/27 Python
浅谈Python peewee 使用经验
2017/10/20 Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
2018/01/29 Python
Python设计模式之工厂方法模式实例详解
2019/01/18 Python
家庭户外服装:Hawkshead
2017/11/02 全球购物
团组织关系介绍信
2014/01/12 职场文书
新任教师自我鉴定
2014/02/24 职场文书
二手房购房意向书
2015/05/09 职场文书
中秋节随笔
2015/08/15 职场文书
Kubernetes中Deployment的升级与回滚
2022/04/01 Servers
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL
JS前端canvas交互实现拖拽旋转及缩放示例
2022/08/05 Javascript