详解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 相关文章推荐
mysql输出数据赋给js变量报unterminated string literal错误原因
May 22 Javascript
精心挑选的15个jQuery下拉菜单制作教程
Jun 15 Javascript
jQuery中triggerHandler()方法用法实例
Jan 19 Javascript
JS实现状态栏跑马灯文字效果代码
Oct 24 Javascript
详解JavaScript的流程控制语句
Nov 30 Javascript
终于实现了!精彩的jquery弹幕效果
Jul 18 Javascript
如何使用Vuex+Vue.js构建单页应用
Oct 27 Javascript
详解JS构造函数中this和return
Sep 16 Javascript
微信小程序基于本地缓存实现点赞功能的方法
Dec 18 Javascript
微信小程序自定义select下拉选项框组件的实现代码
Aug 28 Javascript
详解几十行代码实现一个vue的状态管理
Jan 28 Javascript
教你完全理解ReentrantLock重入锁
Jun 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
flash用php连接数据库的代码
2011/04/21 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
2014/05/19 PHP
使用php自动备份数据库表的实现方法
2017/07/28 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
jQuery Ajax之load()方法
2009/10/12 Javascript
基于jquery的固定表头和列头的代码
2012/05/03 Javascript
jQuery实现表头固定效果的实例代码
2013/05/24 Javascript
window.event.keyCode兼容IE和Firefox实现js代码
2013/05/30 Javascript
js中的for如何实现foreach中的遍历
2014/05/31 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
2016/06/08 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
2016/08/16 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
2017/01/09 Javascript
在vue.js中抽出公共代码的方法示例
2017/06/08 Javascript
基于Vue单文件组件详解
2017/09/15 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
2018/02/03 Javascript
JavaScript设计模式之享元模式实例详解
2019/01/17 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
java遇到微信小程序 &quot;支付验证签名失败&quot; 问题解决
2019/12/22 Javascript
解决vue打包 npm run build-test突然不动了的问题
2020/11/13 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
Tensorflow 同时载入多个模型的实例讲解
2018/07/27 Python
python实现彩色图转换成灰度图
2019/01/15 Python
Python使用LDAP做用户认证的方法
2019/06/20 Python
python可视化实现KNN算法
2019/10/16 Python
Python可变对象与不可变对象原理解析
2020/02/25 Python
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
Amara德国:家居饰品、设计师品牌和豪华礼品
2019/05/20 全球购物
网站开发实习生的自我评价
2013/12/11 职场文书
家长对孩子的感言
2014/03/10 职场文书
珠宝的促销活动方案
2014/08/31 职场文书
人口与计划生育责任书
2015/05/09 职场文书
写好求职信的技巧解密
2019/05/14 职场文书
MySQL提升大量数据查询效率的优化神器
2022/07/07 MySQL