一 用法区别
- computed
<div id="example">
<p>Original message: "{{ message }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
var vm = new Vue({
el: '#example',
data: {
message: 'Hello'
},
computed: {
reversedMessage: function () {
return this.message.split('').reverse().join('')
}
}
})
var vm = new Vue({
data: { a: 1 },
computed: {
aDouble: function () {
return this.a * 2
},
aPlus: {
get: function () {
return this.a + 1
},
set: function (v) {
this.a = v - 1
}
}
}
})
vm.aPlus
vm.aPlus = 3
vm.a
vm.aDouble
- watch
<div id="demo">{{ fullName }}</div>
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
}
}
})
var vm = new Vue({
data: {
a: 1,
b: 2,
c: 3,
d: 4,
e: {
f: {
g: 5
}
}
},
watch: {
a: function (val, oldVal) {
console.log('new: %s, old: %s', val, oldVal)
},
b: 'someMethod',
c: {
handler: function (val, oldVal) { },
deep: true
},
d: {
handler: 'someMethod',
immediate: true
},
e: [
'handle1',
function handle2 (val, oldVal) { },
{
handler: function handle3 (val, oldVal) { },
}
],
'e.f': function (val, oldVal) { }
}
})
vm.a = 2
二 概念区别
- computed是计算属性的意思,watch是监听的意思。
- 一般来说,若一个数据依赖于其他数据,那么把这个数据设计为computed的。computed是用来计算出一个值得,这个值调用的时候不需要加括号,可以当属性一样用;它会根据依赖自动缓存,如果依赖不变,computed的值就不会再重新计算。
- 如果需要在某个数据变化时做一些事情,使用watch来观察这个数据的变化。watch是用来监听的,有两个选项,一个是immediate,表示是否在第一次渲染的时候执行这个函数,第二个叫deep,表示是否监听对象里面的属性是否变化。不应该使用箭头函数来定义 watch 函数 (例如 searchQuery: newValue => this.updateAutocomplete(newValue))。理由是箭头函数绑定了父级作用域的上下文,所以 this 将不会按照期望指向 Vue 实例。