vue watch偵聽器有無immediate的運行順序問題
watch偵聽器有無immediate的運行順序
剛寫項目的一個需求中遇到了watch運行順序的坑,本打算把項目弄完再來看看,結(jié)果leader說產(chǎn)品還在改需求(高強度學(xué)習(xí)開始?。?gt;_>)
watch普通監(jiān)聽屬性(無immediate)
在初始化時不會執(zhí)行watch
created() { this.id = 1; console.log(this.id); console.log(this.name); }, watch: { id: function (val) { if (val == 0) { this.name = "id等于0"; } else if (val == 1) { this.name = "id等于1"; } console.log(this.name, "這里是watch"); }, },
- 結(jié)果:
這里有個問題是第一次打印name的值為什么是‘初始值’而不是‘id等于1’。
解決這個疑問就得談到j(luò)s事件處理的執(zhí)行機制事件循環(huán)。
在created中id=1觸發(fā)watch偵聽器,偵聽器中函數(shù)進(jìn)入事件queue,繼續(xù)執(zhí)行created,打印兩個log,這里的name為初始值。
created執(zhí)行完后,執(zhí)行事件queue中的watch偵聽器的函數(shù),給name賦值為‘id等于1’
immediate為true
添加immediate,在初始化時也會執(zhí)行watch回調(diào)函數(shù),組件加載立即執(zhí)行。
要使用immediate需要添加handler屬性
created() { this.id = 1; console.log(this.id); console.log(this.name); }, watch: { id: { handler: function (val) { if (val == 0) { this.name = "id等于0"; } else if (val == 1) { this.name = "id等于1"; } console.log(this.name, "這里是watch"); }, immediate: true, }, },
- 結(jié)果:
在組件加載完成時,立即執(zhí)行watch回調(diào)函數(shù),即在created前執(zhí)行。
后面的執(zhí)行順序同無immediate時。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue+Vant實現(xiàn)7天日歷展示并在切換日期時實時變換功能
本文介紹了如何利用Vue和Vant框架結(jié)合moment.js插件來實現(xiàn)一個7天日歷展示功能,在這個功能中,用戶可以在切換日期時看到界面的實時變化,此外,文章還提供了代碼實現(xiàn)和效果測試的詳細(xì)步驟,幫助開發(fā)者能夠順利完成類似的項目開發(fā)2024-10-10