Vue項(xiàng)目中數(shù)據(jù)的深度監(jiān)聽或?qū)ο髮傩缘谋O(jiān)聽實(shí)例
眾所周知,vue項(xiàng)目中對數(shù)據(jù)的監(jiān)聽,提供了一個(gè)很好的鉤子watch,watch可以極其方便的監(jiān)聽我們常用數(shù)據(jù)類型值的變化,但通常當(dāng)我們想監(jiān)聽一個(gè)對象中,某個(gè)屬性值的變化時(shí),很難達(dá)到我們預(yù)期的效果。根據(jù)vue的文檔,不難發(fā)現(xiàn),使用數(shù)據(jù)的深度監(jiān)聽來達(dá)到這一效果。具體實(shí)現(xiàn)如下:
watch: {
evlist: {
handler(val, oldVal) {
this.isTeam = val.projectParty;
this.pjtid = val.pjtid;
this.isFinish = val.projectSelfValue;
},
deep: true
},
},
這其中,evlist是一個(gè)對象,val監(jiān)聽到變化后的值,oldVal是變化前的值。
補(bǔ)充知識:vue中的監(jiān)聽屬性和計(jì)算屬性
計(jì)算屬性(computed)
vue中的計(jì)算屬性是非常棒的東西,它兼具了邏輯和變量??梢宰屛覀儾辉訇P(guān)注視圖層,值關(guān)注代碼的邏輯即可。至于數(shù)據(jù)如何展現(xiàn)則只需由Vue負(fù)責(zé),不需要我們的參與。
所以如果在面臨選擇是使用計(jì)算屬性還是監(jiān)視屬性的情況下,優(yōu)先選擇計(jì)算屬性
<p>Original message: "{{ message }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
export default {
data(){
return {
message: 'Hello',
}
},
computed: {
reversedMessage: function () {
return this.message.split('').reverse().join('');
}
}
可以看到我們使用的計(jì)算屬性替代了模板內(nèi)表達(dá)式的功能。所以,對于任何復(fù)雜邏輯,你都應(yīng)當(dāng)使用計(jì)算屬性。而且計(jì)算屬性讓我們只關(guān)注于邏輯實(shí)現(xiàn),至于后期的數(shù)據(jù)在界面上的表示形式則直接由Vue.js負(fù)責(zé),讀者可以看到我們并沒有直接參與頁面展示上面來
此外,傳統(tǒng)的直接通過表達(dá)式求值的方式需要我們自行取值,而計(jì)算屬性是基于它們的依賴進(jìn)行緩存的。只在相關(guān)依賴發(fā)生改變時(shí)它們才會重新求值。也就是說,計(jì)算屬性會直接從緩存拿值,并伴隨著值的改變而改變。而傳統(tǒng)的直接通過表達(dá)式求值的方式需要我們在拿值之前需要執(zhí)行一次getter()函數(shù)
監(jiān)聽屬性(watch)
監(jiān)聽屬性其實(shí)質(zhì)是一次異步回調(diào),希望讀者在想到使用監(jiān)聽屬性之前多考慮能否采用計(jì)算屬性來取代監(jiān)聽屬性
對比同一個(gè)功能實(shí)現(xiàn)
//計(jì)算屬性
computed: {
fullName2: function () {
return this.firstName + ' ' + this.lastName
}
}
//監(jiān)聽屬性
watch: {
firstName: function (val) {
this.fullName = val + ' ' + this.lastName
},
lastName: function (val) {
this.fullName = this.firstName + ' ' + val
}
}
可以看到計(jì)算屬性的代碼更加簡潔也更加高效,而且就實(shí)現(xiàn)效果而言,明顯計(jì)算屬性會更好一點(diǎn)
以上這篇Vue項(xiàng)目中數(shù)據(jù)的深度監(jiān)聽或?qū)ο髮傩缘谋O(jiān)聽實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
壓縮Vue.js打包后的體積方法總結(jié)(Vue.js打包后體積過大問題)
大家都知道,Vuejs的 CLI工具 是基于 webpack 來實(shí)現(xiàn)的,所以在項(xiàng)目打包后,會生成的文件會很大。 主要原因是 webpack 將我們所有文件都打包成一個(gè)js文件,即使再小的項(xiàng)目,打包之后文件都會變得很大。 下面講講最近我遇到的相同問題。2020-02-02
Vue-router 中hash模式和history模式的區(qū)別
這篇文章主要介紹了Vue-router 中hash模式和history模式的區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07
element-ui中el-table不顯示數(shù)據(jù)的問題解決
這篇文章主要介紹了element-ui中el-table不顯示數(shù)據(jù)的問題解決,這是最近在做列表首頁時(shí)遇到的一個(gè)問題,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
Pinia進(jìn)階setup函數(shù)式寫法封裝到企業(yè)項(xiàng)目
這篇文章主要為大家介紹了Pinia進(jìn)階setup函數(shù)式寫法封裝到企業(yè)項(xiàng)目實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
Vue2.0+ElementUI+PageHelper實(shí)現(xiàn)的表格分頁功能
ElementUI也是一套很不錯的組件庫,對于我們經(jīng)常用到的表格、表單、時(shí)間日期選擇器等常用組件都有著很好的封裝和接口。這篇文章主要介紹了Vue2.0+ElementUI+PageHelper實(shí)現(xiàn)的表格分頁,需要的朋友可以參考下2021-10-10

