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

vue中關(guān)于router.beforeEach()的用法

 更新時(shí)間:2023年11月16日 17:06:19   作者:都挺好,剛剛好  
這篇文章主要介紹了vue中關(guān)于router.beforeEach()的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

router.beforeEach()用法

導(dǎo)航守衛(wèi) 主要是通過(guò)跳轉(zhuǎn)或取消得方式守衛(wèi)導(dǎo)航

在前端路由跳轉(zhuǎn)中,路由跳轉(zhuǎn)前都是會(huì)經(jīng)過(guò)beforeEach,而beforeEach可以通過(guò)next來(lái)控制到底去哪個(gè)路由。

根據(jù)這個(gè)特性我們就可以在beforeEach中設(shè)置一些條件來(lái)控制路由的重定向。

常見(jiàn)的使用場(chǎng)景有

1、驗(yàn)證用戶是否登錄(若未登錄,且當(dāng)前非登錄頁(yè)面,則自動(dòng)重定向登錄頁(yè)面);

2、用戶權(quán)限;

3、用戶輸入的路路徑是否存在,不存在的情況下如何處理,重定向到哪個(gè)頁(yè)面。

此處呢我使用一個(gè)簡(jiǎn)單的例子

當(dāng)用戶輸入的路徑不存在的情況下,將其重定向到‘/’路徑來(lái)說(shuō)明beforeEach是如何控制路由的。

話不多說(shuō),直接看下邊如何實(shí)現(xiàn)的(這里我以創(chuàng)建一個(gè)名為router-be的項(xiàng)目為例)。

第一步 : 規(guī)定進(jìn)入路由是否需要權(quán)限

@/router/index.js

import A from '@/components/a'
{
	path : '/a',
	name : 'a',
	component : A,
	meta : {  // 加一個(gè)自定義obj
		requireAuth : true   // 參數(shù) true 代表需要登陸才能進(jìn)入 A
	}
}

第二步 : 使用vuex 整一個(gè)useid

@/assets/store.js

//使用vuex三步走
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
//這個(gè)理論來(lái)說(shuō)
const store = new Vuex.Store({
	state:{
		userId : ''
	}
})

export default store

第三步 : 使用router.beforeEach()

思路:【
	如果(進(jìn)入這個(gè)路由需要權(quán)限){
	
		如果(能獲取到這個(gè)用戶的userID){
			就讓這個(gè)用戶進(jìn)入這個(gè)路由
		}否則{
			就讓這個(gè)用戶進(jìn)入b這個(gè)頁(yè)面
		}
		
	} 即將進(jìn)入的路由不需要權(quán)限就能進(jìn)入 {
	
		就讓這個(gè)用戶進(jìn)入這個(gè)路由
		
	}
】
對(duì)應(yīng)代碼:
import store from '@/assets/store'   //把這個(gè)userId獲取過(guò)來(lái)
router.beforeEach((to,from,next)=>{
	if(to.meta.requireAuth){
		if(store.state.userId){
			next()
		}else{
			next({path:'/b'})
		}
	}else{
		next()
	}
})

實(shí)現(xiàn)原理

 constrouter=newVueRouter({…})
 router.beforeEach((to,from,next)=>{// …})

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

  • 1.to => route : 即將進(jìn)入的目標(biāo)路由對(duì)象
  • 2.from => route : 當(dāng)前導(dǎo)航正要離開(kāi)的路由
  • 3.next => function: 一定要調(diào)用該方法來(lái) resolve這個(gè)鉤子,執(zhí)行效果以來(lái) next 方法的調(diào)用參數(shù)

第四步

  • 上一步 /b 路由為 登陸頁(yè)面
  • 當(dāng)進(jìn)入A 頁(yè)面之前,需要先請(qǐng)求接口,獲取是否有登錄,然后把userId存在vuex 的state 中
  • 當(dāng)沒(méi)有userId 時(shí),則在登錄之后,存一個(gè)userId 到state 里

第五步 項(xiàng)目中使用

router.beforeEach((to, from, next) => {
  console.log(to);

  // DEBUG: 測(cè)試
  return next();

  const { ldomain } = to.query;
  if (ldomain) {
    document.domain = ldomain;
  }

  const { LoginPage } = byskConfig;

  if (!router.getMatchedComponents(to.path).length) {
    console.log("not page", to, from);
    return next(byskConfig.NotFoundPage.path);
  }

  //驗(yàn)證權(quán)限
  if (to.meta.permId && !hasPerms(to.meta.permId)) {
    console.log("no auth", to, from);
    return next(LoginPage.path);
  }

  //驗(yàn)證是否登錄
  if (to.meta.permId && !getCookie("sid")) {
    console.log("no login & signout", to, from);
    return next(LoginPage.path);
  }

  if (to.matched.length) {
    let parentRoute = to.matched[to.matched.length - 1].parent;
    if (
      parentRoute &&
      parentRoute.meta.hasOwnProperty("redirect") &&
      parentRoute.meta.redirect !== to.path) {
      parentRoute.meta.redirect = to.path;
    }
  }
  next();
});

權(quán)限

export function setupPermissionGuard(router) {
  router.beforeEach(async (to, from, next) => {
    const { state, commit, dispatch } = store;
    // TODO: 404 的處理

    // 不需要登錄,可訪問(wèn)
    if (to.meta.ignoreAuth === true) {
      next();
      return;
    }

    // TODO: 白名單

    // 刷新重新登錄
    if (!state.appToken) {
      await dispatch('relogin');
    }

    // 處理token
    const hasToken = !!state.appToken;

    if (!hasToken) { // 未登陸,或過(guò)期
      // 重定向到登錄頁(yè)
      const redirectData = {
        path: LOGIN_PATH,
        replace: true,
      };

      next(redirectData);
      return;
    }

    // 判斷是否有權(quán)限
    const hasAuthority = to.meta.permId && hasPerms(to.meta.permId);

    if (hasAuthority) { // 權(quán)限驗(yàn)證
      if (to.meta.ignoreKeepAlive !== true) {
        // 頁(yè)面需要緩存, 添加到緩存
        const { cachePages } = state;
        const { matched } = to;
        commit('setCachePages', [...cachePages, ...matched.slice(1)]);
      }

      next();
      return;
    }
    next(from.path);

    // next();
  });

  router.afterEach((to) => {
    if (to.meta?.label) {
      // 設(shè)置頁(yè)面`title`
      document.title = `一立科技 - ${to.meta.label}`;
    }
  });
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue使用vue-draggable 插件在不同列表之間拖拽功能

    Vue使用vue-draggable 插件在不同列表之間拖拽功能

    這篇文章主要介紹了使用vue-draggable 插件在不同列表之間拖拽,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • vue?async?await?promise等待異步接口執(zhí)行完畢再進(jìn)行下步操作教程

    vue?async?await?promise等待異步接口執(zhí)行完畢再進(jìn)行下步操作教程

    在Vue中可以使用異步函數(shù)和await關(guān)鍵字來(lái)控制上一步執(zhí)行完再執(zhí)行下一步,這篇文章主要給大家介紹了關(guān)于vue?async?await?promise等待異步接口執(zhí)行完畢再進(jìn)行下步操作的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • Vue3+TypeScript集成Mock的方法

    Vue3+TypeScript集成Mock的方法

    這篇文章主要介紹了Vue3+TypeScript集成Mock的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-04-04
  • Vuejs監(jiān)聽(tīng)vuex中值的變化的方法示例

    Vuejs監(jiān)聽(tīng)vuex中值的變化的方法示例

    這篇文章主要介紹了Vuejs監(jiān)聽(tīng)vuex中值的變化的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • vue組件中點(diǎn)擊按鈕后修改輸入框的狀態(tài)實(shí)例代碼

    vue組件中點(diǎn)擊按鈕后修改輸入框的狀態(tài)實(shí)例代碼

    要求點(diǎn)擊修改按鈕之后部分輸入框由禁用狀態(tài)變?yōu)榭捎脿顟B(tài)。下面我給大家分享一段實(shí)例代碼基于vue組件中點(diǎn)擊按鈕后修改輸入框的狀態(tài),需要的的朋友參考下
    2017-04-04
  • Vue全局loading及錯(cuò)誤提示的思路與實(shí)現(xiàn)

    Vue全局loading及錯(cuò)誤提示的思路與實(shí)現(xiàn)

    這篇文章主要給大家介紹了關(guān)于Vue全局loading及錯(cuò)誤提示的思路與實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Vue模仿實(shí)現(xiàn)京東商品大圖放大鏡效果

    Vue模仿實(shí)現(xiàn)京東商品大圖放大鏡效果

    這篇文章主要為大家介紹了Vue實(shí)現(xiàn)京東網(wǎng)站商品放大鏡效果示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • vue中三種不同插槽使用小結(jié)

    vue中三種不同插槽使用小結(jié)

    本文主要介紹了vue中三種不同插槽使用小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • vue .js綁定checkbox并獲取、改變選中狀態(tài)的實(shí)例

    vue .js綁定checkbox并獲取、改變選中狀態(tài)的實(shí)例

    今天小編就為大家分享一篇vue .js綁定checkbox并獲取、改變選中狀態(tài)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • Vue中的計(jì)算屬性與監(jiān)聽(tīng)屬性

    Vue中的計(jì)算屬性與監(jiān)聽(tīng)屬性

    這篇文章介紹了Vue中的計(jì)算屬性與監(jiān)聽(tīng)屬性,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03

最新評(píng)論

莱芜市| 乐安县| 乌拉特中旗| 鹤峰县| 山东| 贵港市| 吉安县| 金乡县| 云霄县| 奉新县| 霍州市| 贵南县| 年辖:市辖区| 肇源县| 焉耆| 鸡东县| 西乡县| 榆中县| 滦平县| 雅江县| 嘉峪关市| 德保县| 任丘市| 湟中县| 商水县| 五家渠市| 邓州市| 通州市| 嘉禾县| 浙江省| 西安市| 城口县| 嘉义市| 湘乡市| 冕宁县| 宁河县| 诸城市| 望谟县| 桓仁| 安平县| 泗水县|