Vue.js教程之计算属性


Posted in Javascript onNovember 11, 2016

Vue.js 的内联表达式非常方便,但它最合适的使用场景是简单的布尔操作或字符串拼接。如果涉及更复杂的逻辑,你应该使用计算属性。

计算属性是用来声明式的描述一个值依赖了其它的值。当你在模板里把数据绑定到一个计算属性上时,Vue 会在其依赖的任何值导致该计算属性改变时更新 DOM。这个功能非常强大,它可以让你的代码更加声明式、数据驱动并且易于维护。

通常情况下,使用计算属性会比使用过程式的$watch回调更合适。比如下面的例子:

<div id="demo">{{fullName}}</div>
var vm = new Vue({
data: {
firstName: 'Foo',
lastName: 'Bar',
fullName: 'Foo Bar'
}
})
vm.$watch('firstName', function (val) {
this.fullName = val + ' ' + this.lastName
})
vm.$watch('lastName', function (val) {
this.fullName = this.firstName + ' ' + val
})

上面的代码是过程式的,并且比较笨重。对比一下计算属性的版本:

var vm = new Vue({
el:'#demo',
data: {
firstName: 'Foo',
lastName: 'Bar'
},
computed: {
fullName: function () {
return this.firstName + ' ' + this.lastName
}
}
})

是不是感觉好多了?另外,你还可以为计算属性提供一个 setter:

computed: {
fullName: {
// getter
get: function () {
return this.firstName + ' ' + this.lastName
},
// setter
set: function (newValue) {
var names = newValue.split(' ')
this.firstName = names[0]
this.lastName = names[names.length - 1]
}
}
}

计算属性缓存

在 0.12.8 之前,计算属性仅仅体现为一个取值的行为 —— 每次你访问它的时候,getter 都会重新求值。在 0.12.8 中对此做了改进 —— 计算属性的值会被缓存,只有在其某个反应依赖改变才会重新计算。

设想我们有一个开销很大的计算属性 A,它需要循环一个大数组并且完成很多运算。并且我们还有一个依赖 A 的计算属性。如果没有缓存,我们对 A 的 getter 不必要的过度调用就会导致潜在的性能问题。而有了缓存,A 的值会被缓存起来,除非其依赖发生了变化,这样访问它再多次也不会导致大量的不必要运算了。

然而,我们还是应该理解什么会被视为“反应式依赖”:

var vm = new Vue({
data: {
msg: 'hi'
},
computed: {
example: {
return Date.now() + this.msg
}
}
})

在上面的例子中,计算属性依赖 vm.msg。因为这是一个在 Vue 实例中被观察的数据属性,那么它就被视为了一个反应式依赖。无论何时 vm.msg 改变,vm.example 的值都会被重新计算。
然而,Date.now()并不是反应式依赖,因为它没有和 Vue 的数据观察系统发生任何关系。因此,当你在程序中访问vm.example时,你会发现除非vm.msg触发了一次重新计算,否则时间戳始终是相同的值。

有的时候你需要保留简单获取数据的模式,每次你访问 vm.example 的时候都希望触发重新计算。从 0.12.11 开始,你可以为一个特殊的计算属性开关缓存支持:

computed: {
example: {
cache: false,
get: function () {
return Date.now() + this.msg
}
}
}

现在,每次你访问 vm.example 的时候,时间戳都会及时更新。然而,要注意这只发生在 JavaScript 程序内部访问的时候,数据绑定还是依赖驱动的。当你在模板中绑定一个 {{example}} 的计算属性时,DOM 只会在反应式依赖改变时才会更新。

以上所述是小编给大家介绍的Vue.js教程之计算属性,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jquery 学习之一 对象访问
Nov 23 Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
Sep 05 Javascript
JS组件系列之Bootstrap Icon图标选择组件
Jan 28 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
Oct 30 Javascript
微信小程序 wxapp画布 canvas详细介绍
Oct 31 Javascript
jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承
Dec 06 Javascript
微信小程序实现缓存根据不同的id来进行设置和读取缓存
Jun 12 Javascript
Vue AST源码解析第一篇
Jul 19 Javascript
微信小程序实现上传图片功能
May 28 Javascript
在vue中给列表中的奇数行添加class的实现方法
Sep 05 Javascript
小程序server请求微信服务器超时的解决方法
May 21 Javascript
vue.js封装switch开关组件的操作
Oct 26 Javascript
JS控制TreeView的结点选择
Nov 11 #Javascript
node+express制作爬虫教程
Nov 11 #Javascript
html中鼠标滚轮事件onmousewheel的处理方法
Nov 11 #Javascript
Angularjs中的页面访问权限怎么设置
Nov 11 #Javascript
jquery.multiselect多选下拉框实现代码
Nov 11 #Javascript
通过扫描二维码打开app的实现代码
Nov 10 #Javascript
用JS动态设置CSS样式常见方法小结(推荐)
Nov 10 #Javascript
You might like
php 数组的一个悲剧?
2011/05/11 PHP
php实现查看邮件是否已被阅读的方法
2013/12/03 PHP
php截取中文字符串不乱码的方法
2013/12/25 PHP
在Mac上编译安装PHP7的开发环境
2015/07/28 PHP
Yii2中简单的场景使用介绍
2017/06/02 PHP
PHP中md5()函数的用法讲解
2019/03/30 PHP
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
2015/10/13 Javascript
通过Tabs方法基于easyUI+bootstrap制作工作站
2016/03/28 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
2016/12/08 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
2016/12/29 Javascript
详解Vue组件实现tips的总结
2017/11/01 Javascript
JQuery选中select组件被选中的值方法
2018/03/08 jQuery
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
Python脚本实现12306火车票查询系统
2016/09/30 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
Python实现二维数组输出为图片
2018/04/03 Python
python使用openpyxl库修改excel表格数据方法
2018/05/03 Python
pandas读取CSV文件时查看修改各列的数据类型格式
2019/07/07 Python
Python3的unicode编码转换成中文的问题及解决方案
2019/12/10 Python
Python timer定时器两种常用方法解析
2020/01/20 Python
Pytorch环境搭建与基本语法
2020/06/03 Python
python和C++共享内存传输图像的示例
2020/10/27 Python
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
编程实现当输入某产品代码则打印出该产品记录的功能
2014/05/03 面试题
介绍下java.util.Arrays类
2012/10/16 面试题
服装设计行业个人的自我评价
2013/12/20 职场文书
商务助理求职信范文
2014/04/20 职场文书
2014幼儿园教育教学工作总结
2014/12/17 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
单位考核鉴定意见
2015/06/05 职场文书
2015年音乐教研组工作总结
2015/07/22 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
三十年再续同学情倡议书
2019/11/27 职场文书