摘要:有多種方式可以在路由導航發(fā)生時執(zhí)行鉤子全局的單個路由獨享的或者組件級的。進行管道中的下一個鉤子。當前的導航被中斷,然后進行一個新的導航。通過訪問組件實例路由元信息你可以在中直接訪問。
導航鉤子
vue-router 提供的導航鉤子主要用來攔截導航,讓它完成跳轉(zhuǎn)或取消。有多種方式可以在路由導航發(fā)生時執(zhí)行鉤子:全局的, 單個路由獨享的, 或者組件級的。
全局鉤子
你可以使用 router.beforeEach 注冊一個全局的 before 鉤子:
const router = new VueRouter({ ... }) router.beforeEach((to, from, next) => { // ... })
當一個導航觸發(fā)時,全局的 before 鉤子按照創(chuàng)建順序調(diào)用。鉤子是異步解析執(zhí)行,此時導航在所有鉤子 resolve 完之前一直處于 等待中。
每個鉤子方法接收三個參數(shù):
to: Route: 即將要進入的目標 路由對象 from: Route: 當前導航正要離開的路由 next: Function: 一定要調(diào)用該方法來 resolve 這個鉤子。執(zhí)行效果依賴 next 方法的調(diào)用參數(shù)。 next(): 進行管道中的下一個鉤子。如果全部鉤子執(zhí)行完了,則導航的狀態(tài)就是 confirmed (確認的)。 next(false): 中斷當前的導航。如果瀏覽器的 URL 改變了(可能是用戶手動或者瀏覽器后退按鈕),那么 URL 地址會重置到 from 路由對應的地址。 next("/") 或者 next({ path: "/" }): 跳轉(zhuǎn)到一個不同的地址。當前的導航被中斷,然后進行一個新的導航。
確保要調(diào)用 next 方法,否則鉤子就不會被 resolved。
同樣可以注冊一個全局的 after 鉤子,不過它不像 before 鉤子那樣,after 鉤子沒有 next 方法,不能改變導航:
router.afterEach(route => { // ... })
你可以在路由配置上直接定義 beforeEnter 鉤子:
const router = new VueRouter({ routes: [ { path: "/foo", component: Foo, beforeEnter: (to, from, next) => { // ... } } ] })
這些鉤子與全局 before 鉤子的方法參數(shù)是一樣的。
組件內(nèi)的鉤子
最后,你可以在路由組件內(nèi)直接定義以下路由導航鉤子:
beforeRouteEnter beforeRouteUpdate (2.2 新增) beforeRouteLeave const Foo = { template: `...`, beforeRouteEnter (to, from, next) { // 在渲染該組件的對應路由被 confirm 前調(diào)用 // 不!能!獲取組件實例 `this` // 因為當鉤子執(zhí)行前,組件實例還沒被創(chuàng)建 }, beforeRouteUpdate (to, from, next) { // 在當前路由改變,但是該組件被復用時調(diào)用 // 舉例來說,對于一個帶有動態(tài)參數(shù)的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉(zhuǎn)的時候, // 由于會渲染同樣的 Foo 組件,因此組件實例會被復用。而這個鉤子就會在這個情況下被調(diào)用。 // 可以訪問組件實例 `this` }, beforeRouteLeave (to, from, next) { // 導航離開該組件的對應路由時調(diào)用 // 可以訪問組件實例 `this` } }
beforeRouteEnter 鉤子 不能 訪問 this,因為鉤子在導航確認前被調(diào)用,因此即將登場的新組件還沒被創(chuàng)建。
不過,你可以通過傳一個回調(diào)給 next來訪問組件實例。在導航被確認的時候執(zhí)行回調(diào),并且把組件實例作為回調(diào)方法的參數(shù)。
beforeRouteEnter (to, from, next) { next(vm => { // 通過 `vm` 訪問組件實例 }) }路由元信息
你可以 在 beforeRouteLeave 中直接訪問 this。這個 leave 鉤子通常用來禁止用戶在還未保存修改前突然離開。可以通過 next(false) 來取消導航。
定義路由的時候可以配置 meta 字段:
const router = new VueRouter({ routes: [ { path: "/foo", component: Foo, children: [ { path: "bar", component: Bar, // a meta field meta: { requiresAuth: true } } ] } ] })
那么如何訪問這個 meta 字段呢?
首先,我們稱呼 routes 配置中的每個路由對象為 路由記錄。路由記錄可以是嵌套的,因此,當一個路由匹配成功后,他可能匹配多個路由記錄
例如,根據(jù)上面的路由配置,/foo/bar 這個 URL 將會匹配父路由記錄以及子路由記錄。
一個路由匹配到的所有路由記錄會暴露為 $route 對象(還有在導航鉤子中的 route 對象)的 $route.matched 數(shù)組。因此,我們需要遍歷 $route.matched 來檢查路由記錄中的 meta 字段。
下面例子展示在全局導航鉤子中檢查 meta 字段:
router.beforeEach((to, from, next) => { if (to.matched.some(record => record.meta.requiresAuth)) { // this route requires auth, check if logged in // if not, redirect to login page. if (!auth.loggedIn()) { next({ path: "/login", query: { redirect: to.fullPath } }) } else { next() } } else { next() // 確保一定要調(diào)用 next() } })
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/91760.html
摘要:簡單介紹主人公字段介紹我們稱每個路由對象為路由記錄,路由記錄可以嵌套。所以到我們匹配到一個路有的時候他有可能有多條路由記錄。 路由元信息 為什么會有這個東西呢?我們知道我們?yōu)g覽一些網(wǎng)站的時候有需要驗證登錄的也有不需要驗證登錄的,如果所有頁面都在做成驗證登錄的話對于用戶的體驗也是極差的,所以這個時候路由元信息就起到了很大的作用。 簡單介紹 主人公:meta字段 介紹:我們稱每個路由對象為...
摘要:滾動行為使用前端路由,當切換到新路由時,想要頁面滾到頂部,或者是保持原先的滾動位置,就像重新加載頁面那樣。這個方法返回滾動位置的對象信息,長這樣如果返回一個布爾假的值,或者是一個空對象,那么不會發(fā)生滾動。 滾動行為 使用前端路由,當切換到新路由時,想要頁面滾到頂部,或者是保持原先的滾動位置,就像重新加載頁面那樣。 vue-router 能做到,而且更好,它讓你可以自定義路由切換時頁面...
摘要:簡介主要用來通過跳轉(zhuǎn)或取消的方式守衛(wèi)導航。判斷必要操作是否進行沒進行的話中斷跳轉(zhuǎn)。進行管道中的下一個鉤子。如果全部鉤子執(zhí)行完了,則導航的狀態(tài)就是確認的。中斷當前的導航。如果傳入的參數(shù)是一個實例,則導航會被終止且該錯誤會被傳遞給注冊過的回調(diào)。 簡介 主要用來通過跳轉(zhuǎn)或取消的方式守衛(wèi)導航。例如判斷登錄信息:沒登錄全部跳到登錄頁。判斷必要操作是否進行沒進行的話中斷跳轉(zhuǎn)。 分為三大類:全局守衛(wèi)...
摘要:你可以使用注冊一個全局的鉤子鉤子函數(shù)的三個參數(shù)即將要進入的目標路由對象當前導航正要離開的路由一定要調(diào)用該方法來這個鉤子。 Vue-router(路由) 在web開發(fā)中,router是指根據(jù)url分配到對應的處理程序 CDN引入: //vue //vue-router NPM安裝 npm install vue-router 開始使用 在使用Vue.js的時候,我們通過組合組件來組...
閱讀 2176·2023-04-25 15:00
閱讀 2350·2021-11-18 13:14
閱讀 1172·2021-11-15 11:37
閱讀 3093·2021-09-24 13:55
閱讀 1231·2019-08-30 15:52
閱讀 2650·2019-08-29 12:35
閱讀 3367·2019-08-29 11:04
閱讀 1213·2019-08-26 12:13