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 相关文章推荐
extjs 学习笔记(一) 一些基础知识
Oct 13 Javascript
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
Dec 28 Javascript
Ajax搜索结果页面下方的分页按钮的生成
Apr 05 Javascript
jQuery事件绑定与解除绑定实现方法
Apr 15 Javascript
你所未知的3种Node.js代码优化方式
Feb 25 Javascript
JS简单获取及显示当前时间的方法
Aug 03 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
Sep 01 Javascript
详解Vue快速零配置的打包工具——parcel
Jan 16 Javascript
Vue的事件响应式进度条组件实例详解
Feb 04 Javascript
JSON生成Form表单的方法示例
Nov 21 Javascript
JS一次前端面试经历记录
Mar 19 Javascript
vue项目查看vue版本及cli版本的实现方式
Oct 24 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加密解密的代码
2007/07/16 PHP
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
2008/11/18 PHP
PHP 抓取网页图片并且另存为的实现代码
2010/03/24 PHP
Mac OS下配置PHP+MySql环境
2015/02/25 PHP
php微信公众号开发之二级菜单
2018/10/20 PHP
Laravel 修改验证异常的响应格式实例代码详解
2020/05/25 PHP
js url传值中文乱码之解决之道
2009/11/20 Javascript
解决JS中乘法的浮点错误的方法
2014/01/03 Javascript
iframe窗口高度自适应的实现方法
2014/01/08 Javascript
jquery右下角自动弹出可关闭的广告层
2015/05/08 Javascript
浅谈javascript中replace()方法
2015/11/10 Javascript
JavaScript ParseFloat()方法
2015/12/18 Javascript
2016年最热门的15 款代码语法高亮工具,美化你的代码
2016/01/06 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
原生JS改变透明度实现轮播效果
2017/03/24 Javascript
angularjs的select使用及默认选中设置
2017/04/08 Javascript
微信小程序组件 marquee实例详解
2017/06/23 Javascript
使用JS中的Replace()方法遇到的问题小结
2017/10/20 Javascript
webpack 单独打包指定JS文件的方法
2018/02/22 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
微信小程序实现打开并下载服务器上面的pdf文件到手机
2019/09/20 Javascript
[06:07]辉夜杯现场观众互动 “比谁远送显示器”
2015/12/26 DOTA
利用python代码写的12306订票代码
2015/12/20 Python
numpy.std() 计算矩阵标准差的方法
2018/07/11 Python
Python简单获取二维数组行列数的方法示例
2018/12/21 Python
正则给header的冒号两边参数添加单引号(Python请求用)
2019/08/09 Python
Python实现微信好友的数据分析
2019/12/16 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
HTML5、Select下拉框右边加图标的实现代码(增进用户体验)
2017/10/16 HTML / CSS
html5的pushstate以及监听浏览器返回事件的实现
2020/08/11 HTML / CSS
企划主管岗位职责
2013/12/12 职场文书
销售业务员岗位职责
2014/01/29 职场文书
求职信内容怎么写
2014/05/26 职场文书
2014年材料员工作总结
2014/11/19 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
python实现A*寻路算法
2021/06/13 Python