Vue.js每天必学之计算属性computed与$watch


Posted in Javascript onSeptember 05, 2016

在模板中绑定表达式是非常便利的,但是它们实际上只用于简单的操作。模板是为了描述视图的结构。在模板中放入太多的逻辑会让模板过重且难以维护。这就是为什么 Vue.js 将绑定表达式限制为一个表达式。如果需要多于一个表达式的逻辑,应当使用**计算属性**。

 基础例子

<div id="example">
 a={{ a }}, b={{ b }}
</div>
var vm = new Vue({
 el: '#example',
 data: {
 a: 1
 },
 computed: {
 // 一个计算属性的 getter
 b: function () {
 // `this` 指向 vm 实例
 return this.a + 1
 }
 }
})

这里我们声明了一个计算属性 b。我们提供的函数将用作属性 vm.b的 getter。

console.log(vm.b) // -> 2
vm.a = 2
console.log(vm.b) // -> 3

你可以打开浏览器的控制台,修改 vm。vm.b 的值始终取决于 vm.a 的值。

你可以像绑定普通属性一样在模板中绑定计算属性。Vue 知道 vm.b 依赖于 vm.a,因此当 vm.a 发生改变时,依赖于 vm.b 的绑定也会更新。而且最妙的是我们是声明式地创建这种依赖关系:计算属性的 getter 是干净无副作用的,因此也是易于测试和理解的。

计算属性 vs. $watch

Vue.js 提供了一个方法 $watch,它用于观察 Vue 实例上的数据变动。当一些数据需要根据其它数据变化时, $watch 很诱人 —— 特别是如果你来自 AngularJS。不过,通常更好的办法是使用计算属性而不是一个命令式的 $watch 回调。考虑下面例子:

<div id="demo">{{fullName}}</div>

var vm = new Vue({
 el: '#demo',
 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({
 data: {
 firstName: 'Foo',
 lastName: 'Bar'
 },
 computed: {
 fullName: function () {
 return this.firstName + ' ' + this.lastName
 }
 }
})

这样更好,不是吗?

计算 setter

计算属性默认只是 getter,不过在需要时你也可以提供一个 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]
 }
 }
}
// ...

现在在调用 vm.fullName = 'John Doe' 时,setter 会被调用,vm.firstName 和 vm.lastName 也会有相应更新。

本文已被整理到了《Vue.js前端组件学习教程》,欢迎大家学习阅读。

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
node.js解决获取图片真实文件类型的问题
Dec 20 Javascript
angular.bind使用心得
Oct 26 Javascript
CSS或者JS实现鼠标悬停显示另一元素
Jan 22 Javascript
javascript 判断是否是微信浏览器的方法
Oct 09 Javascript
对javascript继承的理解
Oct 11 Javascript
基于canvas粒子系统的构建详解
Aug 31 Javascript
JS库之Particles.js中文开发手册及参数详解
Sep 13 Javascript
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
Feb 06 Javascript
使用vue-router切换页面时,获取上一页url以及当前页面url的方法
May 06 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
May 23 Javascript
JavaScript制作3D旋转相册
Aug 02 Javascript
jQuery实现小火箭返回顶部特效
Feb 03 jQuery
jQuery实现的导航下拉菜单效果示例
Sep 05 #Javascript
jquery层级选择器的实现(匹配后代元素div)
Sep 05 #Javascript
Vue.js每天必学之数据双向绑定
Sep 05 #Javascript
JS快速实现移动端拼图游戏
Sep 05 #Javascript
jQuery实现的tab标签切换效果示例
Sep 05 #Javascript
Vue.js每天必学之构造器与生命周期
Sep 05 #Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
Sep 05 #Javascript
You might like
php错误级别的设置方法
2013/06/17 PHP
dedecms集成财付通支付接口
2014/12/28 PHP
JavaScript中的一些定位属性[图解]
2010/07/14 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件
2011/12/21 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
JavaScript操作Cookie详解
2015/02/28 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
jQuery Ajax使用FormData对象上传文件的方法
2016/09/07 Javascript
JS前向后瞻正则表达式定义与用法示例
2016/12/27 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
jquery获取链接地址和跳转详解(推荐)
2017/08/15 jQuery
node.js自动上传ftp的脚本分享
2018/06/16 Javascript
详解JSON Web Token 入门教程
2018/07/30 Javascript
微信小程序实现笑脸评分功能
2018/11/03 Javascript
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
elementUI同一页面展示多个Dialog的实现
2020/11/19 Javascript
javascript实现移动端轮播图
2020/12/09 Javascript
12个步骤教你理解Python装饰器
2019/07/01 Python
Python上下文管理器全实例详解
2019/11/12 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
2021/03/03 Python
CSS3弹性伸缩布局之box布局
2016/07/12 HTML / CSS
HTML5 Canvas draw方法制作动画效果示例
2013/07/11 HTML / CSS
洲际酒店集团英国官网:IHG英国
2019/07/10 全球购物
Sandro法国官网:法国成衣品牌
2019/08/28 全球购物
清洁工表扬信
2014/01/08 职场文书
小学后勤管理制度
2014/01/14 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
2016年第十四个公民道德宣传日活动总
2016/04/01 职场文书
Python torch.flatten()函数案例详解
2021/08/30 Python
Python使用openpyxl模块处理Excel文件
2022/06/05 Python
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android