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 相关文章推荐
jQuery 1.0.4 - New Wave Javascript(js源文件)
Jan 15 Javascript
javascript 限制输入脚本大全
Nov 03 Javascript
使用变量动态设置js的属性名
Oct 19 Javascript
Javascript中的方法链(Method Chaining)介绍
Mar 15 Javascript
简介BootStrap model弹出框的使用
Apr 27 Javascript
Jqprint实现页面打印
Jan 06 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
Mar 04 Javascript
解析Vue2 dist 目录下各个文件的区别
Nov 22 Javascript
微信小程序form表单组件示例代码
Jul 15 Javascript
JavaScript实现旋转木马轮播图
Mar 16 Javascript
Vue路由切换页面不更新问题解决方案
Jul 10 Javascript
Javascript如何实现扩充基本类型
Aug 26 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
一个php作的文本留言本的例子(六)
2006/10/09 PHP
PHP 字符串操作入门教程
2006/12/06 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
2008/12/02 Javascript
编写Js代码要注意的几条规则
2010/09/10 Javascript
Jquery插件之多图片异步上传
2010/10/20 Javascript
javascript中match函数的用法小结
2014/02/08 Javascript
js分页代码分享
2014/04/28 Javascript
JQuery调用绑定click事件的3种写法
2015/03/28 Javascript
基于jquery实现的树形菜单效果代码
2015/09/06 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
2016/10/12 Javascript
动态加载css方法实现和深入解析
2017/01/18 Javascript
JS 实现随机验证码功能
2017/02/15 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
jQuery+ajax实现动态添加表格tr td功能示例
2018/04/23 jQuery
vue.draggable实现表格拖拽排序效果
2018/12/01 Javascript
Python中字符串格式化str.format的详细介绍
2017/02/17 Python
详解PyTorch批训练及优化器比较
2018/04/28 Python
Tensorflow 查看变量的值方法
2018/06/14 Python
Python 给屏幕打印信息加上颜色的实现方法
2019/04/24 Python
Python的对象传递与Copy函数使用详解
2019/12/26 Python
TensorFlow基本的常量、变量和运算操作详解
2020/02/03 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
年级组长自我鉴定
2014/02/22 职场文书
军训口号
2014/06/13 职场文书
课外小组活动总结
2014/08/27 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
乔迁之喜答谢词
2015/01/05 职场文书
2015年预算员工作总结
2015/05/14 职场文书
2015年学校财务工作总结
2015/05/19 职场文书
暑期工社会实践报告
2015/07/13 职场文书
庆七一活动简报
2015/07/20 职场文书
2016继续教育研修日志
2015/11/13 职场文书
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL
MySQL视图概念以及相关应用
2022/04/19 MySQL