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 相关文章推荐
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
Mar 07 Javascript
javascript中日期转换成时间戳的小例子
Mar 21 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
Nov 26 Javascript
jquery 合并内容相同的单元格(示例代码)
Dec 13 Javascript
动态的9*9乘法表效果的实现代码
May 16 Javascript
你知道setTimeout是如何运行的吗?
Aug 16 Javascript
js判断checkbox是否选中个数的方法(超简单)
Aug 19 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
Nov 22 Javascript
bootstrap daterangepicker汉化以及扩展功能
Jun 15 Javascript
webpack学习教程之前端性能优化总结
Dec 05 Javascript
微信小程序实现左右列表联动
May 19 Javascript
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
Jul 30 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概率算法实例
2014/04/09 PHP
Swoole实现异步投递task任务案例详解
2019/04/02 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
大家未必知道的Js技巧收藏
2008/04/07 Javascript
JSON 数字排序多字段排序介绍
2013/09/18 Javascript
jquery给图片添加鼠标经过时的边框效果
2013/11/12 Javascript
动态加载jquery库的方法
2014/02/12 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
canvas实现爱心和彩虹雨效果
2017/03/09 Javascript
vue项目实战总结篇
2018/02/11 Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
2019/08/27 jQuery
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
JS实现百度搜索框关键字推荐
2020/02/17 Javascript
利用 JavaScript 实现并发控制的示例代码
2020/12/31 Javascript
分享给Python新手们的几道简单练习题
2017/09/21 Python
简单了解Django模板的使用
2017/12/20 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
Python continue继续循环用法总结
2018/06/10 Python
python实现Windows电脑定时关机
2018/06/20 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
python实现飞机大战微信小游戏
2020/03/21 Python
自定义django admin model表单提交的例子
2019/08/23 Python
Django自带日志 settings.py文件配置方法
2019/08/30 Python
Python算法的时间复杂度和空间复杂度(实例解析)
2019/11/19 Python
用Python去除图像的黑色或白色背景实例
2019/12/12 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
PyTorch实现重写/改写Dataset并载入Dataloader
2020/07/14 Python
Python内置函数property()如何使用
2020/09/01 Python
Python 2.6.6升级到Python2.7.15的详细步骤
2020/12/14 Python
wedgwood加拿大官网:1759年成立的英国国宝级陶瓷餐具品牌
2018/07/17 全球购物
《胡杨》教学反思
2014/02/16 职场文书
先进个人推荐材料
2014/12/29 职场文书
上甘岭观后感
2015/06/10 职场文书
大学宣传委员竞选稿
2015/11/19 职场文书
Python基础数据类型tuple元组的概念与用法
2021/08/02 Python
MySQL存储过程及语法详解
2022/08/05 MySQL