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之十一 添加事件核心方法
Jul 31 Javascript
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
Oct 11 Javascript
Mac地址验证的javascript代码
Nov 09 Javascript
调用jQuery滑出效果时闪烁的解决方法
Mar 27 Javascript
自己使用js/jquery写的一个定制对话框控件
May 02 Javascript
Python脚本后台运行的几种方式
Mar 09 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
Apr 06 Javascript
JS奇技之利用scroll来监听resize详解
Jun 15 Javascript
在Vue中使用axios请求拦截的实现方法
Oct 25 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
Dec 03 Javascript
JQuery实现ajax请求的示例和注意事项
Dec 10 jQuery
JS中如何优雅的使用async await详解
Oct 05 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
用mysql触发器自动更新memcache的实现代码
2009/10/11 PHP
php下载excel无法打开的解决方法
2013/12/24 PHP
PHP7实现和CryptoJS的AES加密方式互通示例【AES-128-ECB加密】
2019/06/08 PHP
uploadify 3.0 详细使用说明
2012/06/18 Javascript
jquery多行滚动/向左或向上滚动/响应鼠标实现思路及代码
2013/01/23 Javascript
jquery根据锚点offset值实现动画切换
2014/09/11 Javascript
javascript实现类似百度分享功能的方法
2015/07/27 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
JS简单实现tab切换效果的多窗口显示功能
2016/09/07 Javascript
input框中的name和id的区别
2016/11/16 Javascript
JS扩展类,克隆对象与混合类实例分析
2016/11/26 Javascript
用jQuery.ajaxSetup实现对请求和响应数据的过滤
2016/12/20 Javascript
Angular 2父子组件之间共享服务通信的实现
2017/07/04 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
小程序实现列表删除功能
2018/10/30 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
2019/03/04 Javascript
JavaScript实现前端倒计时效果
2021/02/09 Javascript
[01:28:24]NAVI vs VG Supermajor 败者组 BO3 第三场 6.5
2018/06/06 DOTA
python发送邮件功能实现代码
2016/07/15 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
2017/12/14 Python
Python内置函数reversed()用法分析
2018/03/20 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
Python 获取项目根路径的代码
2019/09/27 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
2020/03/01 Python
使用PyCharm安装pytest及requests的问题
2020/07/31 Python
拿来就用!Python批量合并PDF的示例代码
2020/08/10 Python
详解python 支持向量机(SVM)算法
2020/09/18 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
英国最受欢迎的价格比较网站之一:MoneySuperMarket
2018/12/19 全球购物
Farfetch台湾官网:奢侈品牌时尚购物平台
2019/06/17 全球购物
weblogic面试题
2016/03/07 面试题
动态密码技术
2012/10/18 面试题
班委竞选演讲稿
2014/04/28 职场文书
关于springboot配置druid数据源不生效问题(踩坑记)
2021/09/25 Java/Android
Python保存并浏览用户的历史记录
2022/04/29 Python