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基础框架浅入剖析
Dec 27 Javascript
利用JS解决ie6不支持max-width,max-height问题的方法
Jan 02 Javascript
JQuery性能优化的几点建议
May 14 Javascript
PHP 数组current和next用法分享
Mar 05 Javascript
C#中使用迭代器处理等待任务
Jul 13 Javascript
jQuery实现垂直半透明手风琴特效代码分享
Aug 21 Javascript
JavaScript判断按钮被点击的方法
Dec 13 Javascript
jQuery+css实现炫目的动态块漂移效果
Jan 28 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
Dec 16 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
Dec 22 Javascript
微信小程序中悬浮窗功能的实现代码
Aug 02 Javascript
VUE前后端学习tab写法实例
Aug 06 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 $_SERVER相关参数判断是否支持Rewrite模块
2013/09/26 PHP
curl和libcurl的区别简介
2015/07/01 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
PHP递归算法的简单实例
2019/02/28 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
用JavaScrpt实现文件夹简单轻松加密的实现方法图文
2008/09/08 Javascript
flexigrid 类似ext grid的JS表格代码
2010/07/17 Javascript
jQuery动态设置form表单的enctype值(实现代码)
2013/07/04 Javascript
javascript实现复制与粘贴操作实例
2014/10/16 Javascript
JS实现的车标图片提示效果代码
2015/10/10 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
详解AngularJS中module模块的导入导出
2015/12/10 Javascript
js轮播图代码分享
2016/07/14 Javascript
使用Curl命令查看请求响应时间方法
2016/11/04 Javascript
JQuery 动态生成Table表格实例代码
2016/12/02 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
vuejs使用FormData实现ajax上传图片文件
2017/08/08 Javascript
3种vue路由传参的基本模式
2018/02/22 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
2018/12/06 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
[01:02:32]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第二场 2月26日
2021/03/11 DOTA
wxPython窗口的继承机制实例分析
2014/09/28 Python
python3的输入方式及多组输入方法
2018/10/17 Python
把pandas转换int型为str型的方法
2019/01/29 Python
面向对象学习之pygame坦克大战
2019/09/11 Python
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
美国在线精品家居网站:Burke Decor
2017/04/12 全球购物
Elemental Herbology官网:英国美容品牌
2019/04/27 全球购物
应届生人事助理求职信
2013/11/09 职场文书
请假条标准格式规范
2014/04/10 职场文书
2015年幼儿园班主任个人工作总结
2015/10/22 职场文书
聊聊Python String型列表求最值的问题
2022/01/18 Python
Go语言grpc和protobuf
2022/04/13 Golang
SQL SERVER中的流程控制语句
2022/05/25 SQL Server