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中的window.event.keyCode使用介绍
Apr 26 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
Oct 23 Javascript
js 鼠标移动显示图片的简单实例
Dec 25 Javascript
JS实现表格数据各种搜索功能的方法
Mar 03 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
Mar 13 Javascript
JS+DIV+CSS排版布局实现美观的选项卡效果
Oct 10 Javascript
原生js实现电商侧边导航效果
Jan 19 Javascript
Vue实例简单方法介绍
Jan 20 Javascript
js Canvas绘制圆形时钟教程
Feb 06 Javascript
JS判断用户用的哪个浏览器实例详解
Oct 09 Javascript
详解js删除数组中的指定元素
Oct 31 Javascript
vue  directive定义全局和局部指令及指令简写
Nov 20 Javascript
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
DC《小丑》11项提名领跑奥斯卡 Netflix成第92届奥斯卡提名最大赢家
2020/04/09 欧美动漫
PHP中实现进程间通讯
2006/10/09 PHP
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
2011/12/16 PHP
php获取YouTube视频信息的方法
2015/02/11 PHP
如何使用纯PHP实现定时器任务(Timer)
2015/07/31 PHP
用php+ajax新建流程(请假、进货、出货等)
2017/06/11 PHP
详解yii2使用多个数据库的案例
2017/06/16 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
测试你的JS的掌握程度的代码
2009/12/09 Javascript
jquery插件 cluetip 关键词注释
2010/01/12 Javascript
javascript错误的认识不用关心内存管理
2012/12/15 Javascript
根据json字符串生成Html的一种方式
2013/01/09 Javascript
JavaScript charCodeAt方法入门实例(用于取得指定位置字符的Unicode编码)
2014/10/17 Javascript
js实现漂浮回顶部按钮实例
2015/05/06 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
nodejs如何获取时间戳与时间差
2016/08/03 NodeJs
用Vue.js实现监听属性的变化
2016/11/17 Javascript
javascript判断回文数详解及实现代码
2017/02/03 Javascript
Vue2.0 vue-source jsonp 跨域请求
2017/08/04 Javascript
vue如何截取字符串
2019/05/06 Javascript
node中实现删除目录的几种方法
2019/06/24 Javascript
JavaScript中的相等操作符使用详解
2019/12/21 Javascript
jQuery实现简单全选框
2020/09/13 jQuery
pymongo中聚合查询的使用方法
2019/03/22 Python
Python基础知识点 初识Python.md
2019/05/14 Python
Python 音频生成器的实现示例
2019/12/24 Python
python生成word合同的实例方法
2021/01/12 Python
统计岗位职责
2014/02/21 职场文书
投资合作协议书
2014/04/17 职场文书
学雷锋标兵事迹材料
2014/08/18 职场文书
考研复习计划
2015/01/19 职场文书
七年级作文之冬景
2019/11/07 职场文书
vue+spring boot实现校验码功能
2021/05/27 Vue.js