vue-router之路由鉤子函數(shù)應(yīng)用小結(jié)
vue-router是vue開發(fā)中不可或缺的一部分,也是vue全家桶生態(tài)的重要部分,平時(shí)開發(fā)vue時(shí)會(huì)高頻率使用,那么它除了在routes上的應(yīng)用外,還有一些鉤子函數(shù)具體可以應(yīng)用在哪些地方呢
路由的鉤子函數(shù)共有6個(gè)
全局的路由鉤子函數(shù):beforeEach、afterEach
單個(gè)的路由鉤子函數(shù):beforeEnter
組件內(nèi)的路由鉤子函數(shù):beforeRouteEnter、beforeRouteLeave、beforeRouteUpdate
下面我就這些鉤子函數(shù)做具體解釋
全局導(dǎo)航鉤子函數(shù)
1. vue router.beforeEach(全局前置守衛(wèi))
beforeEach的鉤子函數(shù),它是一個(gè)全局的before 鉤子函數(shù),beforeEach在每次每一個(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() } })
進(jìn)入新的頁面時(shí)作登錄判斷、管理員權(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.afterEach是頁面加載之后,跟router.beforeEach一樣,區(qū)別是router.beforeEach是頁面加載之前執(zhí)行,而router.afterEach是頁面加載之后執(zhí)行
3. beforeEnter 路由獨(dú)享的守衛(wèi)(路由內(nèi)鉤子)
獨(dú)享路由守衛(wèi)beforeEnter配置在指定路由中的, 你可以在route配置上直接定義 beforeEnter 守衛(wèi):
const router = new VueRouter({ routes: [ { path: '/foo', component: Foo, beforeEnter: (to, from, next) => { // ... } } ]
再比如根據(jù)當(dāng)前路由數(shù)據(jù)判斷能不能訪問:
const routes = [ { path: '/about', name: 'About', component: About, meta:{ isAuth: false, title:"關(guān)于" }, children:[ { path: '/detail', name: 'Detail', component: Detail, meta:{ isAuth: false, title:"詳情" }, beforeEnter:(to,from,next) =>{ if(to.meta.isAuth){ if(localStorage.getItem('user')){ next()//調(diào)用next才會(huì)往下走 } }else{ alert("無權(quán)限") } } } ] } ]
注意:如果記錄有重定向?qū)傩?,則 beforeEnter 無效。
4.組件內(nèi)的守衛(wèi)(組件實(shí)例內(nèi)的導(dǎo)航鉤子)
- beforeRouteEnter:進(jìn)入這個(gè)組件路由之前
- beforeRouteLeave:離開這個(gè)組件路由
- beforeRouteUpdate:再本路由的下級(jí)路由切換才會(huì)觸發(fā)beforeRouteUpdate
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` }
實(shí)際應(yīng)用就是組件創(chuàng)建、離開、更新等
beforeRouteEnter是支持給next傳遞回調(diào)的唯一守衛(wèi),回調(diào)的參數(shù)就是當(dāng)前組件實(shí)例,如下:
beforeRouteEnter(to, from, next) { console.log("beforeRouteEnter"); next(vm => { console.log("vm", vm); //vm就是當(dāng)前組件this console.log("data:", vm.data) // 可以獲取當(dāng)前組件的data vm.testFun() //可以執(zhí)行當(dāng)前組件的方法 }); }
beforeRouteLeave應(yīng)用場(chǎng)景就是在銷毀當(dāng)前組件時(shí)觸發(fā)的處理都可以添加在該鉤子函數(shù)中,比如組件中有定時(shí)器時(shí), 在路由進(jìn)行切換的時(shí)候, 可使用beforeRouteLeave將定時(shí)器進(jìn)行清理掉,以免內(nèi)存泄漏,造成StackOverflowError的錯(cuò)誤
beforeRouteLeave (to, from, next) { window.clearInterval(this.timer) //清楚定時(shí)器 next() }
再比如當(dāng)頁面中有未關(guān)閉的窗口, 或未保存的內(nèi)容時(shí), 阻止頁面跳轉(zhuǎn)next(false)
如果頁面內(nèi)有重要的信息需要用戶保存后才能進(jìn)行跳轉(zhuǎn)
beforeRouteLeave (to, from, next) { localStorage.setItem(name, content); //保存到localStorage中 next() }
這就是vue-router鉤子函數(shù)的基礎(chǔ)應(yīng)用,當(dāng)然還有很多其他的應(yīng)用角度。
比如beforeRouteEnter可以結(jié)合keep-alive可以實(shí)現(xiàn)增加用戶體驗(yàn)和節(jié)省資源的同時(shí)獲取鉤子節(jié)點(diǎn)。
組件在創(chuàng)建時(shí)會(huì)觸發(fā)created,但是每次進(jìn)入路由時(shí)都會(huì)觸發(fā)beforeRouteEnter,所以,當(dāng)一個(gè)頁面使用了keep-alive進(jìn)行了緩存時(shí),離開這個(gè)頁面后再次進(jìn)入時(shí),不會(huì)再觸發(fā)created,但是會(huì)觸發(fā)beforeRouteEnter,這時(shí)候就可以使用路由鉤子進(jìn)行處理了。
到此這篇關(guān)于vue-router之路由鉤子函數(shù)應(yīng)用小結(jié)的文章就介紹到這了,更多相關(guān)vue-router 路由鉤子 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue使用天地圖、openlayers實(shí)現(xiàn)多個(gè)底圖疊加顯示效果
這篇文章主要介紹了vue使用天地圖、openlayers實(shí)現(xiàn)多個(gè)底圖疊加顯示,根據(jù)返回的經(jīng)緯度列表通過天地圖、openlayers實(shí)現(xiàn)底圖添加,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-04-04Vue使用v-for數(shù)據(jù)渲染順序混亂的原因及解決方案
在 Vue.js 中,使用 v-for 指令進(jìn)行數(shù)據(jù)渲染時(shí),有時(shí)會(huì)遇到渲染順序混亂的問題,這種問題主要與 Vue 的響應(yīng)式系統(tǒng)、DOM 更新機(jī)制以及數(shù)組的變更方法有關(guān),以下是對(duì)這一現(xiàn)象的深入分析及解決方案,需要的朋友可以參考下2025-01-01vue項(xiàng)目中使用pinyin轉(zhuǎn)換插件方式
這篇文章主要介紹了vue項(xiàng)目中使用pinyin轉(zhuǎn)換插件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04vue項(xiàng)目啟動(dòng)后,js-base64依賴報(bào)錯(cuò)Cannot read properties
這篇文章主要介紹了vue項(xiàng)目啟動(dòng)后,js-base64依賴報(bào)錯(cuò)Cannot read properties of null(reading ‘replace’)問題,2024-05-05vue.js實(shí)現(xiàn)的全選與全不選功能示例【基于elementui】
這篇文章主要介紹了vue.js實(shí)現(xiàn)的全選與全不選功能,結(jié)合實(shí)例形式分析了vue.js基于elementui實(shí)現(xiàn)全選與全不選功能的相關(guān)頁面渲染、初始化數(shù)據(jù)及功能函數(shù)等相關(guān)操作技巧,需要的朋友可以參考下2018-12-12Vue與compressor.js實(shí)現(xiàn)高效文件壓縮的方法
本文將介紹基于 Vue 框架和 compressor.js 的上傳時(shí)文件壓縮實(shí)現(xiàn)方法,通過在上傳過程中對(duì)文件進(jìn)行壓縮,減小文件大小,提升上傳速度,為用戶創(chuàng)造更快捷、高效的上傳體驗(yàn),感興趣的朋友跟隨小編一起看看吧2024-03-03在antd中setFieldsValue和defaultVal的用法
這篇文章主要介紹了在antd中setFieldsValue和defaultVal的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10