详解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 相关文章推荐
jQuery MD5加密实现代码
Mar 15 Javascript
基于jquery的关于动态创建DOM元素的问题
Dec 24 Javascript
Extjs4 类的定义和扩展实例
Jun 28 Javascript
Javascript基础教程之数组 array
Jan 18 Javascript
js实现鼠标点击文本框自动选中内容的方法
Aug 20 Javascript
jQuery 全选 全部选 反选 实现代码
Aug 17 Javascript
原生js轮播特效
May 18 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
May 27 Javascript
使用JavaScript破解web
Sep 28 Javascript
JavaScript:ES2019 的新特性(译)
Aug 08 Javascript
Javascript操作select控件代码实例
Feb 14 Javascript
详解JavaScript 高阶函数
Sep 14 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之第三天
2006/10/09 PHP
PHP 命名空间实例说明
2011/01/27 PHP
php include和require的区别深入解析
2013/06/17 PHP
php配合jquery实现增删操作具体实例
2013/12/12 PHP
php使用str_replace实现输入框回车替换br的方法
2014/11/24 PHP
变量在 PHP7 内部的实现(二)
2015/12/21 PHP
php处理单文件、多文件上传代码分享
2016/08/24 PHP
PHP 实现 JSON 数据的编码和解码操作详解
2020/04/22 PHP
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
2012/02/03 Javascript
jquery实现图片灯箱明暗的遮罩效果
2013/11/15 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
JavaScript的removeChild()函数用法详解
2015/12/27 Javascript
基于JavaScript如何实现ajax调用后台定义的方法
2015/12/29 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
AngularJS中如何使用echart插件示例详解
2016/10/26 Javascript
Angularjs验证用户输入的字符串是否为日期时间
2017/06/01 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
2018/09/07 Javascript
Vue项目打包部署到apache服务器的方法步骤
2021/02/01 Vue.js
python使用sorted函数对列表进行排序的方法
2015/04/04 Python
Python同时向控制台和文件输出日志logging的方法
2015/05/26 Python
实例讲解Python中global语句下全局变量的值的修改
2016/06/16 Python
使用Python实现简单的服务器功能
2017/08/25 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
2018/05/25 Python
python可视化实现代码
2019/01/15 Python
详解Python 函数如何重载?
2019/04/23 Python
Django 博客实现简单的全文搜索的示例代码
2020/02/17 Python
Css3+Js制作漂亮时钟(附源码)
2013/04/24 HTML / CSS
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
adidas澳大利亚官方网站:adidas Australia
2018/04/15 全球购物
Harrods英国:世界领先的奢侈品百货商店
2020/09/23 全球购物
阿尔卡特(中国)的面试题目
2014/08/20 面试题
Linux文件系统类型
2012/02/15 面试题
公务员上班玩游戏检讨书
2014/09/17 职场文书
中学生学习保证书
2015/02/26 职场文书
汽车车尾标语大全
2015/08/11 职场文书