Vue 進(jìn)階之路(三)
之前的文章我們已經(jīng)對(duì) vue 有了初步認(rèn)識(shí),這篇文章我們通過(guò)一個(gè)例子說(shuō)一下 vue 的方法 methods,計(jì)算屬性 compited 和監(jiān)聽(tīng)器 watch。
現(xiàn)在我們有一個(gè)需求,變量 firstName = "hello",變量 lastName = "world",我們需要將這兩個(gè)變量拼接到在前端展示,最基本的我們可以想到的就是:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue</title> <script src="https://cdn.jsdelivr.net/npm/vue"></script> </head> <body> <div id="app"> <p>{{firstName + " " + lastName}}</p> <p>{{firstName}} {{lastName}}</p> </div> <script> var app = new Vue({ el: '#app', data: { firstName: 'hello', lastName: 'world', }, }) </script> </body> </html>
以上兩種寫(xiě)法很明顯是可以這么做的,但是第一種我們?cè)?{{ }} 插值表達(dá)式內(nèi)進(jìn)行了代碼的計(jì)算,這是我們不建議使用方式,第二種是寫(xiě)兩個(gè) {{ }} 插值表達(dá)式,看起來(lái)效果不錯(cuò),但是如果我們要再拼接多個(gè)的話在 HTML 代碼中就顯得冗余了,后期也不好維護(hù)。接下來(lái)我們看一下如何在方法內(nèi)實(shí)現(xiàn):
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue</title> <script src="https://cdn.jsdelivr.net/npm/vue"></script> </head> <body> <div id="app"> <p>{{fullName()}} {{time}}</p> </div> <script> var app = new Vue({ el: '#app', data: { firstName: 'hello', lastName: 'world', time: 1 }, methods:{ fullName(){ console.log("計(jì)算了一次"); return this.firstName + " " + this.lastName } } }) </script> </body> </html>
上面的代碼我們?cè)?methods 里定義了一個(gè) fullName 的方法,然后通過(guò) {{ }} 插值表達(dá)式放在 HTML 里,當(dāng)頁(yè)面加載的時(shí)候直接調(diào)用,運(yùn)行結(jié)果如下:
我們?cè)陧?yè)面加載的時(shí)候同時(shí)定義了一個(gè) time 的數(shù)據(jù),當(dāng)我們更新這個(gè) time 數(shù)據(jù)的時(shí)候,結(jié)果如下:
我們發(fā)現(xiàn)當(dāng)我們更新 time 數(shù)據(jù)的時(shí)候,fullName 方法也調(diào)用了一次。這顯然不是很理想的。
我們?cè)賮?lái)看一下利用監(jiān)聽(tīng)器 watch 方法:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue</title> <script src="https://cdn.jsdelivr.net/npm/vue"></script> </head> <body> <div id="app"> <p>{{fullName}} {{time}}</p> </div> <script> var app = new Vue({ el: '#app', data: { firstName: 'hello', lastName: 'world', fullName: 'hello world', time: 1 }, watch: { firstName() { console.log("firstName 更改了"); this.fullName = this.firstName + " " + this.lastName; }, lastName() { console.log("lastName 更改了"); this.fullName = this.firstName + " " + this.lastName; } } }) </script> </body> </html>
結(jié)果如下:
我們?cè)?Vue 實(shí)例的 watch 屬性里定義了兩個(gè)方法 firstName 和 lastName,watch 屬性中方法名和 data 屬性里的數(shù)據(jù)變量名相同,表示會(huì)實(shí)時(shí)監(jiān)聽(tīng)該數(shù)據(jù)的變化,如果監(jiān)聽(tīng)到變化時(shí)會(huì)實(shí)時(shí)更新 DOM。
我們先來(lái)看一下當(dāng)跟 methods 方法那樣更新 time 數(shù)據(jù)時(shí)的變化:
我們可以看出當(dāng) time 數(shù)據(jù)更新時(shí)并沒(méi)有調(diào)用 firstName 和 lastName 里的數(shù)據(jù)。當(dāng)我們更新 firstName 和 lastName 的數(shù)據(jù)時(shí),結(jié)果如下:
我們可以看出當(dāng)我們更新 firstName 或者 lastName 的數(shù)據(jù)時(shí),fullName 數(shù)據(jù)才會(huì)更新,這說(shuō)明當(dāng)數(shù)據(jù)掛載到 DOM 上的時(shí)候會(huì)緩存起來(lái),如果數(shù)據(jù)不更新,則還會(huì)繼續(xù)使用緩存的數(shù)據(jù),當(dāng)數(shù)據(jù)更新時(shí)才會(huì)調(diào)用 watch 里面的方法,這就比 methods 的方法要好很多。
我們?cè)賮?lái)看一下計(jì)算屬性 computed:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue</title> <script src="https://cdn.jsdelivr.net/npm/vue"></script> </head> <body> <div id="app"> <p>{{fullName}} {{time}}</p> </div> <script> var app = new Vue({ el: '#app', data: { firstName: 'hello', lastName: 'world', time: 1 }, computed:{ fullName(){ console.log("計(jì)算了一次"); return this.firstName + " " + this.lastName; } } }) </script> </body> </html>
運(yùn)行結(jié)果如下:
我們可以看出跟 watch 比,我們并沒(méi)有在 data 里定義 fullName 數(shù)據(jù),而是在 computed 屬性里直接定義 fullName 然后 return 出 firstName 和 lastName 的拼接結(jié)果,當(dāng)頁(yè)面呈現(xiàn)時(shí),從輸出結(jié)果可以看出會(huì)走一次計(jì)算屬性,當(dāng)我們改變 time 數(shù)據(jù)時(shí):
可以看出 computed 里的方法沒(méi)有被調(diào)用,當(dāng)我們改變 firstName 或者 lastName 的數(shù)據(jù)時(shí),結(jié)果如下:
從上面的結(jié)果可以看出 computed 里面的方法被調(diào)用了,這是我們想要的結(jié)果,當(dāng)跟 fullName 有關(guān)的 firstName 和 lastName 數(shù)據(jù)改變時(shí)計(jì)算屬性才會(huì)重新計(jì)算,當(dāng)跟 fullName 無(wú)關(guān)的 time 數(shù)據(jù)變化時(shí)會(huì)用之前緩存的數(shù)據(jù),這正是我們想要的結(jié)果。
以上三種方法進(jìn)行比較我們可以得知 methods 方法是最不理想的,監(jiān)聽(tīng)器 watch 和 計(jì)算屬性 computed 兩種方法的運(yùn)行結(jié)果是一樣的,但是 計(jì)算屬性 computed 方法更簡(jiǎn)單一些。所以在 watch 和 computed 兩種方法都能實(shí)現(xiàn)的時(shí)候我們更推薦使用 computed 方法。
但是上面的 watch 和 computed 兩個(gè)方法里有個(gè)問(wèn)題,就是 watch 里我們?cè)?data 里定義了一個(gè) fullName 的數(shù)據(jù),當(dāng)我們?cè)诟?fullName 的值時(shí) DOM 會(huì)跟著改變,這個(gè)跟 firstName 和 lastName 數(shù)據(jù)更改是一樣的。但是當(dāng)我們?cè)?computed 里我們并沒(méi)有定義 fullName,當(dāng)我們更改 fullName 的數(shù)據(jù)時(shí),如下:
我們發(fā)現(xiàn) DOM 并沒(méi)有更新,這跟 watch 比起來(lái)就顯得不友好了,其實(shí)在 computed 里有 get 和 set 兩個(gè)屬性,我們 computed 的 fullName 方法改成如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue</title> <script src="https://cdn.jsdelivr.net/npm/vue"></script> </head> <body> <div id="app"> <p>{{fullName}} {{time}}</p> </div> <script> var app = new Vue({ el: '#app', data: { firstName: 'hello', lastName: 'world', time: 1 }, computed: { fullName: { get() { console.log("計(jì)算了一次"); return this.firstName + " " + this.lastName; }, set(value) { console.log(value); var result = value.split(" "); this.firstName = result[0]; this.lastName = result[1]; } } } }) </script> </body> </html>
運(yùn)行結(jié)果如下:
可以看出當(dāng)我們通過(guò) get 和 set 就可以改變 fullName 的值使 DOM 更新了。當(dāng)頁(yè)面更新的時(shí)候先觸發(fā) fullName 中的 get 方法,并返回 fullName,當(dāng)我們改變 time 時(shí),fullName 所依賴(lài)的 firstName 和 lastName 并沒(méi)有更改,所以就 fullName 就會(huì)去取緩存的值,在 fullName 的 set 方法里可以傳一個(gè) value 的參數(shù),通過(guò)打印我們可以看出 value 值就是我們直接改變 fullName 的值,我們就可以通過(guò)該值來(lái)賦值改變 firstName 和 lastName,這樣 fullName 所依賴(lài)的 firstName 或 lastName 改變時(shí) DOM 就會(huì)實(shí)時(shí)更新了。
以上所述是小編給大家介紹的Vue 進(jìn)階之路詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Vue.js進(jìn)階知識(shí)點(diǎn)總結(jié)
- Vue完整項(xiàng)目構(gòu)建(進(jìn)階篇)
- 詳解VueRouter進(jìn)階之導(dǎo)航鉤子和路由元信息
- Vue學(xué)習(xí)筆記進(jìn)階篇之函數(shù)化組件解析
- Vue學(xué)習(xí)筆記進(jìn)階篇之vue-router安裝及使用方法
- Vue學(xué)習(xí)筆記進(jìn)階篇之單元素過(guò)度
- Vue學(xué)習(xí)筆記進(jìn)階篇之vue-cli安裝及介紹
- 詳解Vue學(xué)習(xí)筆記進(jìn)階篇之列表過(guò)渡及其他
- Vue學(xué)習(xí)筆記進(jìn)階篇之過(guò)渡狀態(tài)詳解
- Vue 進(jìn)階教程之v-model詳解
相關(guān)文章
Vue3之toRefs和toRef在reactive中的一些應(yīng)用方式
這篇文章主要介紹了Vue3之toRefs和toRef在reactive中的一些應(yīng)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03vue2之簡(jiǎn)易的pc端短信驗(yàn)證碼的問(wèn)題及處理方法
這篇文章主要介紹了vue2之簡(jiǎn)易的pc端短信驗(yàn)證碼的問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06如何解決Element UI el-dialog打開(kāi)一次后無(wú)法再次打開(kāi)問(wèn)題
這篇文章主要介紹了如何解決Element UI el-dialog打開(kāi)一次后無(wú)法再次打開(kāi)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02vue項(xiàng)目在env文件中設(shè)置的變量無(wú)效問(wèn)題及解決
這篇文章主要介紹了vue項(xiàng)目在env文件中設(shè)置的變量無(wú)效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03vue項(xiàng)目打包后部署到服務(wù)器的詳細(xì)步驟
這篇文章主要介紹了vue項(xiàng)目打包后部署到服務(wù)器,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09使用this.$nextTick()獲取不到數(shù)據(jù)更新后的this.$refs.xxx.及場(chǎng)景分析
今天遇到了這樣一個(gè)場(chǎng)景,在數(shù)據(jù)更新之后,使用this.$nextTick(()=>{console.log(this.$refs.xxx)}) 獲取不到改dom,但是用setTimeout能夠獲取到,在此記錄一下,感興趣的朋友跟隨小編一起看看吧2023-02-02ElementPlus 中el-select自定義指令實(shí)現(xiàn)觸底加載請(qǐng)求options數(shù)據(jù)的方法
觸底時(shí),繼續(xù)向后端發(fā)請(qǐng)求獲取下一頁(yè)的數(shù)據(jù),請(qǐng)求回來(lái)的數(shù)據(jù)合并給options,這篇文章主要介紹了ElementPlus 中el-select自定義指令實(shí)現(xiàn)觸底加載請(qǐng)求options數(shù)據(jù)的操作方法,需要的朋友可以參考下2024-08-08