官方文档中已经有对其的解释了,在这里把个人理解记录一下。
computed
的使用场景HTML模板中的复杂逻辑表达式,为了防止逻辑太重致使不易维护,都应当把相关逻辑放入计算属性。javascript
好比这种html
<div id="root"> <p>Reversed message: "{{ message.split('').reverse().join('') }}"</p> </div>
在这个地方,模板再也不是简单的声明式逻辑。这里是想要显示变量 message
的翻转字符串,而这种包含复杂逻辑处理的表达式,都应当使用计算属性。vue
computed
和 methods
的区别这意味着在HTML的插值
里java
{{reversedMessageComputed}}
()
来调用,如 {{reversedNameMethod()}}
,不然视图中会渲染出以下内容function () { [native code] }
这里我引用一下官方文档的说明缓存
计算属性是基于它们的依赖进行缓存的。只在相关依赖发生改变时它们才会从新求值。
<!-- html --> <div id="root"> <p>Reversed message: "{{ reversedNameMethod() }}"</p> <p>Reversed message: "{{ reversedMessageComputed }}"</p> </div>
// javascript var vm = new Vue({ el: '#root', data: { name: 'Alex', message: 'Hello' }, methods: { reversedNameMethod: function () { return this.name.split('').reverse().join('') } }, computed: { // 计算属性的 getter reversedMessageComputed: function () { // `this` 指向 vm 实例 return this.message.split('').reverse().join('') } } })
上面的例子中,缓存意味着只要 message
尚未发生改变,屡次访问 reversedMessageComputed
计算属性会当即返回以前的计算结果,而没必要再次执行函数。而 reversedNameMethod()
方法,每次调用都会从新执行函数。ide
但同时须要注意,这也一样意味着下面的计算属性将再也不更新,由于 Date.now()
不是响应式依赖:函数
// javascript computed: { now: function () { return Date.now() } }
now
的值将在Vue实例化时生成,而且再也不改变。
相比之下,每当触发从新渲染时,调用方法将总会再次执行函数。ui
computed
和 methods
不能够重名this
methods
和 data
里的东西,所有代理到Vue生成的对象中,这会将computed中重名属性覆盖