Vue 计算属性 computed
前言:
一般情况下属性都是放到data
中的,但是有些属性可能是需要经过一些逻辑计算后才能得出来,那么我们可以把这类属性变成计算属性。
比如以下:
<div id="example"> {{ message.split('').reverse().join('') }} </div>
在这个地方,模板不再是简单的声明式逻辑。你必须看一段时间才能意识到,这里是想要显示变量 message
的翻转字符串。当你想要在模板中的多处包含此翻转字符串时,就会更加难以处理。
所以,对于任何复杂逻辑,你都应当使用计算属性。
1、基础例子
<div id="app"> <h2>总价格:{{totalPrice}}</h2> </div> <script> const vm = new Vue({ el: "#app", data: { message: "hello", books: [ {name: '三国演义', price: 30}, {name: '红楼梦', price: 40}, {name: '西游记', price: 50}, {name: '水浒传', price: 60}, ], }, computed: { // 计算属性的 getter totalPrice: function (){ let result = 0; // `this` 指向 vm 实例 for (let book of this.books){ result += book.price; } return result } } }) </script>
结果:总价格:180
这里我们声明了一个计算属性 totalPrice
。然后通过for循环计算出书的总价,像这种需要计算的属性,就写在computed
中。
属性一般都有get
和set
两个方法,get
获取属性值,set
设置属性值,computed
中默认就是get
属性,我们的vm.totalPrice
是依赖于books.price
,如果书本的价格发生变化,那么计算属性totalPrice
也随之动态变化
2、计算属性缓存 vs 方法
你可能已经注意到我们可以通过在表达式中调用方法来达到同样的效果:
<div id="app"> <h2>总价格:{{getAllPrice()}}</h2> </div> <script> const vm = new Vue({ el: "#app", data: { message: "hello", books: [ {name: '三国演义', price: 30}, {name: '红楼梦', price: 40}, {name: '西游记', price: 50}, {name: '水浒传', price: 60}, ], }, methods: { getAllPrice: function () { let result = 0; // `this` 指向 vm 实例 for (let book of this.books){ result += book.price; } return result } }, }) </script>
我们可以将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是完全相同的。然而,不同的是计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 books
还没有发生改变,多次访问 totalPrice
计算属性会立即返回之前的计算结果,而不必再次执行函数。
所以说计算属性是有缓存的
我们为什么需要缓存?假设我们有一个性能开销比较大的计算属性 A
,它需要遍历一个巨大的数组并做大量的计算。然后我们可能有其他的计算属性依赖于 A
。如果没有缓存,我们将不可避免的多次执行 A
的 getter
!如果你不希望有缓存,请用方法来替代。
3、计算属性的 setter
计算属性默认只有 getter
,不过在需要时你也可以提供一个 setter
:
computed: { totalPrice: { get: function () { let result = 0; // `this` 指向 vm 实例 for (let book of this.books){ result += book.price; } return result }, set: function (newValue) { for (let book of this.books){ book.price += 10 } } } }
这里我们添加了set
方法,在运行vm.totalPrice=[...]
时,setter
会被调用,随后书本的总价格也会随之变化,但是一般情况下不会使用set
到此这篇关于Vue
计算属性 computed
的文章就介绍到这了,更多相关Vue computed
内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
vue-infinite-loading2.0 中文文档详解
本篇文章主要介绍了vue-infinite-loading2.0 中文文档详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-04-04vue基于html2canvas和jspdf 生成pdf 、解决jspdf中文乱码问题的方法详解
这篇文章主要介绍了vue基于html2canvas和jspdf 生成pdf 、解决jspdf中文乱码问题的方法,结合实例形式详细描述了中文乱码问题的原因、解决方法与相关注意事项,需要的朋友可以参考下2023-06-06vue3+vue-cli4中使用svg的方式详解(亲测可用)
最近在做个vue的项目,从各种github上的开源库上借鉴开发方法,给大家分享下,这篇文章主要给大家介绍了关于vue3+vue-cli4中使用svg的相关资料,需要的朋友可以参考下2022-08-08vue-cli3使用postcss-plugin-px2rem方式
这篇文章主要介绍了vue-cli3使用postcss-plugin-px2rem方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-07-07
最新评论