计算属性
<div id="example">
{{ message.split('').reverse().join('') }}
</div>
由上面的代码可以看出,双大括号里面的文本操作比较多,而且这样的形式可能会造成代码的冗余和繁复,所以vue提供了一个属性来操作这些复杂的逻辑。
我们先来看一个基本的例子:
<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: {
// 计算属性的 getter
reversedMessage: function () {
// `this` 指向 vm 实例
return this.message.split('').reverse().join('')
}
}
})
这里声明了一个计算属性reversedMessage,Vue 知道 vm.reversedMessage 依赖于 vm.message,因此当 vm.message 发生改变时,所有依赖 vm.reversedMessage 的绑定也会更新。
计算属性与方法的比较
methods: {
reversedMessage: function () {
return this.message.split('').reverse().join('')
}
}
你可以看出上面的方法结果与计算属性的结果一致,但是两者也有区别,计算属性是基于它们的依赖进行缓存的,就是说只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。
而每当触发重新渲染时,调用方法将总会再次执行函数。
计算属性和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
}
}
})
其实我最先看到这个东西的时候真的不知道这个是个什么玩意儿,后来我尝试着用vm.firstName="444"改动了data里面的firstname
,然后刷新页面发现了变化。本来fullNmae是'Foo Bar',我只是改动了firstName的值,所以watch的功能是监听数据的变化,当我改变firstName时,watch里面的firstNmae后面的函数执行。
但是上面的代码造成了很多重复,这时我们应该用计算属性。
var vm = new Vue({
el: '#demo',
data: {
firstName: 'Foo',
lastName: 'Bar'
},
computed: {
fullName: function () {
return this.firstName + ' ' + this.lastName
}
}
})
setter和getter
计算属性可以有setter和getter
var vm = new Vue({
el: '#demo',
data: {
firstName: 'Foo',
lastName: 'Bar'
},
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='John ',vm.lastName='Doe'。