设想一个场景,你须要获得一个复杂运算/逻辑的返回值,利用模板内的表达又过长且难以阅读和维护,这时计算属性就能够很好的解决你的问题。看下面的例子:html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>computed</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> </head> <body> <div id="app"> {{message.split(' ').reverse().join(' ')}} </div> <script> new Vue({ el: "#app", data () { return { message: 'Hello world!' } } }) </script> </body> </html>
{{message.split(' ').reverse().join(' ')}}
这个表达式共进行了三种操做,但看起来并非很清晰,而且当咱们想在其余地方也用到最终值时就须要复制、粘贴冗长的一大段代码,因此这时候计算属性就能够及时的发挥它巨大的做用。vue
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>computed</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> </head> <body> <div id="app"> {{reverseText}} <hr> {{reverseText}} <hr> {{reverseText}} </div> <script> new Vue({ el: "#app", data () { return { message: 'Hello world!' } }, // 计算属性 computed: { reverseText () { return this.message.split(' ').reverse().join(' ') } } }) </script> </body> </html>
这时,咱们就能够轻松应用结果在多个地方,并且代码还看起来更清晰了。npm
在计算属性computed里能够完成各类复杂的逻辑(运算、函数调用),全部的计算属性以函数的形式写在computed里,最终返回计算结果,当message
(data数据)有任何变化,计算属性会同时更新,而且更新视图。缓存
每一个计算属性都包括getter
和setter
,咱们平时默认用到的是getter
来读取。app
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>computed</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> </head> <body> <div id="app"> 姓:{{firstName}} <hr> 名:{{lastName}} <hr> 姓名:{{fullName}} </div> <script> new Vue({ el: "#app", data () { return { firstName: '铁柱', lastName: '李' } }, computed: { fullName: { // getter get: function() { return this.lastName + this.firstName }, // setter set: function (data) { let name = data.split(' ') this.firstName = name[name.length - 1] this.lastName = name[0] } } } }) </script> </body> </html>
默认调用时是用fullName
的getter方法读取数据,想使用set方式时:函数
<div id="app"> 姓:{{firstName}} <hr> 名:{{lastName}} <hr> 姓名:{{fullName = '一 枚蛋Oops'}} </div>
有人有可能会问,为何不使用methods直接函数调用,这里就要区分一下他们的区别了ui
methods
:只要从新渲染就会更新,函数就会执行。this
computed
:计算属性依赖的数据变化时,它才会从新取值,只要依赖数据不变化,它就不更新,能够缓存数据。.net
因此到底使用哪一个属性是依据你的项目需求,看看你需不须要缓存。code
以上是本期所有内容,欲知后事如何,请听下回分解<( ̄︶ ̄)↗[GO!]