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判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
Jan 23 Javascript
js中substring和substr的详细介绍与用法
Aug 29 Javascript
javascript中JSON.parse()与eval()解析json的区别
May 19 Javascript
jquery遍历标签中自定义的属性方法
Sep 17 Javascript
javascript中BOM基础知识总结
Feb 14 Javascript
微信小程序日历组件calendar详解及实例
Jun 08 Javascript
vue.js国际化 vue-i18n插件的使用详解
Jul 07 Javascript
js核心基础之构造函数constructor用法实例分析
May 11 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
Jun 24 Javascript
JavaScript如何借用构造函数继承
Nov 06 Javascript
JS实现水平移动与垂直移动动画
Dec 19 Javascript
jQuery+ajax实现文件上传功能
Dec 22 jQuery
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+jQuery 注册模块的改进(一):验证码存入SESSION
2014/10/14 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
2016/02/22 PHP
云网广告中的代码,提示出错,大家找找
2006/11/21 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
JS生成随机字符串的多种方法
2014/06/10 Javascript
jQuery中:lt选择器用法实例
2014/12/29 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
2016/04/03 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
前端天气插件tpwidget使用方法详解
2019/06/24 Javascript
Vue.js递归组件实现组织架构树和选人功能案例分析
2019/07/03 Javascript
Vuex,iView UI面包屑导航使用扩展详解
2019/11/04 Javascript
Vue页面切换和a链接的本质区别详解
2019/11/12 Javascript
JS实现移动端双指缩放和旋转方法
2019/12/13 Javascript
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
python采集博客中上传的QQ截图文件
2014/07/18 Python
python随机生成指定长度密码的方法
2015/04/04 Python
Fiddler如何抓取手机APP数据包
2016/01/22 Python
浅谈Python爬取网页的编码处理
2016/11/04 Python
Django Rest framework权限的详细用法
2019/07/25 Python
Python获取时间戳代码实例
2019/09/24 Python
Python GUI库Tkiner使用方法代码示例
2020/11/27 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
Giglio英国站:意大利奢侈品购物网
2018/03/06 全球购物
俄罗斯马克西多姆家居用品网上商店:Максидом
2020/02/06 全球购物
JSF界面控制层技术
2013/06/17 面试题
大学生求职简历的自我评价
2013/10/14 职场文书
中学生学雷锋活动心得体会
2014/03/10 职场文书
优秀班集体先进事迹材料
2014/05/28 职场文书
2014年计生协会工作总结
2014/11/21 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
MyBatis配置文件解析与MyBatis实例演示
2022/04/07 Java/Android
使用Postman测试需要授权的接口问题
2022/06/21 Java/Android