Vue中的computed计算属性和methods的区别

it2024-08-01  38

记录一下今天学习的计算属性相关的东西。

计算属性的语法格式是:computed: {}

计算属性

计算属性一般是为了简化模板中的内容,让模板中内容尽可能简洁。如果我们将太多的逻辑写在模板中,模板将会变得难以维护。例如:

<div id="example"> {{ message.split('').reverse().join('') }} </div>

所以,对于任何复杂逻辑,你都应当使用计算属性。 举个栗子:

<body> <div id="app"> {{fullName}} <!-- {{fullName()}} 方法使用的,因为方法需要调用! --> {{age}} </div> <script> var app = new Vue({ el:'#app', data:{ firstName:'Dell', lastName:'Lee', age: 28 }, // 计算属性完成名字的组合(有缓存,更推荐) // 自带缓存,如果相关的值没有改变,改变页面其他元素的值,不需要重新计算 computed: { fullName(){ console.log('计算了一次'); return this.firstName + ' ' + this.lastName; } }, // 方法完成名字的组合(无缓存) // 方法内部没有缓存机制,相关的值即便没有改变,刷新页面时仍旧需要重新计算 // methods: { // fullName(){ // console.log('计算了一次'); // return this.firstName + ' ' + this.lastName; // } // }, }) </script>

你应该发现了fullName更像一个方法,而不像一个属性。这是因为计算属性的简写方式导致,不是它的原始样子,原始样子如下:

<script> computed: { fullName:{ get(){ return this.firstName +' '+this.lastName; }, } }, </script>

计算属性默认只有get方法,当只有get方法时,就可以进行简写。

当然,如果有需要,我们可以为计算属性提供它的set方法,set方法在计算属性的值被修改时自动调用。这里主要先理解下get方法。

通常情况下,我们只会用到get方法,所以简写形式居多,但不要把它当做方法。它跟方法是不一样的,方法的每次调用,方法内部逻辑都会执行一遍。计算属性却不会,它具备基于依赖的缓存能力。下面例子来证实这个现象。

<div id="app"> <div>{{reverseMsg}}</div> <div>{{reverseMsg}}</div> <hr> <div>{{reverseStr(msg)}}</div> <div>{{reverseStr(msg)}}</div> </div> <script> let vm = new Vue({ el: '#app', data: { msg: 'Hello' }, computed: { reverseMsg() { console.log('computed') return this.msg.split('').reverse().join('') } }, methods: { reverseStr() { console.log('method') return this.msg.split('').reverse().join('') } } }) </script>

上面代码中,计算属性在模板中使用了两次,方法调用也使用了两次,打印发现

方法中的打印语句执行了两次,而计算属性中的打印语句却只执行了一次。这就验证了,计算属性的简写形式虽然长得跟方法一模一样,但它确实不是方法。

总结: 方法的每次调用,方法内部逻辑都会执行一遍。计算属性却不会,它具备基于依赖的缓存能力。

我们为什么需要缓存?假设我们有一个性能开销比较大的计算属性 A,它需要遍历一个巨大的数组并做大量的计算。然后我们可能有其他的计算属性依赖于 A。如果没有缓存,我们将不可避免的多次执行 A 的 getter!如果你不希望有缓存,请用方法来替代。

最新回复(0)