计算属性和侦听器
计算属性
例子
模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。
在模板中放入太多的逻辑会让模板过重且难以维护。
对于任何复杂逻辑,你都应当使用计算属性。
<div id="example">
<p>Original message: "{{ message }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
<!-- 自己引入cdn -->
<script type="text/javascript">
var vm = new Vue({
el: '#example',
data: {
message: 'Hello'
},
computed: {
// 计算属性的 getter
reversedMessage: function () {
// `this` 指向 vm 实例
return this.message.split('').reverse().join('')
}
}
})
</script>
console.log(vm.reversedMessage) // => ‘olleH’ vm.message = ‘Goodbye’
computed 和 methods
计算属性是基于它们的响应式依赖进行缓存的。
- 只在相关响应式依赖发生改变时它们才会重新求值。
- 只要
message
还没有发生改变,多次访问reversedMessage1
计算属性会立即返回之前的计算结果,而不必再次执行函数。- 而motheds中的方法每次访问都会执行一遍
computed: {
// 计算属性的 getter
reversedMessage1: function () {
// `this` 指向 vm 实例
return this.message.split('').reverse().join('')
}
methods: {
reversedMessage: function () {
return this.message.split('').reverse().join('')
}
}
同样意味着下面的计算属性将不再更新,因为 Date.now()
不是响应式依赖
computed: {
now: function () {
return Date.now()
}
}
我们为什么需要缓存?假设我们有一个性能开销比较大的计算属性 A,它需要遍历一个巨大的数组并做大量的计算。然后我们可能有其他的计算属性依赖于 A。如果没有缓存,我们将不可避免的多次执行 A 的 getter!如果你不希望有缓存,请用方法来替代。
computed和watch
Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性。(watch)
推荐优先使用computed
计算数学的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 会被调用
侦听器
虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。
这就是为什么 Vue 通过
watch
选项提供了一个更通用的方法,来响应数据的变化。
- 当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。