場景:vue-router
路由鉤子 beforeRouteEnter
能夠用來在初始進入頁面前,http 異步獲取數據mockData
,預先判斷是進入 A 頁、仍是 B 頁,仍是留在本頁;而若是留在本頁的話,還須要在mounted
根據mockData
來判斷顯示哪一種狀態(能夠在本頁面實例建立後,從新發起 http 請求獲取mockData
,可是沒有必要,形成代碼冗餘);vue
執行順序:git
async beforeRouteEnter(to, from, next) { let res = await gameData() console.log('beforeRouteEnter start'); next(vm => { console.log("vm start") vm.is_exchange = res.is_exchange vm.is_finish = res.is_finish }) }, beforeCreate() { console.log("beforeCreate start") }, mounted(){ console.log('mounted start'); if(this.is_finish){ this.modalMsg="活動已結束" return; } if(this.is_exchange){ this.modalMsg="您已兌換獎品" return; } }
打印結果以下:github
beforeRouteEnter start beforeCreate start mounted start vm start
由打印結果,咱們能夠總結 beforeRouteEnter
鉤子確實在 vue 實例建立前執行,可是其 next
函數中 vm
回調不是同步執行,而是等到 mounted
執行完以後,才執行。vue-router
癥結: 由於咱們要根據mockData
中的is_exchange
和is_finish
參數來判斷決定頁面初始狀態,此過程須要在mounted
中執行;可是 mounted
執行時,vm
還未執行,即 mounted
拿不到is_exchange
和is_finish
這兩個值,這樣就形成了衝突;異步
解決: 在 next
中 打印 vm
,發現 vm
就是當前 vue 實例對象,便可以使用 vm
調用全部當前實例的變量和方法;那依次,可否將判斷邏輯寫入 methods
中一個方法中,使用 vm
來調用呢?async
async beforeRouteEnter(to, from, next) { let res = await gameData() console.log('beforeRouteEnter start'); next(vm => { console.log("vm start") vm.is_exchange = res.is_exchange vm.is_finish = res.is_finish vm.judge();//賦值以後,此處調用判斷方法 }) }, beforeCreate() { console.log("beforeCreate start") }, mounted(){ console.log('mounted start'); }, methods:{ judge(){// 將判斷邏輯寫入judge方法 if(this.is_finish){ this.modalMsg="活動已結束" return; } if(this.is_exchange){ this.modalMsg="您已兌換獎品" return; } } }
至此,問題解決。有同窗可能會問,在 vm
中調用 judge
方法時,mounted
已執行,此時頁面已渲染,再去判斷初始狀態,會不會有閃爍問題?本人通過測試,發現不會,據此推斷,在 mounted
執行結束以後,頁面沒有開始更新動做,而是在執行完 vm
回調以後,再去渲染。這樣的話,邏輯上就行得通了,可是這個只是推斷,還須要在源碼層面找到依據才能夠。函數
github地址測試