簡介
屬於單一元件 component 的 Hooks,分別有以下三種:
- beforeRouteEnter 進入路由之前
 - beforeRouteUpdate 更新路由之前
 - beforeRouteLeave 離開路由之前
 
使用方法
起手式如下,並依照情境需求使用:
1  | <template> ... </template>  | 
beforeRouteEnter 進入路由之前
提供 to ,from, next 三個參數使用。
在路由尚未進入該元件時被調用,須注意在這個方法裡面因為還沒有建立物件實體,故無法取得 this,但可以在 next 參數中取得元件實體。
1  | beforeRouteEnter(to, from, next){  | 
透過開發人員工具可以看到印出的結果,
to

from

從 to 跟 from 都可以看到 fullpath 對應的路徑,以及相關的資訊,像是 matched 就會看到上下頁的內容:
next

實際情境優化
此是實際情境,我有一頁會員註冊頁要填入姓名的 member-name 頁面,原本的寫法是只要進入此頁就把填寫過的資料清空,但使用情境上其實不友善,因為變成使用者按上一頁的功能鍵時,原本在這頁填寫的內容都被清空,故修改成當我重新進入此頁時,只要路由是從 member-name 來的話,就記錄在 store 裡。
1  | // 如果 path 是 member-name 頁面要保留資料,其他頁面都要清空資料  | 
beforeRouteUpdate 更新路由之前
實際上使用是當路由被改變,但使用的元件是同一個時使用。由於只是更新元件內容,但元件本身沒有被銷毀,此時就會觸發 beforeRouteUpdate Hook,方法內的參數與 beforeRouteEnter 大致相同,只是沒有 next() 可以用,但因為元件沒有被銷毀,所以已經可以取得物件實體,可以使用 this,也因為已經有 this 可以使用了,所以也不需要使用 next。
1  | beforeRouteUpdate (to, from) {  | 
(這個我實務上還沒遇到過,若有實戰情境會再回頭補上範例)。
beforeRouteLeave 離開路由之前
是在離開此元件時會自動調用此 Hook,也是提供 to, from 兩個參數可以使用,大部分使用情境是詢問使用者是否再跳轉到其他路由前使用。
1  | beforeRouteLeave (to, from) {  | 
可以使用 next 為選填參數,但要注意的是若指定路由卻沒有做判斷,則會陷入無限循環,例:
1  | beforeRouteLeave(to, from, next){  | 
原因是遇到 next(‘/home’) 會中斷當前路由導航,然後會離開此頁面,回到 home 頁面,但因為路由參數 to.path 會一直去導到 home 頁面,導致產生無限循環,所以如果只要前往下一頁,但不指定,就要加上判斷,並且不指定頁面,改寫上方範例後如下:
1  | beforeRouteLeave(to, from, next){  | 
這樣就不會進入無限循環了。
實際情境實作
因從 member-name 頁面回到此頁時,除了填寫資料被清空外,勾選過的選項也沒有被記錄,使用者如果只是想回到這頁修改資料的話,變成要重新勾選,故改成當我離開此元件時,先把勾選過的選項紀錄,並且跳轉到下一個路由。
1  | // 使用 beforeRouteLeave 方法,從 member-name 頁面回到此頁時,保留填寫過的同意條款與年齡的 checkbox 選項。  | 
關於 next 參數
next(): 不指定路由,直接跳到下一頁。next(false): 中斷當前導航,若瀏覽器 URL 改變,URL 路徑會重置到 from 路由對應的路徑。next('/')或是next({path: '/'}): 跳轉到不同的路徑,當前導航會被中斷,然後跳轉到一個新的路由。next(error): 該路由會被終止並且把錯誤傳給 route.onError() 來使用。
Demo
持續更新中~~
https://github.com/hsuchihting/vue_router_demo/tree/master/vue-tailwindcss