您好,登錄后才能下訂單哦!
#在切換路由時,組件會被復用,不過,這也意味著組件的生命周期鉤子不會再被調用。
解決辦法有兩種,1簡單地 watch (監測變化) $route 對象:
const User = { template: '...', watch: { '$route' (to, from) { // 對路由變化作出響應... } } }
2.使用 2.2 中引入的 beforeRouteUpdate 導航守衛:
const User = { template: '...', beforeRouteUpdate (to, from, next) { // react to route changes... // don't forget to call next() } }
#全局守衛
你可以使用 router.beforeEach
注冊一個全局前置守衛:
const router = new VueRouter({ ... }) router.beforeEach((to, from, next) => { // ... })
•to: Route: 即將要進入的目標 路由對象
•from: Route: 當前導航正要離開的路由
•next: Function: 一定要調用該方法來 resolve 這個鉤子
#全局解析守衛
在 2.5.0+ 你可以用 router.beforeResolve 注冊一個全局守衛。這和 router.beforeEach 類似,區別是在導航被確認之前,同時在所有組件內守衛和異步路由組件被解析之后,解析守衛就被調用。
#全局后置鉤子
你也可以注冊全局后置鉤子,然而和守衛不同的是,這些鉤子不會接受 next 函數也不會改變導航本身:
router.afterEach((to, from) => { // ... })
#路由獨享的守衛
你可以在路由配置上直接定義 beforeEnter 守衛
const router = new VueRouter({ routes: [ { path: '/foo', component: Foo, beforeEnter: (to, from, next) => { // ... } } ] })
這些守衛與全局前置守衛的方法參數是一樣的。
#組件內的守衛
你可以在路由組件內直接定義以下路由導航守衛:
const Foo = { template: `...`, beforeRouteEnter (to, from, next) { // 在渲染該組件的對應路由被 confirm 前調用 // 不!能!獲取組件實例 `this` // 因為當守衛執行前,組件實例還沒被創建 }, beforeRouteUpdate (to, from, next) { // 在當前路由改變,但是該組件被復用時調用 // 舉例來說,對于一個帶有動態參數的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉的時候, // 由于會渲染同樣的 Foo 組件,因此組件實例會被復用。而這個鉤子就會在這個情況下被調用。 // 可以訪問組件實例 `this` }, beforeRouteLeave (to, from, next) { // 導航離開該組件的對應路由時調用 // 可以訪問組件實例 `this` } }
beforeRouteEnter 守衛 不能 訪問 this,因為守衛在導航確認前被調用,因此即將登場的新組件還沒被創建。
不過,你可以通過傳一個回調給 next來訪問組件實例。在導航被確認的時候執行回調,并且把組件實例作為回調方法的參數。
export default { data(){ return { num: 18 } }, beforeRouteEnter(to, from, next){ next(vm=>{ vm.num=22; }) } }
注意 beforeRouteEnter 是支持給 next 傳遞回調的唯一守衛。對于 beforeRouteUpdate 和 beforeRouteLeave 來說,this 已經可用了,所以不支持傳遞回調,因為沒有必要了
#完整的導航解析流程
1.導航被觸發。
2.在失活的組件里調用離開守衛。
3.調用全局的 beforeEach 守衛。
4.在重用的組件里調用 beforeRouteUpdate 守衛 (2.2+)。
5.在路由配置里調用 beforeEnter。
6.解析異步路由組件。
7.在被激活的組件里調用 beforeRouteEnter。
8.調用全局的 beforeResolve 守衛 (2.5+)。
9.導航被確認。
10.調用全局的 afterEach 鉤子。
11.觸發 DOM 更新。
12.用創建好的實例調用 beforeRouteEnter 守衛中傳給 next 的回調函數。
#在全局導航守衛中檢查元字段
router.beforeEach((to, from, next) => { if (to.matched.some(record => record.meta.requiresAuth)) { //如果路由中有meta的requireAuth,且為true,就不進行登錄驗證,否則進行登錄驗證 if (!auth.loggedIn()) { next({ path: '/login', query: { redirect: to.fullPath } }) } else { next() } } else { next() // 確保一定要調用 next() } })
一個路由匹配到的所有路由記錄會暴露為 $route 對象 (還有在導航守衛中的路由對象) 的 $route.matched 數組。因此,我們需要遍歷 $route.matched 來檢查路由記錄中的 meta 字段。
注:1、meta 字段就是路由元信息字段,requiresAuth 是自己起的字段名稱,用來標記這個路由信息是否需要檢測,true 表示要檢測,false 表示不需要檢測(這個名稱隨便起,比如我自己的就起的 requiresId,建議起個有意義的名稱)
2、if (to.matched.some(record => record.meta.requiresAuth) ),如果對這類寫法不熟悉,可以去看看es6的箭頭函數,這句話就是返回遍歷的某個路由對象,我們定義為為record,檢測這個對象是否擁有meta這個對象,如果有meta這個對象,檢測它的meta對象是不是有requiresAuth這個屬性,且為true,如果滿足上述條件,就確定了是這個/foo/bar路由。
3、some() 方法測試數組中的某些元素是否通過了指定函數的測試。語法:arr.some(callback[, thisArg]);
some 為數組中的每一個元素執行一次 callback 函數,直到找到一個使得 callback 返回一個“真值”(即可轉換為布爾值 true 的值)。如果找到了這樣一個值,some 將會立即返回 true。否則,some 返回 false。callback 只會在那些”有值“的索引上被調用,不會在那些被刪除或從來未被賦值的索引上調用。
callback 被調用時傳入三個參數:元素的值,元素的索引,被遍歷的數組。
4、vue-router路由元信息說白了就是通過meta對象中的一些屬性來判斷當前路由是否需要進一步處理,如果需要處理,按照自己想要的效果進行處理即可!
總結
以上所述是小編給大家介紹的關于Vue Router中路由守衛的應用及在全局導航守衛中檢查元字段的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。