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在IE和FireFox中的不同表现简析
Dec 03 Javascript
js控制web打印(局部打印)方法整理
May 29 Javascript
JavaScript实现99乘法表及隔行变色实例代码
Feb 24 Javascript
JS、jQuery中select的用法详解
Apr 21 Javascript
Javascript OOP之面向对象
Jul 31 Javascript
JavaScript省市区三级联动菜单效果
Sep 21 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
Nov 16 Javascript
javascript如何用递归写一个简单的树形结构示例
Sep 06 Javascript
VUE2实现事件驱动弹窗示例
Oct 21 Javascript
Node之简单的前后端交互(实例讲解)
Nov 14 Javascript
vue+express 构建后台管理系统的示例代码
Jul 19 Javascript
我所理解的JavaScript中的this指向
Sep 04 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/06/30 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
php正则表达式基本知识与应用详解【经典教程】
2017/04/17 PHP
PHP编程获取各个时间段具体时间的方法
2017/05/26 PHP
自写的jQuery异步加载数据添加事件
2014/05/15 Javascript
bootstrap data与jquery .data
2014/07/07 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
Bootstrap栅格系统学习笔记
2016/11/25 Javascript
原生JS中slice()方法和splice()区别
2017/03/06 Javascript
js封装成插件的步骤方法
2017/09/11 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
2017/09/30 Javascript
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
微信小程序如何调用新闻接口实现列表循环
2019/07/02 Javascript
JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】
2020/05/23 Javascript
JavaScript实现原型封装轮播图
2020/12/27 Javascript
[02:07]DOTA2新英雄展现中国元素,完美“圣典”亮相央视
2016/12/19 DOTA
详解python单例模式与metaclass
2016/01/15 Python
wxPython的安装图文教程(Windows)
2017/12/28 Python
Python基于百度云文字识别API
2018/12/13 Python
Python3.6.x中内置函数总结及讲解
2019/02/22 Python
利用Python查看微信共同好友功能的实现代码
2019/04/24 Python
Python的互斥锁与信号量详解
2019/09/12 Python
python可视化实现KNN算法
2019/10/16 Python
python matplotlib实现将图例放在图外
2020/04/17 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
2020/04/21 Python
使用K.function()调试keras操作
2020/06/17 Python
为您的家、后院、车库等在线购物:Spreetail
2019/06/17 全球购物
WSDL的操作类型主要有几种
2013/07/19 面试题
政府法律服务方案
2014/06/14 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
小学课外阅读总结
2014/07/09 职场文书
财务人员个人工作总结
2015/02/27 职场文书
教你快速开启Apache SkyWalking的自监控
2021/04/25 Servers
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers
Python利用Turtle绘制哆啦A梦和小猪佩奇
2022/04/04 Python