詳解vue-router導航守衛(wèi)
當做Vue-cli項目的時候需要在路由跳轉前做一些驗證,比如登錄驗證,是網站中的普遍需求。
對此,vue-router 提供的 beforeEach可以方便地實現全局導航守衛(wèi)(navigation-guards)。組件內部的導航守衛(wèi)函數使用相同,只是函數名稱不同(beforeRouteEnter 、beforeRouteUpdate(2.2 新增) 、beforeRouteLeave)。
鉤子(Hook),早期編程可能有個概念叫句柄,不知道將兩者類比而且強行歸為一類是不是合適。鉤子的用處是在某個特定流程中的不同時機暴露出一些函數,使得用戶可以通過覆寫這些函數實現在原有位置執(zhí)行自己的代碼邏輯的功能。
1. 分類
vue-router中的導航鉤子按定義位置不同(執(zhí)行時機也不同)分為全局鉤子、路由級鉤子和組件級鉤子。
- 全局鉤子
全局鉤子有三個,分別是beforeEach、beforeResolve和afterEach,在路由實例對象注冊使用;
- 路由級鉤子
路由級鉤子有beforeEnter,在路由配置項中項定義;
- 組件級鉤子
組件級鉤子有beforeRouteEnter、beforeRouteUpdate和beforeRouteLeave,在組件屬性中定義;
官方文檔地址:https://router.vuejs.org/zh-cn/advanced/navigation-guards.html
如何設置一個全局守衛(wèi)
你可以使用 router.beforeEach 注冊一個全局前置守衛(wèi):就是在你router配置的下方注冊
const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
// ...
})
當一個導航觸發(fā)時,全局前置守衛(wèi)按照創(chuàng)建順序調用。守衛(wèi)是異步解析執(zhí)行,此時導航在所有守衛(wèi) resolve 完之前一直處于 等待中。
每個守衛(wèi)方法接收三個參數:
to: Route: 即將要進入的目標 路由對象
from: Route: 當前導航正要離開的路由
next: Function: 一定要調用該方法來 resolve 這個鉤子。執(zhí)行效果依賴 next 方法的調用參數。
- next(): 進行管道中的下一個鉤子。如果全部鉤子執(zhí)行完了,則導航的狀態(tài)就是 confirmed (確認的)。
- next(false): 中斷當前的導航。如果瀏覽器的 URL 改變了(可能是用戶手動或者瀏覽器后退按鈕),那么 URL 地址會重置到 from 路由對應的地址。
- next('/') 或者 next({ path: '/' }): 跳轉到一個不同的地址。當前的導航被中斷,然后進行一個新的導航。你可以向 next 傳遞任意位置對象,且允許設置諸如 replace: true、name: 'home' 之類的選項以及任何用在 router-link 的 to prop 或 router.push 中的選項。
- next(error): (2.4.0+) 如果傳入 next 的參數是一個 Error 實例,則導航會被終止且該錯誤會被傳遞給 router.onError() 注冊過的回調。
確保要調用 next 方法,否則鉤子就不會被 resolved。
一、認識beforeEach()中的參數


全局守衛(wèi)(就是對整個路由實例進行守衛(wèi),對其中的子路由也會進行守衛(wèi))

路由獨享的守衛(wèi)(對實例中某個路由進行守衛(wèi))

小結:
全局和局部
import Vue from 'vue';
import VueRouter from 'vue-router';
// Vue中插件必須use注冊
Vue.use(VueRouter);
// 路由配置項,此處是路由級鉤子的定義
const routes = [{
path: '/',
component: resolve => require(['./index.vue'], resolve),
keepAlive: true,
},
{
path: '/user/:userName',
keepAlive: true,
beforeEnter(to,from,next){
console.log('router beforeEnter');
next();
},
component: resolve => require(['./user.vue'], resolve),
}];
// 實例化路由對象
const router = new VueRouter({
routes
});
// 全局鉤子
router.beforeEach((to,from,next)=>{
console.log('global beforeEach')
next();
});
router.beforeResolve((to,from,next)=>{
console.log('global beforeResolve')
next();
});
router.afterEach((to,from,next)=>{
console.log('global afterEach')
});
// 實例化Vue對象并掛載
new Vue({
router
}).$mount('#app');
use.vue組件中使用導航守衛(wèi)
<template>
<div>
<h1>{{ msg }}</h1>
<p>我是:{{userName}}</p>
</div>
</template>
<script>
export default {
name: 'user',
data () {
return {
msg: '這里是 User Page.',
userName: '葉落'
};
},
methods: {},
mounted () {
var me = this;
me.userName = me.$route.params.userName;
console.log('user mounted.');
},
beforeRouteEnter (to, from, next) {
console.log('component beforeRouteEnter');
next();
},
beforeRouteUpdate (to, from, next) {
console.log('component beforeRouteUpdate');
next();
},
beforeRouteLeave(to,from,next){
console.log('component beforeRouteLeave');
next();
}
};
</script>
執(zhí)行時機
由首頁進入user頁面:
global beforeEach > router beforeEnter > component beforeRouteEnter > global beforeResolve > global afterEach > mounted
由user回到首頁:
component beforeRouteLeave => global beforeEach => global beforeResolve => global afterEach
排除beforeRouteUpdate,其余六個導航鉤子的執(zhí)行時機其實很好理解。大體按照leave、before、enter、resolve、after的順序并全局優(yōu)先的思路執(zhí)行。beforeRouteUpdate的觸發(fā)是在動態(tài)路由情形下,比如 path: '/user/:userName' 這條路由,當頁面不變更只動態(tài)的改變參數userName時,beforeRouteUpdate便會觸發(fā)。

結論:使用vue組件拼湊成整個應用,每個頁面是獨立的,路由依靠鏈接跳轉,會刷新頁面。使用vue-router則可以不刷新頁面加載對應組件,hash和history模式模擬路徑變化,不刷新頁面。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
相關文章
vue安裝node-sass和sass-loader報錯問題的解決辦法
這篇文章主要給大家介紹了關于vue安裝node-sass和sass-loader報錯問題的解決辦法,文中通過圖文以及示例代碼將解決的方法介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2023-01-01
vue 解決addRoutes動態(tài)添加路由后刷新失效問題
這篇文章主要介紹了vue 解決addRoutes動態(tài)添加路由后刷新失效問題,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
vue轉electron項目及解決使用fs報錯:Module?not?found:?Error:?Can&apo
這篇文章主要給大家介紹了關于vue轉electron項目及解決使用fs報錯:Module?not?found:?Error:?Can‘t?resolve?‘fs‘?in的相關資料,文中通過圖文以及實例代碼介紹的非常詳細,需要的朋友可以參考下2022-11-11
vue2.5.2使用http請求獲取靜態(tài)json數據的實例代碼
這篇文章主要介紹了vue2.5.2使用http請求獲取靜態(tài)json數據的實例代碼,需要的朋友可以參考下2018-02-02

