详解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中的prototype与继承
Apr 14 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
Nov 28 Javascript
通过伪协议解决父页面与iframe页面通信的问题
Apr 05 Javascript
JQuery.validate在ie8下不支持的快速解决方法
May 18 Javascript
JS中的进制转换以及作用
Jun 26 Javascript
jQuery控制控件文本的长度的操作方法
Dec 05 Javascript
jquery实现自适应banner焦点图
Feb 16 Javascript
JS分页的实现(同步与异步)
Sep 16 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
Oct 12 Javascript
微信小程序实现留言板功能
Nov 02 Javascript
vue.config.js中配置Vue的路径别名的方法
Feb 11 Javascript
解决vue字符串换行问题(绝对管用)
Aug 06 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一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
Nigma vs Liquid BO3 第一场2.13
2021/03/10 DOTA
CSS+JS构建的图片查看器
2006/07/22 Javascript
在textarea中显示html页面的javascript代码
2007/04/20 Javascript
Javascript变量作用域详解
2013/12/06 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
JS实现一个列表中包含上移下移删除等功能
2014/09/24 Javascript
JS+CSS简单树形菜单实现方法
2015/09/12 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
jquery自定义表格样式
2015/11/23 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
2016/06/21 Javascript
Bootstrap 填充Json数据的实例代码
2017/01/11 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
vue Render中slots的使用的实例代码
2017/07/19 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
javascript+css实现进度条效果
2020/03/25 Javascript
详解JavaScript的this指向和绑定
2020/09/08 Javascript
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
[15:23]教你分分钟做大人:虚空假面
2014/10/30 DOTA
python基础教程之自定义函数介绍
2014/08/29 Python
python统计字符串中指定字符出现次数的方法
2015/04/04 Python
理解Python中函数的参数
2015/04/27 Python
python实现自动重启本程序的方法
2015/07/09 Python
Python制作数据导入导出工具
2015/07/31 Python
python 实现判断ip连通性的方法总结
2018/04/22 Python
Django组件cookie与session的具体使用
2019/06/05 Python
Python求两个字符串最长公共子序列代码实例
2020/03/05 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
生态学毕业生自荐信
2013/10/27 职场文书
电子商务专业个人的自我评价
2013/12/19 职场文书
分厂厂长岗位职责
2013/12/29 职场文书
学校安全生产承诺书
2014/05/23 职场文书
环境工程专业自荐信范文
2014/06/24 职场文书
复试通知单模板
2015/04/24 职场文书
戴尔Win11系统no bootable devices found解决教程
2022/09/23 数码科技