最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue-router之路由鉤子函數(shù)應(yīng)用小結(jié)

 更新時(shí)間:2024年01月19日 08:33:56   作者:kirinlau  
vue-router提供的導(dǎo)航鉤子主要用來(lái)攔截導(dǎo)航,讓它完成跳轉(zhuǎn)或取消,本文主要介紹了vue-router之路由鉤子函數(shù)應(yīng)用小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下

vue-router是vue開(kāi)發(fā)中不可或缺的一部分,也是vue全家桶生態(tài)的重要部分,平時(shí)開(kāi)發(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)航正要離開(kāi)的路由
  • next: (Function函數(shù)) 一定要調(diào)用該方法來(lái) resolve 這個(gè)鉤子。 調(diào)用方法:next(參數(shù)或者空) ***必須調(diào)用
  • next(無(wú)參數(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)行一些頁(yè)面跳轉(zhuǎn)前處理,例如判斷需要登錄的頁(yè)面進(jìn)行攔截,做登錄跳轉(zhuǎn)

router.beforeEach((to, from, next) => {
    if (to.meta.requireAuth) {
        //判斷該路由是否需要登錄權(quán)限
        if (cookies('token')) {
            //通過(guò)封裝好的cookies讀取token,如果存在,name接下一步如果不存在,那跳轉(zhuǎn)回登錄頁(yè)
            next()//不要在next里面加"path:/",會(huì)陷入死循環(huán)
        }
        else {
            next({
                path: '/login',
                query: {redirect: to.fullPath}//將跳轉(zhuǎn)的路由path作為參數(shù),登錄成功后跳轉(zhuǎn)到該路由
            })
        }
    }
    else {
        next()
    }
})

進(jìn)入新的頁(yè)面時(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是頁(yè)面加載之后,跟router.beforeEach一樣,區(qū)別是router.beforeEach是頁(yè)面加載之前執(zhí)行,而router.afterEach是頁(yè)面加載之后執(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ù)判斷能不能訪問(wèn):

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("無(wú)權(quán)限")
				}
    		}
    	}
    ]
  }
]

注意:如果記錄有重定向?qū)傩?,則 beforeEnter 無(wú)效。

4.組件內(nèi)的守衛(wèi)(組件實(shí)例內(nèi)的導(dǎo)航鉤子)

  • beforeRouteEnter:進(jìn)入這個(gè)組件路由之前
  • beforeRouteLeave:離開(kāi)這個(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í)例還沒(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`
  }

實(shí)際應(yīng)用就是組件創(chuàng)建、離開(kāi)、更新等
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)頁(yè)面中有未關(guān)閉的窗口, 或未保存的內(nèi)容時(shí), 阻止頁(yè)面跳轉(zhuǎn)next(false)
如果頁(yè)面內(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è)頁(yè)面使用了keep-alive進(jìn)行了緩存時(shí),離開(kāi)這個(gè)頁(yè)面后再次進(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-element-admin+flask實(shí)現(xiàn)數(shù)據(jù)查詢項(xiàng)目的實(shí)例代碼

    vue-element-admin+flask實(shí)現(xiàn)數(shù)據(jù)查詢項(xiàng)目的實(shí)例代碼

    這篇文章主要介紹了vue-element-admin+flask實(shí)現(xiàn)數(shù)據(jù)查詢項(xiàng)目,填寫(xiě)數(shù)據(jù)庫(kù)連接信息和查詢語(yǔ)句,即可展示查詢到的數(shù)據(jù),需要的朋友可以參考下
    2022-11-11
  • Vue如何跨組件傳遞Slot的實(shí)現(xiàn)

    Vue如何跨組件傳遞Slot的實(shí)現(xiàn)

    這篇文章主要介紹了Vue如何跨組件傳遞Slot的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • vue實(shí)現(xiàn)指定日期之間的倒計(jì)時(shí)

    vue實(shí)現(xiàn)指定日期之間的倒計(jì)時(shí)

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)指定日期之間的倒計(jì)時(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • vue devserver及其配置方法

    vue devserver及其配置方法

    這篇文章主要介紹了vue devserver及其配置方法,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • Vue 3中toRaw和markRaw的使用教程

    Vue 3中toRaw和markRaw的使用教程

    toRaw和markRaw是Vue 3中引入的新API,用于更精細(xì)地控制對(duì)象的代理和響應(yīng)性,它們提供了在需要時(shí)繞過(guò)代理或禁用響應(yīng)性的能力,有助于提高性能和更好地與第三方庫(kù)進(jìn)行集成,本文給大家介紹Vue 3中toRaw和markRaw的使用,感興趣的朋友一起看看吧
    2023-10-10
  • Vue.js中關(guān)于偵聽(tīng)器(watch)的高級(jí)用法示例

    Vue.js中關(guān)于偵聽(tīng)器(watch)的高級(jí)用法示例

    Vue.js 提供了一個(gè)方法 watch,它用于觀察Vue實(shí)例上的數(shù)據(jù)變動(dòng)。下面這篇文章主要給大家介紹了關(guān)于Vue.js中關(guān)于偵聽(tīng)器(watch)的高級(jí)用法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-05-05
  • Antd form表單的使用、設(shè)值、取值、清空值方式

    Antd form表單的使用、設(shè)值、取值、清空值方式

    這篇文章主要介紹了Antd form表單的使用、設(shè)值、取值、清空值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • vue+element自定義查詢組件

    vue+element自定義查詢組件

    這篇文章主要為大家詳細(xì)介紹了vue+element自定義查詢組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • vue彈窗組件的實(shí)現(xiàn)示例代碼

    vue彈窗組件的實(shí)現(xiàn)示例代碼

    這篇文章主要介紹了vue彈窗組件的實(shí)現(xiàn)示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • vue3.0 搭建項(xiàng)目總結(jié)(詳細(xì)步驟)

    vue3.0 搭建項(xiàng)目總結(jié)(詳細(xì)步驟)

    這篇文章主要介紹了vue3.0 搭建項(xiàng)目總結(jié)(詳細(xì)步驟),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05

最新評(píng)論

佛冈县| 扎赉特旗| 沐川县| 金昌市| 安宁市| 云南省| 府谷县| 东台市| 克东县| 石嘴山市| 花莲市| 巧家县| 平乐县| 宁南县| 彰武县| 水富县| 辽源市| 临洮县| 津市市| 西藏| 萨嘎县| 孝昌县| 伊宁市| 利辛县| 陇川县| 西藏| 济宁市| 湘潭市| 涿州市| 肇源县| 永州市| 从江县| 元朗区| 石门县| 新田县| 万源市| 神木县| 凤翔县| 碌曲县| 福州市| 尚志市|