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 相关文章推荐
JavaScript delete操作符应用实例
Jan 13 Javascript
form表单中去掉默认的enter键提交并绑定js方法实现代码
Apr 01 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
Feb 25 Javascript
js生成随机数的方法实例
Oct 16 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
Mar 27 Javascript
利用纯js + transition动画实现移动端web轮播图详解
Sep 10 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
Mar 05 Javascript
vue 解决循环引用组件报错的问题
Sep 06 Javascript
bootstrap table实现合并单元格效果
Dec 24 Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
May 13 jQuery
如何使用jQuery操作Cookies方法解析
Sep 08 jQuery
antd-DatePicker组件获取时间值,及相关设置方式
Oct 27 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 MYSQL乱码问题,使用SET NAMES utf8校正
2009/11/30 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
2013/07/01 PHP
php计算给定时间之前的函数用法实例
2015/04/03 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
jQuery中width()方法用法实例
2014/12/24 Javascript
js实现动画特效的文字链接鼠标悬停提示的方法
2015/03/02 Javascript
ReactNative短信验证码倒计时控件的实现代码
2017/07/20 Javascript
解决微信二次分享不显示摘要和图片的问题
2017/08/18 Javascript
JavaScript适配器模式详解
2017/10/19 Javascript
微信小程序数据存储与取值详解
2018/01/30 Javascript
使用ESLint禁止项目导入特定模块的方法步骤
2019/03/04 Javascript
深入Node TCP模块的理解
2019/03/13 Javascript
微信小程序返回上一级页面的实现代码
2020/06/19 Javascript
js+canvas实现五子棋小游戏
2020/08/02 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python中的列表推导浅析
2014/04/26 Python
Python利用前序和中序遍历结果重建二叉树的方法
2016/04/27 Python
Pandas之drop_duplicates:去除重复项方法
2018/04/18 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
分享PyCharm的几个使用技巧
2019/11/10 Python
Flask缓存静态文件的具体方法
2020/08/02 Python
CSS伪类与CSS伪元素的区别及由来具体说明
2012/12/07 HTML / CSS
CSS3实现文字波浪线效果示例代码
2016/11/20 HTML / CSS
美国小蜜蜂Burt’s Bees德国官网:天然唇部、皮肤和身体护理产品
2020/06/14 全球购物
什么是Linux虚拟文件系统VFS
2015/08/25 面试题
优秀社区干部事迹材料
2014/02/03 职场文书
企业法人授权委托书
2014/09/25 职场文书
2014年乡镇卫生院工作总结
2014/11/24 职场文书
不同意离婚代理词
2015/05/23 职场文书
国庆节主题班会
2015/08/15 职场文书
田径运动会广播稿
2015/08/19 职场文书
PyQt5实现多张图片显示并滚动
2021/06/11 Python
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android
MySQL中datetime时间字段的四舍五入操作
2021/10/05 MySQL
mysql的数据压缩性能对比详情
2021/11/07 MySQL