详解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 相关文章推荐
js计数器代码
Nov 04 Javascript
基于jquery的一行代码轻松实现拖动效果
Dec 28 Javascript
node.js中的console.assert方法使用说明
Dec 10 Javascript
js实现黑色简易的滑动门网页tab选项卡效果
Aug 31 Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
Feb 15 Javascript
原生JS实现网络彩票投注效果
Sep 25 Javascript
node学习笔记之读写文件与开启第一个web服务器操作示例
May 29 Javascript
js通过循环多张图片实现动画效果
Dec 19 Javascript
Vue filter 过滤当前时间 实现实时更新效果
Dec 20 Javascript
如何在Node和浏览器控制台中打印彩色文字
Jan 09 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
Sep 17 Javascript
jquery简易手风琴插件的封装
Oct 13 jQuery
详解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数组传递是值传递而非引用传递概念纠正
2013/01/31 PHP
win7系统配置php+Apache+mysql环境的方法
2015/08/21 PHP
php实现将数据做成json的格式给前端使用
2018/08/21 PHP
在UpdatePanel内jquery easyui效果失效的解决方法
2010/04/11 Javascript
javascript之querySelector和querySelectorAll使用介绍
2011/12/20 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
谈谈AngularJs中的隐藏和显示
2015/12/09 Javascript
EasyUI Combobox设置默认值 获取text的方法
2016/11/28 Javascript
利用Node.js了解与测量HTTP所花费的时间详解
2017/09/22 Javascript
Vue组件之极简的地址选择器的实现
2018/05/31 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
VUE v-model表单数据双向绑定完整示例
2019/01/21 Javascript
vue中的mvvm模式讲解
2019/01/31 Javascript
Vue 指令实现按钮级别权限管理功能
2019/04/23 Javascript
微信提示 在浏览器打开 效果实现过程解析
2019/09/10 Javascript
微信公众号开发之微信支付代码记录的实现
2019/10/16 Javascript
利用js canvas实现五子棋游戏
2020/10/11 Javascript
[01:35]2014DOTA2西雅图邀请赛 专访狐狸妈青春献给刀塔
2014/07/08 DOTA
[03:16]DOTA2完美大师赛主赛事首日集锦
2017/11/23 DOTA
Python中Django发送带图片和附件的邮件
2017/03/31 Python
详谈python中冒号与逗号的区别
2018/04/18 Python
python url 参数修改方法
2018/12/26 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
python爬虫之自制英汉字典
2019/06/24 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
建筑工程专业毕业生自荐信
2013/10/19 职场文书
幼儿园教师个人反思
2014/01/30 职场文书
责任心演讲稿
2014/05/14 职场文书
新闻报道策划方案
2014/06/11 职场文书
政风行风自查自纠报告
2014/10/21 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书
对外汉语教师推荐信
2015/03/27 职场文书
2015年采购部工作总结
2015/04/23 职场文书
被告答辩状范文
2015/05/22 职场文书
利用python做数据拟合详情
2021/11/17 Python