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 简短几句代码实现给元素动态添加及获取提示信息
Sep 01 Javascript
基于JQuery 选择器使用说明介绍
Apr 18 Javascript
javascript模拟地球旋转效果代码实例
Dec 02 Javascript
利用javascript实现全部删或清空所选的操作
May 27 Javascript
jQuery使用post方法提交数据实例
Mar 25 Javascript
解决js函数闭包内存泄露问题的办法
Jan 25 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
Mar 22 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
Aug 20 Javascript
Angular-Ui-Router+ocLazyLoad动态加载脚本示例
Mar 02 Javascript
ES6入门教程之let和const命令详解
May 17 Javascript
基于twbsPagination.js分页插件使用心得(分享)
Oct 21 Javascript
vue-resource 拦截器interceptors使用详解
Jan 18 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个人网站架设连环讲(二)
2006/10/09 PHP
php目录操作函数之获取目录与文件的类型
2010/12/29 PHP
pdo中使用参数化查询sql
2011/08/11 PHP
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
Javascript 个人笔记(没有整理,很乱)
2007/07/07 Javascript
复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题
2010/06/21 Javascript
jquery如何把数组变为字符串传到服务端并处理
2014/04/30 Javascript
JavaScript通过元素索引号删除数组中对应元素的方法
2015/03/18 Javascript
JS控制伪元素的方法汇总
2016/04/06 Javascript
AngularJS指令中的绑定策略实例分析
2016/12/14 Javascript
Javascript中的神器——Promise
2017/02/08 Javascript
浅谈Vue.js
2017/03/02 Javascript
vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
2017/04/22 Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
2018/10/24 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
2019/02/25 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
详解Vue路由自动注入实践
2019/04/17 Javascript
Vue 中 filter 与 computed 的区别与用法解析
2019/11/21 Javascript
vue自定义组件(通过Vue.use()来使用)即install的用法说明
2020/08/11 Javascript
基于numpy.random.randn()与rand()的区别详解
2018/04/17 Python
python读取LMDB中图像的方法
2018/07/02 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
2018/07/04 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
python将控制台输出保存至文件的方法
2019/01/07 Python
python 中如何获取列表的索引
2019/07/02 Python
python 视频逐帧保存为图片的完整实例
2019/12/10 Python
python 日志 logging模块详细解析
2020/03/31 Python
pycharm最新激活码有效期至2100年(亲测可用)
2021/02/05 Python
HTML5中的强制下载属性download使用实例解析
2016/05/12 HTML / CSS
浅析数据存储的三种方式 cookie sessionstorage localstorage 的异同
2020/06/04 HTML / CSS
青年安全生产示范岗事迹材料
2014/05/04 职场文书
国庆节促销广告语2014
2014/09/19 职场文书
2015年上半年计生工作总结
2015/03/30 职场文书
信息技术课教学反思
2016/02/23 职场文书
Java后台生成图片的完整步骤
2021/08/04 Java/Android