【发布时间】:2017-12-22 18:41:01
【问题描述】:
我试图弄清楚何时调用方法属性,以及何时最好调用计算属性。在我看来,计算通常更可取,因为只要调用访问 DOM 的属性,方法就会响应。
在下面的代码中,两个按钮跟踪一个递增 1 的基本计数器。相同的输出通过方法和计算属性传递到 DOM。如控制台所示,每个增量都会触发计算属性和方法属性。
<div id="content">
<!--counter control-->
<button v-on:click="counter++">Increase Counter</button>
<button v-on:click="counter--">Decrease Counter</button>
<!--counter output-->
<p>{{counter}}</p>
<p>{{ resultMethod() }}</p>
<p>{{ resultComputed }}</p>
</div>
<script>
new Vue({
el: '#content',
data: {
counter: 0
},
computed: {
resultComputed: function(){
console.log("computed.result was run");
return this.counter < 5 ? 'small_number' : 'LARGENUMBER';
}
},
methods: {
resultMethod: function(){
console.log("methods.result was run");
return this.counter < 5 ? 'small_number' : 'LARGENUMBER';
}
}
})
</script>
现在,如果我们添加另外几个数据属性,我们可以看到跟踪它们不会导致方法或计算属性被触发。
<!--new data options-->
<button v-on:click="secondCounter++">Second Counter</button>
<button v-on:click="formSubmit=true">Form Submit</button>
//New Data Properties
secondCounter: 0,
formSubmit: false
现在向 DOM 显示这些数据属性首先表明数据确实被正确跟踪,其次这些操作触发与我们的计数器相同的方法属性,即使这些变量与此方法无关。
<p>{{secondCounter}}</p>
<p>{{formSubmit}}</p>
最后,如果我们创建一个完全随机且不相关的方法并在 DOM 中引用它,那么每当我们的任何变量从 DOM 中更改时,它也会被调用。我以简单的方法为例。
<h2>{{ unrelatedMethod() }}</h2>
unrelatedMethod: function(){
console.log("We are now using another random method");
var number = 2000;
return number;
}
那么幕后究竟发生了什么?每次更新 DOM 时,Vue 是否必须运行所有相关属性?什么时候方法比计算属性更好?
【问题讨论】: