vue導航鉤子

vue2跟vue3的全局跟組件路由鉤子的使用區(qū)別

在Vue 3中,組件路由鉤子的使用方式與Vue 2類似,全局的鉤子還是一樣,不變
組件鉤子,組件內(nèi)鉤子優(yōu)點變化

  • 使用組件選項(傳統(tǒng)方式):盡管你正在使用Vue 3,但你仍然可以像Vue 2一樣,通過組件選項來使用路由鉤子:
  • 使用Composition API: Router 提供了onBeforeRouteLeave和onBeforeRouteUpdate這兩個
  • 確實需要在 setup() 中處理與 beforeRouteEnter 類似的邏輯,并且需要訪問組件實例應該怎么做:watch監(jiān)聽路由
    全局導航鉤子
    組件鉤子
    路由獨享的鉤子
    全局導航鉤子主要有兩種鉤子:前置守衛(wèi)、后置鉤子
const router = new VueRouter({ ... });
router.beforeEach((to, from, next) => {
    // do someting
});
router.afterEach((to, from) => {
    // do someting
});
//不同于前置守衛(wèi),后置鉤子并沒有 next 函數(shù),也不會改變路由導航本身方向了
  1. 組建內(nèi)的導航鉤子
    組件內(nèi)的導航鉤子主要有這三種:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave。他們是直接在路由組件內(nèi)部直接進行定義的
    我們看一下他的具體用法:
const File = {
    template: `<div>This is file</div>`,
    beforeRouteEnter(to, from, next) {
        // do someting
        // beforeRouteEnter 不能獲取組件實例 this,因為當守衛(wèi)執(zhí)行前,組件實例被沒有被創(chuàng)建出來,剩下兩個鉤子則可以正常獲取組件實例 this
        // 但是并不意味著在 beforeRouteEnter 中無法訪問組件實例,我們可以通過給 next 傳入一個回調(diào)來訪問組件實例,導航被確認是,會執(zhí)行這個回調(diào),
        // 這時就可以訪問組件實例了,如:在渲染該組件的對應路由被 confirm 前調(diào)用。如:
        next (vm => {
           let that = vm;
           // 這里通過 vm 來訪問組件實例解決了沒有 this 的問題
        })
    },
    beforeRouteUpdate(to, from, next) {
        // do someting
        // 在當前路由改變,但是依然渲染該組件是調(diào)用
    },
    beforeRouteUpdate(to, from, next) {
      //在當前路由改變,但是該組件被復用時調(diào)用
      //對于一個帶有動態(tài)參數(shù)的路徑 /good/:id,在 /good/1 和 /good/2 之間跳轉(zhuǎn)的時候,
      // 由于會渲染同樣的good組件,因此組件實例會被復用。而這個鉤子就會在這個情況下被調(diào)用。
      // 可以訪問組件實例 `this`
      console.log("****************Test1*******Update***********");
      console.log(this, 'Update'); //當前組件實例
      console.log('to', to);
      console.log('from', from);
      console.log('next', next);
      next();
    }
    beforeRouteLeave(to, from ,next) {
        // do someting
        // 導航離開該組件的對應路由時被調(diào)用
    }
}
//注意,僅僅是 beforRouteEnter 支持給 next 傳遞回調(diào),其他兩個并不支持。
//因為歸根結(jié)底,支持回調(diào)是為了解決 this 問題,而其他兩個鉤子的 this 可以正確訪問到組件實例,所有沒有必要使用回調(diào)
  1. 路由獨享的鉤子

顧名思義,即單個路由獨享的導航鉤子,它是在路由配置上直接進行定義的:

cont router = new VueRouter({
    routes: [
        {
            path: '/file',
            component: File,
            beforeEnter: (to, from ,next) => {
                // do someting
            }
        }
    ]
});

記法:除了全局的后置鉤子是after:afterEach開頭,其余的都是before開頭:beforeEach、beforeRouteUpdate,beforeRouteLeave、beforeEnterbeforeRouteEnter,這些鉤子作用是confirmed(確認的)導航的狀態(tài)的,

vue路由當中的導航鉤子中關于next()方法的理解

背景:你乘坐汽車從A景區(qū)想趕往B景區(qū)(模擬路由A跳轉(zhuǎn)到路由B)

1.next()
進行管道中的下一個鉤子。如果全部鉤子執(zhí)行完了,則導航的狀態(tài)就是confirmed(確認的)。
你乘坐汽車要從A景區(qū)到B景區(qū),路過關卡時,守門人攔下你,你量出了next(),守門人一看沒問題,趕緊放行,于是你順利到達了B景區(qū)。

2.next(false)
next( false )中斷當前的導航。如果瀏覽器的 URL 改變了 (可能是用戶手動或者瀏覽器后退按鈕),那么 URL 地址會重置到from路由對應的地址。

如果你量出了next(false),守門人立馬關住大門,不讓你走,哪都不讓你去,你說想換個交通方式,走路或者坐飛機,都不行,老實待在A景區(qū)吧

3.next(’/’)
next( ’ / ‘)或者next({ paht:’ / ’ }):跳轉(zhuǎn)到一個不同的地址。當前的導航被中斷,然后進行一個新的導航??蓚鬟f的參數(shù)可以是router-link標簽中的to屬性參數(shù)或router.push中的選項
你原本打算從A景區(qū)到B景區(qū),但是走到關卡的時候由于某些原因改變了主意,想要去C景區(qū),你對守門員量出了next({path:’/C’}),守門員一看,哦,原來你不去B了,要去C啊,去吧去吧,然后你順利到達了C景區(qū)

4.next(error)
next( error ):如果傳入next的參數(shù)是一個Error實例,則導航會被終止且該錯誤會被傳遞給router.onError()注冊過的回調(diào)。
你在出發(fā)之前,給你媽媽說,媽,要是有什么事我立馬通知你,你記得查看消息?。阕粤藃outer.onError())走到中途,出現(xiàn)了意外,你發(fā)出next(error),然后你媽就收到了消息,趕緊打電話問你怎么了(執(zhí)行router.onError()里的回調(diào))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容