Vuerouter的beforeEach與afterEach鉤子函數(shù)的區(qū)別
在路由跳轉(zhuǎn)的時(shí)候,我們需要一些權(quán)限判斷或者其他操作。這個(gè)時(shí)候就需要使用路由的鉤子函數(shù)。
定義:路由鉤子主要是給使用者在路由發(fā)生變化時(shí)進(jìn)行一些特殊的處理而定義的函數(shù)。
總體來講vue里面提供了三大類鉤子,兩種函數(shù)
1、全局鉤子
2、某個(gè)路由的鉤子
3、組件內(nèi)鉤子
兩種函數(shù):
1、Vue.beforeEach(function(to,form,next){}) /*在跳轉(zhuǎn)之前執(zhí)行*/
2.Vue.afterEach(function(to,form))/*在跳轉(zhuǎn)之后判斷*/
全局鉤子函數(shù)
顧名思義,它是對全局有效的一個(gè)函數(shù)
router.beforeEach((to, from, next) => {
let token = router.app.$storage.fetch("token");
let needAuth = to.matched.some(item => item.meta.login);
if(!token && needAuth) return next({path: "/login"});
next();
});
beforeEach函數(shù)有三個(gè)參數(shù):
- to:router即將進(jìn)入的路由對象
- from:當(dāng)前導(dǎo)航即將離開的路由
- next:Function,進(jìn)行管道中的一個(gè)鉤子,如果執(zhí)行完了,則導(dǎo)航的狀態(tài)就是 confirmed (確認(rèn)的);否則為false,終止導(dǎo)航。
afterEach函數(shù)不用傳next()函數(shù)
某個(gè)路由的鉤子函數(shù)
顧名思義,它是寫在某個(gè)路由里頭的函數(shù),本質(zhì)上跟組件內(nèi)函數(shù)沒有區(qū)別。
const router = new VueRouter({
routes: [
{
path: '/login',
component: Login,
beforeEnter: (to, from, next) => {
// ...
},
beforeLeave: (to, from, next) => {
// ...
}
}
]
})
路由組件的鉤子
注意:這里說的是路由組件!
路由組件 屬于 組件,但組件 不等同于 路由組件!所謂的路由組件:直接定義在router中component處的組件。如:
var routes = [
{
path:'/home',
component:home,
name:"home"
}
]
在子組件中調(diào)用路由的鉤子函數(shù)時(shí)無效的。
在官方文檔上是這樣定義的:
可以在路由組件內(nèi)直接定義以下路由導(dǎo)航鉤子
- beforeRouteEnter
- beforeRouteUpdate (2.2 新增)
- beforeRouteLeave
這里簡單說下鉤子函數(shù)的用法:它是和data,methods平級的。
beforeRouteLeave(to, from, next) {
next()
},
beforeRouteEnter(to, from, next) {
next()
},
beforeRouteUpdate(to, from, next) {
next()
},
data:{},
method: {}
PS:在使用vue-router beforeEach鉤子時(shí),你也許會(huì)遇到如下問題:
源碼:
router.beforeEach((to, from, next) => {
//判斷登錄狀態(tài)簡單實(shí)例
var userInfo = window.localStorage.getItem('token');
if (userInfo) {
next();
} else {
next('/login');
}
})
然后你會(huì)發(fā)現(xiàn)出現(xiàn)如下錯(cuò)誤:出現(xiàn)dead loop錯(cuò)誤

解決方案:
router.beforeEach((to, from, next) => {
var userInfo = window.localStorage.getItem('token');//獲取瀏覽器緩存的用戶信息
if(userInfo){ //如果有就直接到首頁咯
next();
} else {
if(to.path=='/login'){ //如果是登錄頁面路徑,就直接next()
next();
} else { //不然就跳轉(zhuǎn)到登錄;
next('/login');
}
}
})
解決思路:
排除此時(shí)地址 = 轉(zhuǎn)向的地址 的情況,避免dead loop, 問題很簡單,但一不小心就入坑了
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
nginx+vite項(xiàng)目打包以及部署的詳細(xì)過程
我們使用nginx部署Vue項(xiàng)目,實(shí)質(zhì)上就是將Vue項(xiàng)目打包后的內(nèi)容同步到nginx指向的文件夾,下面這篇文章主要給大家介紹了關(guān)于nginx+vite項(xiàng)目打包以及部署的相關(guān)資料,需要的朋友可以參考下2023-01-01
vue最強(qiáng)table vxe-table 虛擬滾動(dòng)列表 前端導(dǎo)出問題分析
最近遇到個(gè)問題,后臺一次性返回2萬條列表數(shù)據(jù)并且需求要求所有數(shù)據(jù)必須全部展示,不能做假分頁,怎么操作呢,下面通過本文介紹下vue最強(qiáng)table vxe-table 虛擬滾動(dòng)列表 前端導(dǎo)出問題,感興趣的朋友一起看看吧2023-10-10
前端單獨(dú)實(shí)現(xiàn)vue動(dòng)態(tài)路由的示例代碼
Vue動(dòng)態(tài)路由權(quán)限涉及根據(jù)用戶權(quán)限動(dòng)態(tài)生成路由配置,實(shí)現(xiàn)此功能可增強(qiáng)應(yīng)用安全性、靈活性,提升用戶體驗(yàn)和開發(fā)效率,本文就來介紹一下前端單獨(dú)實(shí)現(xiàn)vue動(dòng)態(tài)路由的示例代碼,感興趣的可以了解一下2024-09-09
Vue中對比scoped css和css module的區(qū)別
這篇文章主要介紹了Vue中scoped css和css module的區(qū)別對比,scoped css可以直接在能跑起來的vue項(xiàng)目中使用而css module需要增加css-loader配置才能生效。具體內(nèi)容詳情大家參考下本文2018-05-05
vue3模塊創(chuàng)建runtime-dom源碼解析
這篇文章主要為大家介紹了vue3模塊創(chuàng)建runtime-dom源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
vue-router清除url地址欄路由參數(shù)的操作代碼
這篇文章主要介紹了vue-router清除url地址欄路由參數(shù),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2015-11-11

