国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

Vue的路由動(dòng)態(tài)重定向和導(dǎo)航守衛(wèi)實(shí)例

2019-11-19 14:08:43
字體:
供稿:網(wǎng)友

根據(jù)vue官方文檔,對(duì)于重定向有詳細(xì)的示例,但是關(guān)于使用方法動(dòng)態(tài)重定向的描述卻不多,重定向部分的描述如下:

重定向

重定向也是通過 routes 配置來完成,下面例子是從 /a 重定向到 /b:

const router = new VueRouter({ routes: [ { path: '/a', redirect: '/b' } ]})

重定向的目標(biāo)也可以是一個(gè)命名的路由:

const router = new VueRouter({ routes: [ { path: '/a', redirect: { name: 'foo' }} ]})

甚至是一個(gè)方法,動(dòng)態(tài)返回重定向目標(biāo):

const router = new VueRouter({ routes: [ { path: '/a', redirect: to => {  // 方法接收 目標(biāo)路由 作為參數(shù)  // return 重定向的 字符串路徑/路徑對(duì)象 }} ]})`這里寫代碼片`

關(guān)于動(dòng)態(tài)重定向的示例如下:

 { path: '/dynamic-redirect/:id?',  redirect: to => {  const { hash, params, query } = to  if (query.to === 'foo') {   return { path: '/foo', query: null }  }  if (hash === '#baz') {   return { name: 'baz', hash: '' }  }  if (params.id) {   return '/with-params/:id'  } else {   return '/bar'  }  } }

首先參數(shù)解構(gòu),獲取hash、params、query,然后根據(jù)獲取值進(jìn)行邏輯判斷之后動(dòng)態(tài)路由重定向。這里的return值是path值,而不是params值,必須是一個(gè)已經(jīng)存在的path才能進(jìn)行路由重定向。而且這個(gè)path不能使自身,因?yàn)樽鳛橐粋€(gè)重定向路由跳轉(zhuǎn)到自身還要繼續(xù)重定向,就會(huì)進(jìn)行一個(gè)死循環(huán)。

現(xiàn)在需求如下:

為了防止用戶隨便改變路由參數(shù)而導(dǎo)致頁面崩潰,需要進(jìn)行路由重定向,將不符合要求的參數(shù)進(jìn)行重定向到一個(gè)規(guī)范頁面。比如用戶點(diǎn)擊按鈕跳轉(zhuǎn)/list/1但是用戶自己將1進(jìn)行改變傳遞不符合規(guī)范的參數(shù)給頁面,希望能夠在用戶改變參數(shù)值后跳轉(zhuǎn)到默認(rèn)的規(guī)范頁面

以上代碼實(shí)現(xiàn)的效果是拿到路由參數(shù),如果用戶將頁面參數(shù)改的不符合規(guī)范就進(jìn)行路由重定向。使得頁面可以獲取正確參數(shù)值。現(xiàn)在的效果是如果用戶輸入/1則進(jìn)入正常頁面/list/1,輸入/xsajsxoal、/5、/-5 等不符合規(guī)范的參數(shù)就會(huì)跳轉(zhuǎn)進(jìn)入/list/0。

雖然重定向的邏輯是沒有問題的但問題依舊存在。那用戶繼續(xù)將/list/1改成/list/xsjknxkja怎么辦呢?

可見重定向是不適合解決這個(gè)問題的。這時(shí)就用到了vue路由的導(dǎo)航守衛(wèi)。導(dǎo)航守衛(wèi)的實(shí)現(xiàn)方式如下:

 {  path: '/:type',  name: 'normal',  component: index,  beforeEnter (to, from, next) {  if (/^[0-3]$/.test(to.params.type)) {   next()  } else {   next('/0')  }  } }

關(guān)于導(dǎo)航守衛(wèi)官方文檔描述如下:

正如其名,vue-router 提供的導(dǎo)航守衛(wèi)主要用來通過跳轉(zhuǎn)或取消的方式守衛(wèi)導(dǎo)航。有多種機(jī)會(huì)植入路由導(dǎo)航過程中:全局的, 單個(gè)路由獨(dú)享的, 或者組件級(jí)的。

記住參數(shù)或查詢的改變并不會(huì)觸發(fā)進(jìn)入/離開的導(dǎo)航守衛(wèi)。你可以通過觀察 $route 對(duì)象來應(yīng)對(duì)這些變化,或使用 beforeRouteUpdate 的組件內(nèi)守衛(wèi)。

你可以使用 router.beforeEach 注冊(cè)一個(gè)全局前置守衛(wèi):

const router = new VueRouter({ ... })router.beforeEach((to, from, next) => { // ...})

當(dāng)一個(gè)導(dǎo)航觸發(fā)時(shí),全局前置守衛(wèi)按照創(chuàng)建順序調(diào)用。守衛(wèi)是異步解析執(zhí)行,此時(shí)導(dǎo)航在所有守衛(wèi) resolve 完之前一直處于 等待中。

每個(gè)守衛(wèi)方法接收三個(gè)參數(shù):

to: Route: 即將要進(jìn)入的目標(biāo) 路由對(duì)象

from: Route: 當(dāng)前導(dǎo)航正要離開的路由

next: Function: 一定要調(diào)用該方法來 resolve 這個(gè)鉤子。執(zhí)行效果依賴 next 方法的調(diào)用參數(shù)。

next(): 進(jìn)行管道中的下一個(gè)鉤子。如果全部鉤子執(zhí)行完了,則導(dǎo)航的狀態(tài)就是 confirmed (確認(rèn)的)。

next(false): 中斷當(dāng)前的導(dǎo)航。如果瀏覽器的 URL 改變了(可能是用戶手動(dòng)或者瀏覽器后退按鈕),那么 URL 地址會(huì)重置到 from 路由對(duì)應(yīng)的地址。

next(‘/') 或者 next({ path: ‘/' }): 跳轉(zhuǎn)到一個(gè)不同的地址。當(dāng)前的導(dǎo)航被中斷,然后進(jìn)行一個(gè)新的導(dǎo)航。

next(error): (2.4.0+) 如果傳入 next 的參數(shù)是一個(gè) Error 實(shí)例,則導(dǎo)航會(huì)被終止且該錯(cuò)誤會(huì)被傳遞給 router.onError() 注冊(cè)過的回調(diào)。

確保要調(diào)用 next 方法,否則鉤子就不會(huì)被 resolved。

根據(jù)需求并不需要使用到全局守衛(wèi),只需要使用到路由獨(dú)享守衛(wèi),因此只需要在路由內(nèi)添加beforeEnter然后判斷是否符合參數(shù)規(guī)范,是的話用next() 進(jìn)入下一個(gè)鉤子,否則用next(‘/')跳轉(zhuǎn)到目標(biāo)地址。

以上這篇Vue的路由動(dòng)態(tài)重定向和導(dǎo)航守衛(wèi)實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 郓城县| 兴山县| 梓潼县| 汉中市| 花垣县| 红河县| 宁海县| 化隆| 临清市| 宁南县| 蒙城县| 长治县| 神农架林区| 余姚市| 贵南县| 岳普湖县| 南昌市| 溧阳市| 漠河县| 手游| 扶绥县| 项城市| 孟津县| 昌图县| 合水县| 宿松县| 阿克| 营口市| 望江县| 成都市| 渝北区| 辽宁省| 景谷| 军事| 禄劝| 濮阳市| 旌德县| 兴安县| 宁武县| 永春县| 湖口县|