我在写项目的时候遇到过一个问题,在v-for循环中利用一个方法把数字转换成对应的文字,这里我采用的computed计算属性来处理这个问题,但是在定义方法时发现了一个奇怪的事;
template中:
<td>{{isOutSchVal(item.isoutschool)}}</td>
js中:
computed:{
isOutSchVal() {
return isoutschool => {
if (isoutschool) {
return "校外";
} else {
return "校内";
}
};
},
}
这里不知道是不是有小伙伴疑惑为什么要return一个函数而且这个函数接收参数而isOutSchVal函数却没有接收参数;在我们学js的时候isOutSchVal(item.isoutschool)是传给isOutSchVal函数的参数而在computed中为什么就不一样了?接下来就给大家揭晓谜底。
<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('')
}
}
})
<p>Reversed message: "{{ reversedMessage() }}"</p>
// 在组件中
methods: {
reversedMessage: function () {
return this.message.split('').reverse().join('')
}
}
不知道大家是不是对这两段代码比较熟悉,没错如果你遇到methods和computed区别的问题肯定是要去官方文档去查一下的,但是官方文档没有说到具体哪一点不一样而是在功能上做比较。
两者在函数定义方面的区别在于computed中定义的方法相当于
isOutSchVal: (function (){
return a
}())
在调用该计算属性时只需要引用isOutSchVal而不需要isOutSchVal()所以在需要用计算属性处理数据是特别是需要传参时必须要在该计算属性中return 一个函数来接收参数
isOutSchVal: (function () {
return (prop) => {
return prop
}
}())
否则参数不能被接受而且在调用时计算属性的isOutSchVal(prop)=== methods(普通函数)的isOutSchVal()(prop)
以上是computed和methods在语法上的区别
两者在功能上的区别就引用vue官方文档的说明:
你可能已经注意到我们可以通过在表达式中调用方法来达到同样的效果:
<p>Reversed message: "{{ reversedMessage() }}"</p>
// 在组件中
methods: {
reversedMessage: function () {
return this.message.split('').reverse().join('')
}
}
我们可以将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是完全相同的。然而,不同的是计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。
这也同样意味着下面的计算属性将不再更新,因为 Date.now() 不是响应式依赖:
computed: {
now: function () {
return Date.now()
}
}
相比之下,每当触发重新渲染时,调用方法将总会再次执行函数。
我们为什么需要缓存?假设我们有一个性能开销比较大的计算属性 A,它需要遍历一个巨大的数组并做大量的计算。然后我们可能有其他的计算属性依赖于 A 。如果没有缓存,我们将不可避免的多次执行 A 的 getter!如果你不希望有缓存,请用方法来替代。