Vuerouter的beforeEach與afterEach鉤子函數(shù)的區(qū)別
在路由跳轉(zhuǎn)的時(shí)候,我們需要一些權(quán)限判斷或者其他操作。這個(gè)時(shí)候就需要使用路由的鉤子函數(shù)。
定義:路由鉤子主要是給使用者在路由發(fā)生變化時(shí)進(jìn)行一些特殊的處理而定義的函數(shù)。
總體來(lái)講vue里面提供了三大類(lèi)鉤子,兩種函數(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ù)
顧名思義,它是對(duì)全局有效的一個(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)入的路由對(duì)象
- from:當(dāng)前導(dǎo)航即將離開(kāi)的路由
- next:Function,進(jìn)行管道中的一個(gè)鉤子,如果執(zhí)行完了,則導(dǎo)航的狀態(tài)就是 confirmed (確認(rèn)的);否則為false,終止導(dǎo)航。
afterEach函數(shù)不用傳next()函數(shù)
某個(gè)路由的鉤子函數(shù)
顧名思義,它是寫(xiě)在某個(gè)路由里頭的函數(shù),本質(zhì)上跟組件內(nèi)函數(shù)沒(méi)有區(qū)別。
const router = new VueRouter({ routes: [ { path: '/login', component: Login, beforeEnter: (to, from, next) => { // ... }, beforeLeave: (to, from, next) => { // ... } } ] })
路由組件的鉤子
注意:這里說(shuō)的是路由組件!
路由組件 屬于 組件,但組件 不等同于 路由組件!所謂的路由組件:直接定義在router中component處的組件。如:
var routes = [ { path:'/home', component:home, name:"home" } ]
在子組件中調(diào)用路由的鉤子函數(shù)時(shí)無(wú)效的。
在官方文檔上是這樣定義的:
可以在路由組件內(nèi)直接定義以下路由導(dǎo)航鉤子
- beforeRouteEnter
- beforeRouteUpdate (2.2 新增)
- beforeRouteLeave
這里簡(jiǎn)單說(shuō)下鉤子函數(shù)的用法:它是和data,methods平級(jí)的。
beforeRouteLeave(to, from, next) { next() }, beforeRouteEnter(to, from, next) { next() }, beforeRouteUpdate(to, from, next) { next() }, data:{}, method: {}
PS:在使用vue-router beforeEach鉤子時(shí),你也許會(huì)遇到如下問(wèn)題:
源碼:
router.beforeEach((to, from, next) => { //判斷登錄狀態(tài)簡(jiǎn)單實(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');//獲取瀏覽器緩存的用戶(hù)信息 if(userInfo){ //如果有就直接到首頁(yè)咯 next(); } else { if(to.path=='/login'){ //如果是登錄頁(yè)面路徑,就直接next() next(); } else { //不然就跳轉(zhuǎn)到登錄; next('/login'); } } })
解決思路:
排除此時(shí)地址 = 轉(zhuǎn)向的地址 的情況,避免dead loop, 問(wèn)題很簡(jiǎn)單,但一不小心就入坑了
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vue Element前端應(yīng)用開(kāi)發(fā)之圖標(biāo)的維護(hù)和使用
在Vue Element前端應(yīng)用中,圖標(biāo)是必不可少點(diǎn)綴界面的元素,Element界面組件里面提供了很多常見(jiàn)的圖標(biāo),因此考慮擴(kuò)展更多圖標(biāo),引入了vue-awesome組件,它利用了Font Awesome的內(nèi)置圖標(biāo),實(shí)現(xiàn)了更多圖標(biāo)的整合,可以在項(xiàng)目中使用更多的圖標(biāo)元素了2021-05-05解決Vite無(wú)法分析出動(dòng)態(tài)import的類(lèi)型,控制臺(tái)出警告的問(wèn)題
這篇文章主要介紹了解決Vite無(wú)法分析出動(dòng)態(tài)import的類(lèi)型,控制臺(tái)出警告的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03vue+elementUI中el-radio設(shè)置默認(rèn)值方式
這篇文章主要介紹了vue+elementUI中el-radio設(shè)置默認(rèn)值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Element?ui中menu組件(el-menu/el-menu-item/el-submenu/template)
最近在使用Element開(kāi)發(fā)時(shí)遇到了不少問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Element?ui中menu組件(el-menu/el-menu-item/el-submenu/template)層級(jí)結(jié)構(gòu)與用法的相關(guān)資料,需要的朋友可以參考下2022-12-12如何通過(guò)Vue實(shí)現(xiàn)@人的功能
這篇文章主要介紹了如何通過(guò)vue實(shí)現(xiàn)微博中常見(jiàn)的@人的功能,同時(shí)增加鼠標(biāo)點(diǎn)擊事件和一些頁(yè)面小優(yōu)化。感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2021-12-12