详解Vue的computed(计算属性)使用实例之TodoList


Posted in Javascript onAugust 07, 2017

最近倒腾了一会vue,有点迷惑其中methodscomputed这两个属性的区别,所以试着写了TodoList这个demo,(好土掩面逃~);

1. methods

methods类似react中组件的方法,不同的是vue采用的与html绑定事件。

给个例子

/*html*/
 <input type="button" value="点击" v-on:click='handlClick' id="app">
/*js*/
 var app = new Vue({
    el:'#app',
    methods:{
      handlClick:function(){
        alert('succeed!');
      },
    }
  })

通过在input标签中的vue命令 v-on命令绑定handlClick事件,而handlClick事件是写在methods属性里的

2. computed

/*html*/
<div id="app2">{{even}}</div>
/*js*/
var app2 = new Vue({
  el:'#app2',
  data:{
    message:[1,2,3,4,5,6]
  },
  computed:{
    even:function(){ //筛选偶数
      return this.message.filter(function(item){
        return item%2 === 0;
      });
    },
  },
});

可以看到筛选出来了message中的偶数,现在在控制台打印出message看看

详解Vue的computed(计算属性)使用实例之TodoList

可以看到,message并没有变,还是原来的message,然后在控制台中修改message试试,

详解Vue的computed(计算属性)使用实例之TodoList

修改后我并没有人为的触发任何函数,左边的显示就变成了新的数组的偶数选集

3. 区别

methods是一种交互方法,通常是把用户的交互动作写在methods中;而computed是一种数据变化时mvc中的module 到 view 的数据转化映射。

简单点讲就是methods是需要去人为触发的,而computed是在检测到data数据变化时自动触发的,还有一点就是,性能消耗的区别,这个好解释。

首先,methods是方式,方法计算后垃圾回收机制就把变量回收,所以下次在要求解筛选偶数时它会再次的去求值。而computed会是依赖数据的,就像闭包一样,数据占用内存是不会被垃圾回收掉的,所以再次访问筛选偶数集,不会去再次计算而是返回上次计算的值,当data中的数据改变时才会重新计算。简而言之,methods是一次性计算没有缓存,computed是有缓存的计算。

4. TodoList例子

看了一下Vue官网的todo例子,好像没有筛选功能,所以就写了有个筛选功能的例子,下面代码中,@click的意思是v-on='click'的简写,:class=的意思是v-bind:'class'=的简写

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>todos</title>
  <script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script>
  <style>
    .wrap{
      width: 400px;
      background-color: #ccc;
      margin: 0 auto;
    }
    i{
      color: #f00;
      font-size: 12px;
      margin-left: 20px;
      cursor: pointer;
    }
    i:hover{
      font-weight: 700;
    }
    ol{
      /*white-space: nowrap;*/
      word-wrap:break-word;
    }
    .done{
      text-decoration: line-through;
    }
    .not{

    }
  </style>
</head>
<body>
  <div class="wrap" id="todos">
    <input type="text" v-model='nextItem' @keyup.enter='append'>
    <button id="append" @click='append'>添加</button>
    <ol>
      <li v-for='(item,index) of comp' 
      :key=item.id
      :class='item.state ? "not" : "done"'>
        {{item.text}}
        <i @click='remove(index)'>完成</i>
      </li>
    </ol>
    <button @click='all'>全部</button>
    <button @click='done'>已完成</button>
    <button @click='todos'>待完成</button>
  </div>
</body>
<script>
  var todos = new Vue({
    el:'#todos',
    data:{
      nextItem: '',
      nextID: 1,
      list: [],
      type: null,
    },
    computed:{
      comp:function(){
        if( this.type === 0 ){
          return this.list;
        }
        else if(this.type === 1){ //show all
          return this.list.filter(function(item){
            return true;
          })
        }
        else if(this.type === 2){ //done
          return this.list.filter(function(item){
            return item.state ? false : true;
          })
        }
        else if(this.type === 3){ //todos
          return this.list.filter(function(item){
            return item.state ? true : false;
          })
        }
      }
    },
    methods:{
      append:function(){//添加到todo
        this.list.push({
          id:this.nextID++,
          text:this.nextItem,
          state: true,
        });
        this.nextItem = '';
        this.type = 0;
      },
      remove:function(index){ //添加到donelist
        this.list[index].state = !this.list[index].state;
      },
      all:function(){
        this.type = 1;
      },
      done:function(){
        this.type = 2;
      },
      todos:function(){
        this.type = 3;
      }
    }
  });
</script>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
测试JavaScript字符串处理性能的代码
Dec 07 Javascript
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
Mar 03 Javascript
jquery插件制作 手风琴Panel效果实现
Aug 17 Javascript
jQuery实现点击该行即可删除HTML表格行
Oct 17 Javascript
JsRender实用入门教程
Oct 31 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
Jun 10 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
Aug 17 Javascript
js添加千分位的实现代码(超简单)
Aug 01 Javascript
react实现pure render时bind(this)隐患需注意!
Mar 09 Javascript
Node+Express+MongoDB实现登录注册功能实例
Apr 23 Javascript
vue中路由验证和相应拦截的使用详解
Dec 13 Javascript
Preload基础使用方法详解
Feb 03 Javascript
详解express与koa中间件模式对比
Aug 07 #Javascript
JS实现简单短信验证码界面
Aug 07 #Javascript
ReactNative Image组件使用详解
Aug 07 #Javascript
JS实现移动端判断上拉和下滑功能
Aug 07 #Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
Aug 07 #Javascript
JS判断微信扫码的方法
Aug 07 #Javascript
AngularJs每天学习之总体介绍
Aug 07 #Javascript
You might like
谈PHP生成静态页面分析 模板+缓存+写文件
2009/08/17 PHP
网页游戏开发入门教程三(简单程序应用)
2009/11/02 PHP
细谈php中SQL注入攻击与XSS攻击
2012/06/10 PHP
php eval函数用法总结
2012/10/31 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
jQuery 加上最后自己的验证
2009/11/04 Javascript
JavaScript 5 新增 Array 方法实现介绍
2012/02/06 Javascript
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
2012/02/27 Javascript
html文件中jquery与velocity变量中的$冲突的解决方法
2013/11/01 Javascript
从零学jquery之如何使用回调函数
2014/05/16 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
JavaScript中数组成员的添加、删除介绍
2014/12/30 Javascript
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
2015/12/12 Javascript
require.js配合插件text.js实现最简单的单页应用程序
2016/07/12 Javascript
js通过classname来获取元素的方法
2016/11/24 Javascript
JS/jquery实现一个网页内同时调用多个倒计时的方法
2017/04/27 jQuery
Webpack如何引入bootstrap的方法
2017/06/17 Javascript
webpack项目调试以及独立打包配置文件的方法
2018/02/28 Javascript
详解JavaScript栈内存与堆内存
2019/04/04 Javascript
如何基于js判断浏览器版本
2020/02/20 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
Windows8下安装Python的BeautifulSoup
2015/01/22 Python
使用Python脚本来获取Cisco设备信息的示例
2015/05/04 Python
python图片验证码生成代码
2016/07/02 Python
python交互式图形编程实例(一)
2017/11/17 Python
Python正则表达式急速入门(小结)
2019/12/16 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
2020/03/27 Python
如何通过命令行进入python
2020/07/06 Python
党员岗位承诺书
2014/03/25 职场文书
学校三节实施方案
2014/06/09 职场文书
上课迟到检讨书范文
2015/05/06 职场文书
面试被问select......for update会锁表还是锁行
2021/11/11 MySQL
MySQL的索引你了解吗
2022/03/13 MySQL