详解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 delete 属性的使用
Oct 08 Javascript
改写一个简单的菜单 弹性大小
Dec 02 Javascript
解决Extjs上传图片无法预览的解决方法
Mar 22 Javascript
js 在定义的时候立即执行的函数表达式(function)写法
Jan 16 Javascript
javascript删除字符串最后一个字符
Jan 14 Javascript
jQuery根据ID获取input、checkbox、radio、select的示例
Aug 11 Javascript
浅谈jQuery.easyui的datebox格式化时间
Jun 25 Javascript
js中 计算两个日期间的工作日的简单实例
Aug 08 Javascript
js学习笔记之事件处理模型
Oct 31 Javascript
微信小程序 数据交互与渲染实例详解
Jan 21 Javascript
详解vue组件化开发-vuex状态管理库
Apr 10 Javascript
javascript实现fetch请求返回的统一拦截
Dec 22 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作为Shell脚本语言使用
2006/10/09 PHP
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
Win7 64位系统下PHP连接Oracle数据库
2014/08/20 PHP
PHP版单点登陆实现方案的实例
2016/11/17 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
js通过地址栏给action传值(中文乱码全是问号)
2013/05/02 Javascript
javascript实现类似java中getClass()得到对象类名的方法
2015/07/27 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
2015/11/07 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
2016/05/24 Javascript
JavaScript函数表达式详解及实例
2017/05/05 Javascript
谈谈React中的Render Props模式
2018/12/06 Javascript
微信小程序搜索功能(附:小程序前端+PHP后端)
2019/02/28 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
2019/12/16 Javascript
Vue 技巧之控制父类的 slot
2020/02/24 Javascript
JS字符串补全方法padStart()和padEnd()
2020/05/27 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
2020/08/10 Javascript
微信小程序实现页面监听自定义组件的触发事件
2020/11/01 Javascript
Windows上使用virtualenv搭建Python+Flask开发环境
2016/06/07 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
Python Opencv实现图像轮廓识别功能
2020/03/23 Python
python多线程分块读取文件
2019/08/29 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
2020/02/27 Python
利用CSS3的线性渐变linear-gradient制作边框的示例
2016/06/02 HTML / CSS
学生个人的自我评价分享
2013/11/05 职场文书
办公室主任岗位职责
2013/11/08 职场文书
县委班子四风对照检查材料思想汇报
2014/09/29 职场文书
施工安全员岗位职责
2015/04/11 职场文书
幽默导游词开场白
2015/05/29 职场文书
贷款工资证明范本
2015/06/12 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
导游词之安徽醉翁亭
2020/01/10 职场文书
Python使用scapy模块发包收包
2021/05/07 Python
python 实现体质指数BMI计算
2021/05/26 Python
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis
详解MySQL的主键查询为什么这么快
2022/04/03 MySQL
mysql 索引的数据结构为什么要采用B+树
2022/04/26 MySQL