vue-router中的鉤子函數(shù)和執(zhí)行順序說明
一:全局導(dǎo)航鉤子函數(shù)
1、vue router.beforeEach(全局前置守衛(wèi))
beforeEach的鉤子函數(shù),它是一個(gè)全局的before 鉤子函數(shù), (before each)意思是在 每次每一個(gè)路由改變的時(shí)候都得執(zhí)行一遍。
它的三個(gè)參數(shù):
to: (Route路由對(duì)象) 即將要進(jìn)入的目標(biāo) 路由對(duì)象 to對(duì)象下面的屬性: path params query hash fullPath matched name meta(在matched下,但是本例可以直接用)from: (Route路由對(duì)象) 當(dāng)前導(dǎo)航正要離開的路由next: (Function函數(shù)) 一定要調(diào)用該方法來 resolve 這個(gè)鉤子。 調(diào)用方法:next(參數(shù)或者空) ***必須調(diào)用- next(無參數(shù)的時(shí)候): 進(jìn)行管道中的下一個(gè)鉤子,如果走到最后一個(gè)鉤子函數(shù),那么 導(dǎo)航的狀態(tài)就是 confirmed (確認(rèn)的)
- next('/') 或者 next({ path: '/' }): 跳轉(zhuǎn)到一個(gè)不同的地址。當(dāng)前的導(dǎo)航被中斷,然后進(jìn)行一個(gè)新的導(dǎo)航。
- 應(yīng)用場(chǎng)景:可進(jìn)行一些頁面跳轉(zhuǎn)前處理,例如判斷需要登錄的頁面進(jìn)行攔截,做登錄跳轉(zhuǎn)??!
router.beforeEach((to, from, next) => {
? ? if (to.meta.requireAuth) {
? ? ? ? //判斷該路由是否需要登錄權(quán)限
? ? ? ? if (cookies('token')) {
? ? ? ? ? ? //通過封裝好的cookies讀取token,如果存在,name接下一步如果不存在,那跳轉(zhuǎn)回登錄頁
? ? ? ? ? ? next()//不要在next里面加"path:/",會(huì)陷入死循環(huán)
? ? ? ? }
? ? ? ? else {
? ? ? ? ? ? next({
? ? ? ? ? ? ? ? path: '/login',
? ? ? ? ? ? ? ? query: {redirect: to.fullPath}//將跳轉(zhuǎn)的路由path作為參數(shù),登錄成功后跳轉(zhuǎn)到該路由
? ? ? ? ? ? })
? ? ? ? }
? ? }
? ? else {
? ? ? ? next()
? ? }
})應(yīng)用場(chǎng)景,進(jìn)入頁面登錄判斷、管理員權(quán)限判斷、瀏覽器判斷
//使用鉤子函數(shù)對(duì)路由進(jìn)行權(quán)限跳轉(zhuǎn)
router.beforeEach((to, from, next) => {
? ? const role = localStorage.getItem('ms_username');
? ? if(!role && to.path !== '/login'){
? ? ? ? next('/login');
? ? }else if(to.meta.permission){
? ? ? ? // 如果是管理員權(quán)限則可進(jìn)入,這里只是簡(jiǎn)單的模擬管理員權(quán)限而已
? ? ? ? role === 'admin' ? next() : next('/403');
? ? }else{
? ? ? ? // 簡(jiǎn)單的判斷IE10及以下不進(jìn)入富文本編輯器,該組件不兼容
? ? ? ? if(navigator.userAgent.indexOf('MSIE') > -1 && to.path === '/editor'){
? ? ? ? ? ? Vue.prototype.$alert('vue-quill-editor組件不兼容IE10及以下瀏覽器,請(qǐng)使用更高版本的瀏覽器查看', '瀏覽器不兼容通知', {
? ? ? ? ? ? ? ? confirmButtonText: '確定'
? ? ? ? ? ? });
? ? ? ? }else{
? ? ? ? ? ? next();
? ? ? ? }
? ? }
})2、vue router.afterEach(全局后置守衛(wèi))
router.beforeEach 是頁面加載之前,相反router.afterEach是頁面加載之后
二:路由獨(dú)享的守衛(wèi)(路由內(nèi)鉤子)
你可以在路由配置上直接定義 beforeEnter 守衛(wèi):
const router = new VueRouter({
? routes: [
? ? {
? ? ? path: '/foo',
? ? ? component: Foo,
? ? ? beforeEnter: (to, from, next) => {
? ? ? ? // ...
? ? ? }
? ? }
? ]這些守衛(wèi)與全局前置守衛(wèi)的方法參數(shù)是一樣的。
三:組件內(nèi)的守衛(wèi)(組件內(nèi)鉤子)
1、beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave
const Foo = {
? template: `...`,
? beforeRouteEnter (to, from, next) {
? ? // 在渲染該組件的對(duì)應(yīng)路由被 confirm 前調(diào)用
? ? // 不!能!獲取組件實(shí)例 `this`
? ? // 因?yàn)楫?dāng)鉤子執(zhí)行前,組件實(shí)例還沒被創(chuàng)建
? },
? beforeRouteUpdate (to, from, next) {
? ? // 在當(dāng)前路由改變,但是該組件被復(fù)用時(shí)調(diào)用
? ? // 舉例來說,對(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)用。
? ? // 可以訪問組件實(shí)例 `this`
? },
? beforeRouteLeave (to, from, next) {
? ? // 導(dǎo)航離開該組件的對(duì)應(yīng)路由時(shí)調(diào)用
? ? // 可以訪問組件實(shí)例 `this`
? }2、路由鉤子在實(shí)際開發(fā)中的應(yīng)用場(chǎng)景
(一) 清除當(dāng)前組件中的定時(shí)器
當(dāng)一個(gè)組件中有一個(gè)定時(shí)器時(shí), 在路由進(jìn)行切換的時(shí)候, 可使用beforeRouteLeave將定時(shí)器進(jìn)行清楚, 以免占用內(nèi)存:
beforeRouteLeave (to, from, next) {
? window.clearInterval(this.timer) //清楚定時(shí)器
? next()
}(二) 當(dāng)頁面中有未關(guān)閉的窗口, 或未保存的內(nèi)容時(shí), 阻止頁面跳轉(zhuǎn)
如果頁面內(nèi)有重要的信息需要用戶保存后才能進(jìn)行跳轉(zhuǎn), 或者有彈出框的情況. 應(yīng)該阻止用戶跳轉(zhuǎn),結(jié)合vuex狀態(tài)管理(dialogVisibility是否有保存)
?beforeRouteLeave (to, from, next) {
?//判斷是否彈出框的狀態(tài)和保存信息與否
?if (this.dialogVisibility === true) {
? ? this.dialogVisibility = false //關(guān)閉彈出框
? ? next(false) //回到當(dāng)前頁面, 阻止頁面跳轉(zhuǎn)
? }else if(this.saveMessage === false) {
? ? alert('請(qǐng)保存信息后退出!') //彈出警告
? ? next(false) //回到當(dāng)前頁面, 阻止頁面跳轉(zhuǎn)
? }else {
? ? next() //否則允許跳轉(zhuǎn)
? }(三) 保存相關(guān)內(nèi)容到Vuex中或Session中
當(dāng)用戶需要關(guān)閉頁面時(shí), 可以將公用的信息保存到session或Vuex中
?beforeRouteLeave (to, from, next) {
? ? localStorage.setItem(name, content); //保存到localStorage中
? ? next()
}vue-router執(zhí)行順序
- 導(dǎo)航被觸發(fā)。
- 在失活的組件里調(diào)用 beforeRouteLeave 守衛(wèi)。
- 調(diào)用全局的 beforeEach 守衛(wèi)。
- 在重用的組件里調(diào)用 beforeRouteUpdate 守衛(wèi) (2.2+)。
- 在路由配置里調(diào)用 beforeEnter。
- 解析異步路由組件。
- 在被激活的組件里調(diào)用 beforeRouteEnter。
- 調(diào)用全局的 beforeResolve 守衛(wèi) (2.5+)。
- 導(dǎo)航被確認(rèn)。
- 調(diào)用全局的 afterEach 鉤子。
- 觸發(fā) DOM 更新。
- 調(diào)用 beforeRouteEnter 守衛(wèi)中傳給 next 的回調(diào)函數(shù),創(chuàng)建好的組件實(shí)例會(huì)
- 作為回調(diào)函數(shù)的參數(shù)傳入。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue.js學(xué)習(xí)之UI組件開發(fā)教程
前端開發(fā)中,隨著業(yè)務(wù)的增多,出于效率的考慮,我們對(duì)于組件化開發(fā)的需求也越來越迫切。下面這篇文章主要給大家介紹了關(guān)于vue.js之UI組件開發(fā)的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友們下面來一起看看吧。2017-07-07
vue3+ts+vite使用el-table表格渲染記錄重復(fù)情況
這篇文章主要給大家介紹了關(guān)于vue3+ts+vite使用el-table表格渲染記錄重復(fù)情況的相關(guān)資料,我們可以通過合并渲染、數(shù)據(jù)緩存或虛擬化等技術(shù)來減少重復(fù)渲染的次數(shù),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
vue.config.js中configureWebpack與chainWebpack區(qū)別及說明
這篇文章主要介紹了vue.config.js中configureWebpack與chainWebpack區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
詳解Vue中雙向綁定原理及簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Vue中雙向綁定原理及簡(jiǎn)單實(shí)現(xiàn),文中的示例代碼講解詳細(xì),對(duì)我們深入了解Vue有一定的幫助,需要的可以參考一下2023-05-05
vue-tree-chart樹形組件的實(shí)現(xiàn)(含鼠標(biāo)右擊事件)
Vue-Tree-Chart,一個(gè)Vue.js2組件,本文就詳細(xì)的介紹一下vue-tree-chart樹形組件的實(shí)現(xiàn)(含鼠標(biāo)右擊事件),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Vue查詢數(shù)據(jù)并通過bootstarp?table渲染數(shù)據(jù)
這篇文章主要為大家介紹了Vue查詢數(shù)據(jù)并通過bootstarp?table渲染數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
Vue實(shí)現(xiàn)動(dòng)態(tài)表單的示例詳解
在前端開發(fā)中,我們經(jīng)常遇到根據(jù)用戶輸入動(dòng)態(tài)生成不同表單項(xiàng)的需求,本文將詳細(xì)講解如何使用?Vue?3?的響應(yīng)式特性,逐步構(gòu)建一個(gè)遞歸動(dòng)態(tài)表單,感興趣的可以了解下2024-12-12

