最近在开发vue的过程中,不断用到了计算属性(computed)和观察者(watch),从逻辑上感觉它们很相似,但是尝试混用它们的时候,又出现了一些问题,那么它们到底有什么异同呢?

1. computed VS data
问计算属性与观察者异同这个问题之前,首先要明确为啥会有计算属性,即computed vs data。在vue中,数据有时有被处理一下再展示出来的需求,例如:


var vm = new Vue({
el: '#example',
data: {
message: 'Hello',
name: 'tomczhang'
},
computed: {
// 计算属性的 getter
reversedMessage: function () {
// `this` 指向 vm 实例
return this.message.split('').reverse().join('')
},
getWelcome: function () {
return this.message + ' ' + this.name
}
}
})

不管是reversedMessage还是getWelcome方法,单纯写在data中都显得很不优雅,所以,建立一个computed动态的去处理它们是很有必要的。

2. watch VS data
既然vue中数据和view是双向绑定的,那当用户输入文本的时候,vue就能监听到视图进行了变动,并将变动的数据传递给我们(具体的变动原理见此)。观察者就是系统监听到视图变动后调用的方法,参数分别是老的值和新的值。我们利用watch就可以改变data值。例如:


var vm = new Vue({
el: '#demo',
watch: {
userInput: function (oldValue, newValue) {
this.message = newValue;
}
}
})

当然我们针对例子1中的代码也可以用观察者来解决,这也是我写这篇文章的主因,像这样:


var vm = new Vue({
el: '#example',
data: {
message: 'Hello',
name: 'tomczhang',
welcome: ''
},
watch: {
welcome: function () {
this.welcome = this.message + ' ' + this.name;
}
}
})

3. computed vs watch
BB了那么多,马上进入我们的正题。

相同: computed和watch都起到监听/依赖一个数据,并进行处理的作用
异同:它们其实都是vue对监听器的实现,只不过computed主要用于对同步数据的简单处理,watch则主要用于数据输入时异步操作或者开销较大的情况。能用computed的时候优先用computed,避免了多个数据影响其中某个数据时多次调用watch的尴尬情况。对于视图层的改变则优先使用watch。

例如这样:


var vm = new Vue({
el: '#demo',
data: {
firstName: 'Foo',
lastName: 'Bar',
fullName: 'Foo Bar'
},
watch: {
firstName: function (val) {
this.fullName = val + ' ' + this.lastName
},
lastName: function (val) {
this.fullName = this.firstName + ' ' + val
}
}
})

相应的computed版本


var vm = new Vue({
el: '#demo',
data: {
firstName: 'Foo',
lastName: 'Bar'
},
computed: {
fullName: function () {
return this.firstName + ' ' + this.lastName
}
}
})

参考:
1)计算属性和观察者:https://cn.vuejs.org/v2/guide...

原文地址:https://segmentfault.com/a/1190000012656519

最新文章

  1. mysql启动失败:不能创建pid文件
  2. requirejs:模块加载(require)及定义(define)时的路径小结
  3. android 单元测试
  4. tensorflow资料补充(很棒)
  5. [译]Mongoose指南 - Connection
  6. Uva 548 Tree
  7. DBSet Class(EF基础系列11)
  8. Android布局居中的几种做法
  9. Matlab生成.dll文件在.NET中加载失败与平台的关系及解决方案
  10. HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)
  11. SDL显示内存中的图像
  12. php 模拟POST提交的2种方法
  13. [转]makefile文件的编写规则及实例
  14. Chapter 1 First Sight——7
  15. 非常好用的弹出层 layer,常用功能demo,快速上手!
  16. nodejs-2.httpfuwu
  17. Day 15 模块
  18. CentOS安装glibc异常Protected multilib versions
  19. JavaScript 下拉框 左边添加至右边
  20. JMeter http(s)测试脚本录制器的使用

热门文章

  1. (转载) Android两个子线程之间通信
  2. QT笔记 -- (3) 为QLabel添加鼠标响应方法1
  3. ActiveMQ学习笔记(13)----Destination高级特性(一)
  4. ftp上传下载文件
  5. 【BZOJ 1260】[CQOI2007]涂色paint
  6. POJ——T 3020 Antenna Placement
  7. Android 获取麦克风的音量(分贝)
  8. jquery-easyui的datagrid在checkbox多选时,行选中不正确应,去除高亮的解决方法
  9. Codeforces Round #271 (Div. 2) 解题报告
  10. 公布Qt Widgets桌面应用程序的方法