Vue計算屬性的使用
我們都知道在Vue構(gòu)造函數(shù)的參數(shù)對象中有一個【data】屬性,該屬性值是一個對象,該對象是對數(shù)據(jù)的代理,是一個鍵值對并且時刻與頁面表現(xiàn)是一致的,但是這里面只能是簡單的鍵值對,不能擁有業(yè)務(wù)邏輯,并且由于【data】中的屬性屬于同一個生命周期,所以如果我們需要某一個屬性是依賴于另外一個屬性時,在【data】中是做不到的,于是Vue為我們提供了【計算屬性】
一、計算屬性
1.1 概述
計算屬性歸根結(jié)底也是屬性,它也是跟表現(xiàn)層是時刻同步的,雖然我們可以在插值中對數(shù)據(jù)進(jìn)行各種處理,但是插值中的表達(dá)式處理畢竟只能用于簡單的運算,不能擁有太多的業(yè)務(wù)邏輯。
<body> <div id="app"> <h1>{{name.toUpperCase()}}</h1> <!-- <h1>BLUE</h1> --> </div> </body> <script> let vm = new Vue({ el: "#app", data: { name: 'blue' } }) </script>
上面代碼是我們熟悉的在插值中使用表達(dá)式,但是這里面我們不能寫入業(yè)務(wù)代碼。
1.2 計算屬性語法
在構(gòu)造函數(shù)的參數(shù)對象中有一個【computed】屬性,該屬性就是用于定義計算屬性的,該對象中的【鍵】也就是我們的計算屬性,與【data】不同的是,計算屬性的鍵值是一個【擁有返回值的函數(shù)】,該函數(shù)中可以訪問到【data】中的所有屬性。
<body> <div id="app"> <h1>{{rs}}</h1> <!-- <h1>BLUE LOVE PINK</h1> --> </div> </body> <script> let vm = new Vue({ el: "#app", data: { hs: 'BLUE', wf: "PINK" }, computed: { rs:function(){ return `${this.hs} LOVE ${this.wf}` } } }) </script>
上面代碼屬性【rs】是定義的一個計算屬性,該屬性值是通過【data】中的兩個屬性值計算得到,返回一個拼接的字符串(這兒使用了ES6的【模板字符串】)并且當(dāng)【data】中的相關(guān)值變化之后,【rs】屬性都會進(jìn)行重新計算。
可能剛開始對計算屬性會有些疑惑,比如上面的例子我把代碼寫成下面這樣子也是可以的
<body> <div id="app"> <h1>{{hs}} LOVE {{wf}}</h1> <!-- <h1>BLUE LOVE PINK</h1> --> </div> </body> <script> let vm = new Vue({ el: "#app", data: { hs: 'BLUE', wf: "PINK" } }) </script>
上面的代碼運行效果和我們使用計算屬性的效果是一樣的,但是這樣的寫法只適用于簡單的處理,【計算屬性可以處理更復(fù)雜的業(yè)務(wù)邏輯】,比如我們根據(jù)【data】中的一個屬性值進(jìn)行數(shù)據(jù)請求用于構(gòu)建一個屬性,我們就必須使用計算屬性了。
【注意?。 坑嬎銓傩噪m然是一個方法,但是在Vue內(nèi)部會被翻譯成一個屬性,我們可以使用實例【vm.rs】訪問到數(shù)據(jù)的。
1.3 計算屬性和過濾器的比較
如果用于對【data】中【單個】屬性的【簡單】處理,推薦使用過濾器,但是如果一個值使用了【data】中至少2個值或者對一個值進(jìn)行復(fù)雜處理,那么就推薦使用計算屬性了。
<body> <div id="app"> <h1>{{hs | lover}}</h1> <!-- <h1>BLUE LOVE PINK</h1> --> </div> </body> <script> let vm = new Vue({ el: "#app", data: { hs: 'BLUE', }, filters: { lover(value){ return `${value} LOVE PINK` } } }) </script>
上面代碼就使用了一個【data】屬性值做簡單的處理,所以使用過濾器,而且也發(fā)現(xiàn)了過濾字符串“LOVE PINK”是不可變的。
1.4 計算屬性和Methods的比較
計算屬性就是為了定屬性的時候處理復(fù)雜的業(yè)務(wù)邏輯,而且在插值中我們可以使用表達(dá)式,那么我們是否可以通過使用在插值中調(diào)用一個有返回值的函數(shù)呢?它和計算屬性又有什么區(qū)別呢?
<body> <div id="app"> <h1>{{rs}}</h1> <!-- <h1>EULB</h1> --> </div> </body> <script> let vm = new Vue({ el: "#app", data: { name: 'BLUE', }, computed: { rs: function () { return [...this.name].reverse().join(''); } } }) </script>
上面代碼將數(shù)據(jù)進(jìn)行反向處理(使用了【ES6數(shù)組字符串?dāng)U展】 ),當(dāng)我們改變name的值的時候,計算屬性【rs】會跟著改變。下面我們將它改成一個方法結(jié)合插值表達(dá)式進(jìn)行處理,看看區(qū)別。
<body> <div id="app"> <h1>{{ rs() }}</h1> <!-- <h1>EULB</h1> --> </div> </body> <script> let vm = new Vue({ el: "#app", data: { name: 'BLUE', }, methods: { rs() { return [...this.name].reverse().join(''); } } }) </script>
上面代碼將計算屬性改成了一個方法結(jié)合插值表達(dá)式,發(fā)現(xiàn)效果和計算屬性沒差別,改變name的值的時候頁面也刷新了。那是不是這兩者就真的沒區(qū)別呢,答案當(dāng)然是否定的,如果沒有區(qū)別干嘛還有計算屬性的存在。
【計算屬性是基于依賴進(jìn)行緩存的】,只有計算屬性的依賴發(fā)生改變時才會重新求值,也就是說如果依賴沒有發(fā)生改變,那么計算屬性會立刻返回之前的計算結(jié)果,假如我們有一個性能開銷比較大的的計算屬性 A ,它需要遍歷一個極大的數(shù)組和做大量的計算。然后我們可能有其他的計算屬性依賴于 A 。如果沒有緩存,我們將不可避免的多次執(zhí)行 A 的 getter!如果你不希望有緩存,請用 method 替代。
1.5 計算屬性和Watch的比較
我們發(fā)現(xiàn)計算屬性會監(jiān)聽依賴,如果依賴發(fā)生變化則會從新計算屬性,那么【監(jiān)聽器】也有這么一個功能,那么我們應(yīng)該在什么時候使用【計算屬性】,什么時候使用【監(jiān)聽器】呢?
<body> <div id="app"> <h1>{{fullName}}</h1> </div> </body> <script> let vm = new Vue({ el: "#app", data: { firstName: 'Jack', lastName: 'Blue', fullName: 'Jack Blue' }, watch: { firstName: function (val) { this.fullName = val + ' ' + this.lastName }, lastName: function (val) { this.fullName = this.firstName + ' ' + val } } }) </script>
上面代碼中我們監(jiān)聽firstName和lastName用于構(gòu)建fullName,效果很好,當(dāng)firstName和lastName任意一個值改變的時候fullName都會隨之改變。下面我們看一下計算屬性的寫法
<body> <div id="app"> <h1>{{fullName}}</h1> <!-- <h1>Jack Blue</h1> --> </div> </body> <script> let vm = new Vue({ el: "#app", data: { firstName: 'Jack', lastName: 'Blue', }, computed: { fullName() { return this.firstName + ' ' + this.lastName } } }) </script>
上面代碼使用計算屬性的方式進(jìn)行了改造,fullName 依賴 firstName和 lastName 兩個屬性,當(dāng)這兩個屬性任意一個發(fā)生變化,fullname都會重新進(jìn)行計算。但是計算屬性是不是簡潔了很多呢!
【總結(jié)!!】當(dāng)一個屬性需要依賴多個【data】中的屬性時,建議使用計算屬性,如果我們不是對屬性進(jìn)行操作,只是單純的依據(jù)【data】中的某個值變化后做一些【非屬性操作】時或者是在數(shù)據(jù)變化響應(yīng)時,【執(zhí)行異步操作或開銷較大的操作】(比如:將變化后的值存入數(shù)據(jù)庫,而不是改變其他屬性)就使用Watch。
1.6 計算屬性的setter
上面我們是使用的計算屬性都是用于對計算屬性的取值,計算屬性默認(rèn)頁只給了【getter】,但是在需要的時候我們可以人為的添加【setter】
<body> <div id="app"> <h1>{{fullName}}</h1> <!-- <h1>Jack Blue</h1> --> </div> </body> <script> let vm = new Vue({ el: "#app", data: { firstName: 'Jack', lastName: 'Blue', }, computed: { fullName: { //getter get() { return this.firstName + ' ' + this.lastName }, //setter set(newValue) { var names = newValue.split(' ') this.firstName = names[0] this.lastName = names[names.length - 1] } } } }) </script>
上面代碼定義了計算屬性的一個setter,注意當(dāng)需要定義setter的時候語法上面是有區(qū)別的。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue+element_ui上傳文件,并傳遞額外參數(shù)操作
這篇文章主要介紹了vue+element_ui上傳文件,并傳遞額外參數(shù)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12vite?+?electron-builder?打包配置詳解
這篇文章主要為大家介紹了electron基于vite?+?electron-builder?打包配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Vue(定時器)解決mounted不能獲取到data中的數(shù)據(jù)問題
這篇文章主要介紹了Vue(定時器)解決mounted不能獲取到data中的數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07Vue 基礎(chǔ)語法之計算屬性(computed)、偵聽器(watch)、過濾器(filters)詳解
計算屬性就是 Vue 實例選項中的 computed,computed 的值是一個對象類型,對象中的屬性值為函數(shù),而且這個函數(shù)沒辦法接收參數(shù),這篇文章主要介紹了Vue 基礎(chǔ)語法之計算屬性(computed)、偵聽器(watch)、過濾器(filters)詳解,需要的朋友可以參考下2022-11-11Vue全局使用less樣式,組件使用全局樣式文件中定義的變量操作
這篇文章主要介紹了Vue全局使用less樣式,組件使用全局樣式文件中定義的變量操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10vue路由$router.push()使用query傳參的實際開發(fā)使用
在vue項目中我們用函數(shù)式編程this.$router.push跳轉(zhuǎn),用query傳遞一個對象時要把這個對象先轉(zhuǎn)化為字符串,然后在接收的時候要轉(zhuǎn)化為對象,下面這篇文章主要給大家介紹了關(guān)于vue路由$router.push()使用query傳參的實際開發(fā)使用,需要的朋友可以參考下2022-11-11vue之el-tree懶加載數(shù)據(jù)并且實現(xiàn)樹的過濾問題
這篇文章主要介紹了vue之el-tree懶加載數(shù)據(jù)并且實現(xiàn)樹的過濾問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04