Vue Router 作為一個強多的路由管理插件,可以幫助我們快速地構建單頁應用。當應用中需要實現權限控制的時候,Vue Router 提供了很好的解決方案。基于 Vue Router 提供的鉤子函數及一些相關的 API,我們可以輕松實現路由跳轉前的權限校驗,保證只有具備權限的用戶才能訪問相應的頁面。
import router from '@/router';
import store from '@/store';
router.beforeEach((to, from ,next) =>{
const userInfo = store.getters['user/userInfo'];
if (to.meta.auth && !userInfo) {
next({
path: '/login',
query: {
redirect: to.fullPath,
},
});
} else {
next();
}
});
上述代碼片段展示了 Vue Router 中的全局前置守衛 beforeEach 函數。該函數會在路由切換前被調用,我們可以在該函數中進行用戶權限認證等操作。在這里,我們從 Vuex 中獲取當前登錄用戶的信息,據此來判斷用戶是否具備訪問該路由的權限。如果用戶未登錄且該路由需要登錄后才能訪問,我們可以進行相應的跳轉,防止用戶越權訪問。
除了全局守衛函數,Vue Router 還為開發者提供了路由獨享的守衛函數。在路由配置中,我們可以設置 beforeEnter 屬性,同時在該屬性中書寫路由獨享的前置守衛函數,這些函數會在進入該路由時被調用。
const router = new Router({
routes: [
{
path: '/order',
name: 'order',
component: () =>import('@/views/order/Order.vue'),
beforeEnter: (to, from, next) =>{
const userInfo = store.getters['user/userInfo'];
if (to.meta.auth && !userInfo) {
next({
path: '/login',
query: {
redirect: to.fullPath,
},
});
} else {
next();
}
}
}
]
});
如上所示,我們在路由配置中通過 beforeEnter 屬性設置了路由獨享的守衛函數。在該函數中實現了上述全局守衛函數中所述的功能。需要注意的是,路由獨享的守衛函數并不會替代全局守衛函數,在路由跳轉過程中,兩者會一起被調用,以便保證用戶能否訪問該路由的判斷正確。
除了前置守衛函數外,Vue Router 還支持后置守衛函數 afterEach。和 beforeEach 函數類似,該函數也是全局函數,會在每次路由完成切換后被調用。開發者可以利用該函數,在路由切換后進行一些必要的清理工作等操作。
router.afterEach(() =>{
window.scrollTo(0, 0);
});
如上所示,我們可以在 afterEach 函數中調用 window.scrollTo 函數,將頁面滾動到頂部。這有助于用戶更好地使用頁面,增強用戶體驗。