详解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 单选框,多选框美化代码
Aug 01 Javascript
Array栈方法和队列方法的特点说明
Jan 24 Javascript
JQuery中serialize()、serializeArray()和param()方法示例介绍
Jul 31 Javascript
AngularJS入门教程之学习环境搭建
Dec 06 Javascript
用JS写的一个Ajax库(实例代码)
Aug 06 Javascript
node koa2实现上传图片并且同步上传到七牛云存储
Jul 31 Javascript
vue动态路由配置及路由传参的方式
May 23 Javascript
解决vue-cli项目打包出现空白页和路径错误的问题
Sep 04 Javascript
在vue中实现点击选择框阻止弹出层消失的方法
Sep 15 Javascript
记一次用vue做的活动页的方法步骤
Apr 11 Javascript
如何根据业务封装自己的功能组件
Apr 19 Javascript
浅谈Webpack多页应用HMR卡住问题
Apr 24 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中的(伪)多线程与多进程
2013/07/01 PHP
PHP中file_get_contents高?用法实例
2014/09/24 PHP
Yii2中事务的使用实例代码详解
2016/09/07 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
PHP数据库操作二:memcache用法分析
2017/08/16 PHP
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
javascript实现汉字转拼音代码分享
2015/04/20 Javascript
详解微信小程序开发—你期待的分享功能来了,微信小程序序新增5大功能
2016/12/23 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
AjaxUpLoad.js实现文件上传功能
2018/03/02 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
this.$toast() 了解一下?
2019/04/18 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
2019/05/14 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
2019/09/10 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
2019/10/21 Javascript
基于原生JS封装的Modal对话框插件的示例代码
2020/09/09 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
[56:35]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第一局
2016/03/06 DOTA
[00:35]可解锁地面特效
2018/12/20 DOTA
python编程-将Python程序转化为可执行程序[整理]
2007/04/09 Python
介绍Python中的文档测试模块
2015/04/28 Python
详解Python爬虫的基本写法
2016/01/08 Python
Python算术运算符实例详解
2017/05/31 Python
python好玩的项目—色情图片识别代码分享
2017/11/07 Python
详解python实现线程安全的单例模式
2018/03/05 Python
Python使用统计函数绘制简单图形实例代码
2019/05/15 Python
Python3 pandas 操作列表实例详解
2019/09/23 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
Django之全局使用request.user.username的实例详解
2020/05/14 Python
python如何停止递归
2020/09/09 Python
python快速安装OpenCV的步骤记录
2021/02/22 Python
详解HTML5中的picture元素响应式处理图片
2018/01/03 HTML / CSS
澳大利亚工具仓库:Tools Warehouse
2018/10/15 全球购物
大学新生入学教育方案
2014/05/16 职场文书
初中数学教学反思范文
2016/02/17 职场文书
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL