vue中的導(dǎo)航守衛(wèi)使用及說(shuō)明
導(dǎo)航守衛(wèi)
- 作用:對(duì)路由進(jìn)行權(quán)限控制
- 分類(lèi):全局守衛(wèi)、獨(dú)享守衛(wèi)、組件內(nèi)守衛(wèi)
全局守衛(wèi)
const router = new VueRouter({ routes: [ { path: '/home', component: Home, meta: { isAuth: false }, // 不需要進(jìn)行權(quán)限控制 }, { path: '/user', component: User, meta: { isAuth: true }, // 需要進(jìn)行權(quán)限控制 }, ] }) // 全局前置守衛(wèi):初始化時(shí)執(zhí)行/每次路由切換前執(zhí)行 router.beforeEach((to,from,next) => { if(to.meta.isAuth) { // 判斷當(dāng)前路由是否需要進(jìn)行權(quán)限控制(在需要進(jìn)行權(quán)限控制的路由中配置isAuth屬性) if(localStorage.getItem('xxx') === 'xxx') { // 權(quán)限控制的具體規(guī)則 next(); // 放行 }else { ... } } else { // 當(dāng)前路由不需要進(jìn)行權(quán)限控制 next(); // 直接放行 } }) // 全局后置守衛(wèi):初始化時(shí)執(zhí)行,每次路由切換后執(zhí)行 router.afterEach((to,from) => { if(to.meta.title) { document.title = to.meta.title; // 修改網(wǎng)頁(yè)的title }else { document.title = 'xxx'; } })
獨(dú)享守衛(wèi)
加在某個(gè)路由的配置中
beforeEnter((to,from,next) => { ? if(to.meta.isAuth) { ?// 判斷當(dāng)前路由是否需要進(jìn)行權(quán)限控制(在需要進(jìn)行權(quán)限控制的路由中配置isAuth屬性) ? ? if(localStorage.getItem('xxx') === 'xxx') { // 權(quán)限控制的具體規(guī)則 ? ? ? next(); ? // 放行 ? ? }else { ? ? ? ... ? ? } ? } else { ?// 當(dāng)前路由不需要進(jìn)行權(quán)限控制 ? ? next(); // 直接放行 ? } })
組件內(nèi)守衛(wèi)
// 進(jìn)入守衛(wèi),通過(guò)路由規(guī)則,進(jìn)入該組件時(shí)被調(diào)用 beforeRouteEnter(to,from,next){ ... } // 當(dāng)前路由改變,但是該組件被復(fù)用時(shí)調(diào)用 // 舉例來(lái)說(shuō),對(duì)于一個(gè)帶有動(dòng)態(tài)參數(shù)的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉(zhuǎn)的時(shí)候, // 由于會(huì)渲染同樣的 Foo 組件,組件實(shí)例會(huì)被復(fù)用。而這個(gè)鉤子就會(huì)被調(diào)用 beforeRouteUpdate(to,from,next{ ... } // 離開(kāi)守衛(wèi),通過(guò)路由規(guī)則,離開(kāi)該組件時(shí)被調(diào)用 beforeRouteLeave(to,from,next){ ... }
vue導(dǎo)航守衛(wèi)有哪些
路由的鉤子函數(shù)有六個(gè)
- 全局的路由鉤子函數(shù):beforeEach、afterEach
- 單個(gè)路由的鉤子函數(shù):beforeEnter
- 組件內(nèi)路由鉤子函數(shù):beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave
全局路由鉤子函數(shù)
1、全局前置守衛(wèi): beforeEach(to, from, next)
router.beforeEach
: 在每次每一個(gè)路由改變的時(shí)候都會(huì)執(zhí)行一遍
to
:將要進(jìn)入的路由對(duì)象from
: 當(dāng)前正要離開(kāi)的路由對(duì)象next
next()
,進(jìn)入下一個(gè)路由,必須調(diào)用,不然不會(huì)跳轉(zhuǎn)
next(false)
: 中斷當(dāng)前的導(dǎo)航。如果瀏覽器的 URL 改變了 (可能是用戶手動(dòng)或者瀏覽器后退按鈕),那么 URL 地址會(huì)重置到 from 路由對(duì)應(yīng)的地址。
next(’/’)
或者 next({ paht:’/’})
:跳轉(zhuǎn)到一個(gè)不同的地址。當(dāng)前的導(dǎo)航會(huì)被中斷,然后進(jìn)行一個(gè)新的導(dǎo)航。可傳遞的參數(shù)可以是 router-link 標(biāo)簽中的 to 屬性參數(shù)或 router.push 中的選項(xiàng)
應(yīng)用場(chǎng)景:可進(jìn)行一些頁(yè)面跳轉(zhuǎn)前處理,例如判斷需要登錄的頁(yè)面進(jìn)行攔截,做登錄跳轉(zhuǎn), 還有管理員權(quán)限判斷。
2、全局后置守衛(wèi):afterEach(to, from)
router.afterEach: 和 beforeEach 相反,它是在路由跳轉(zhuǎn)完成后觸發(fā),它發(fā)生在 beforeEach 之后 beforeRouteEnter(組件內(nèi)守衛(wèi)) 之前, 因?yàn)槭翘D(zhuǎn)完成后觸發(fā),所以沒(méi)有 next 參數(shù)。
路由內(nèi)的鉤子函數(shù)
路由獨(dú)享守衛(wèi):beforeEnter(to, from, next)
和 beforeEach 完全相同,如果兩個(gè)都設(shè)置了,beforeEnter 則在 beforeEach 之后緊隨執(zhí)行。在路由配置上直接定義 beforeEnter 守衛(wèi)
組件內(nèi)的鉤子函數(shù)
是指在組件內(nèi)執(zhí)行的鉤子函數(shù),類(lèi)似于組件內(nèi)的生命周期
- 組件前置守衛(wèi) beforeRouteEnter: 該鉤子在全局守衛(wèi) beforeEach 和獨(dú)享守衛(wèi) beforeEnter 之后。
- 組件更新守衛(wèi) beforeRouteUpdate:在當(dāng)前路由改變時(shí),并且該組件被復(fù)用時(shí)調(diào)用。
- 組件離開(kāi)守衛(wèi) beforeRouteLeave:導(dǎo)航離開(kāi)該組件的對(duì)應(yīng)路由時(shí)調(diào)用
const Foo = { template: `...`, beforeRouteEnter (to, from, next) { // 在渲染該組件的對(duì)應(yīng)路由被 confirm 前調(diào)用 // 不!能!獲取組件實(shí)例 `this` // 因?yàn)楫?dāng)鉤子執(zhí)行前,組件實(shí)例還沒(méi)被創(chuàng)建 }, beforeRouteUpdate (to, from, next) { // 在當(dāng)前路由改變,但是該組件被復(fù)用時(shí)調(diào)用 // 舉例來(lái)說(shuō),對(duì)于一個(gè)帶有動(dòng)態(tài)參數(shù)的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉(zhuǎn)的時(shí)候, // 由于會(huì)渲染同樣的 Foo 組件,因此組件實(shí)例會(huì)被復(fù)用。而這個(gè)鉤子就會(huì)在這個(gè)情況下被調(diào)用。 // 可以訪問(wèn)組件實(shí)例 `this` }, beforeRouteLeave (to, from, next) { // 導(dǎo)航離開(kāi)該組件的對(duì)應(yīng)路由時(shí)調(diào)用 // 可以訪問(wèn)組件實(shí)例 `this` }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue實(shí)現(xiàn)時(shí)間倒計(jì)時(shí)功能
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)時(shí)間倒計(jì)時(shí)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08Vue+jsPlumb實(shí)現(xiàn)連線效果(支持滑動(dòng)連線和點(diǎn)擊連線)
jsPlumb 是一個(gè)比較強(qiáng)大的繪圖組件,它提供了一種方法,主要用于連接網(wǎng)頁(yè)上的元素。本文將利用jsPlumb實(shí)現(xiàn)連線效果,同時(shí)支持滑動(dòng)連線和點(diǎn)擊連線,感興趣的可以了解一下2023-01-01vue Cli 環(huán)境刪除與重裝教程 - 版本文檔
這篇文章主要介紹了vue Cli 環(huán)境刪除與重裝教程 - 版本文檔,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09淺談Vue中的this.$store.state.xx.xx
這篇文章主要介紹了Vue中的this.$store.state.xx.xx用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09使用vue-cli腳手架工具搭建vue-webpack項(xiàng)目
這篇文章主要介紹了使用vue-cli腳手架工具搭建vue-webpack項(xiàng)目,通過(guò)幾個(gè)默認(rèn)的步驟幫助你快速的構(gòu)建Vue.js項(xiàng)目。非常具有實(shí)用價(jià)值,需要的朋友可以參考下2019-01-01