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 相关文章推荐
javascript操作文本框readOnly
May 15 Javascript
可实现多表单提交的javascript函数
Aug 01 Javascript
jquery ajax 简单范例(界面+后台)
Nov 19 Javascript
Html5的placeholder属性(IE兼容)实现代码
Aug 30 Javascript
node.js中的path.extname方法使用说明
Dec 09 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
May 08 Javascript
使用vue + less 实现简单换肤功能的示例
Feb 21 Javascript
4个顶级开源JavaScript图表库
Sep 29 Javascript
详解如何用typescript开发koa2的二三事
Nov 13 Javascript
jqGrid表格底部汇总、合计行footerrow处理
Aug 21 Javascript
vue+koa2实现session、token登陆状态验证的示例
Aug 30 Javascript
vue实现无缝轮播效果(跑马灯)
May 14 Vue.js
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 读取文件乱码问题
2010/02/20 PHP
php is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
php时间戳转换的示例
2014/03/31 PHP
ThinkPHP3.1新特性之内容解析输出详解
2014/06/19 PHP
Codeigniter的dom类用法实例
2015/06/26 PHP
php数组分页实现方法
2016/04/30 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
不用锚点也可以平滑滚动到页面的指定位置实现代码
2013/05/08 Javascript
如何防止回车(enter)键提交表单
2014/05/11 Javascript
禁止按回车键提交表单的方法
2015/06/11 Javascript
JavaScript中的对象与JSON
2015/07/03 Javascript
JS实现超精简响应鼠标显示二级菜单代码
2015/09/12 Javascript
AngularJS单选框及多选框实现双向动态绑定
2016/01/13 Javascript
Javascript实现的StopWatch功能示例
2017/06/13 Javascript
深入理解vue Render函数
2017/07/19 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
2017/08/31 Javascript
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
生产制造追溯系统之在线打印功能
2019/06/03 Javascript
UEditor 自定义图片视频尺寸校验功能的实现代码
2020/10/20 Javascript
[02:32]DOTA2完美大师赛场馆静安体育中心观赛全攻略
2017/11/08 DOTA
利用django如何解析用户上传的excel文件
2017/07/24 Python
利用python实现简单的邮件发送客户端示例
2017/12/23 Python
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
实时获取Python的print输出流方法
2019/01/07 Python
Python多线程及其基本使用方法实例分析
2019/10/29 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
HTML5: Web 标准最巨大的飞跃
2008/10/17 HTML / CSS
canvas与html5实现视频截图功能示例
2016/12/15 HTML / CSS
超市优秀员工事迹材料
2014/05/01 职场文书
承诺书格式
2014/06/03 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
小学重阳节活动总结
2015/03/24 职场文书