- {{item.name}} {{item.name}} ({{item.date}})
{{ message.split('').reverse().join('') }}
复制代码
在这个地方,模板不再是简单的声明式逻辑。你必须看一段时间才能意识到,这里是想要显示变量 message 的翻转字符串。当你想要在模板中多次引用此处的翻转字符串时,就会更加难以处理,然后如果大量的使用这样的表达式,会使得整个页面不仅不好看,还很繁重。
所以,对于任何复杂逻辑,你都应当使用计算属性。
就比如上边的栗子,我们就可以写成这样:
复制代码
//1、这里是我们在 computed中定义的值,而不是在data中
var vm = new Vue({
el: '#example',
data: {
message: 'Hello'
},
computed: {
// 计算属性的 getter
reversedMessage: function () {
// 注意 !`this` 指向 vm 实例
return this.message.split('').reverse().join('')
}
}
})
复制代码
这样看起来就清晰明了,减轻页面的负重。这里你可以会好奇,这就像一个data的中间件一样,不用做任何的其他操作,都可以实现这个逻辑,就好像data的影子一样,没错!计算属性就是一个getter器。
你可以像绑定普通属性一样在模板中绑定计算属性。Vue 知道 vm.reversedMessage 依赖于 vm.message,因此当 vm.message 发生改变时,所有依赖 vm.reversedMessage 的绑定也会更新。而且最妙的是我们已经以声明的方式创建了这种依赖关系:计算属性的 getter 函数是没有副作用 (side effect) 的,这使它更易于测试和理解。
2、知道了他的原理和如何使用,那么我们就可以在我们的项目中使用 计算属性 来达到我们的动态查询文章的功能
我们首先添加一个计算属性来过滤我们的文章list数据
复制代码
//通过计算属性过滤数据
computed: {
listSearch: function () {
//为什么要存这个this呢,因为filter过滤器会改变this的指向
let that = this;
return this.list.filter(function (item) {
//简单的 判断文章name是否包含 input中的值,因为双向绑定,所以也就是 task.name
return item.name.indexOf(that.$data.task.name) >= 0;
});
}
}
复制代码
接下来,我们就需要把我们的计算属性 listSearch 替换掉view中的 list,从而达到过滤:
复制代码
message: "{{ reversedMessage }}"
