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

Vue?Router?實(shí)現(xiàn)登錄后跳轉(zhuǎn)到之前想要訪問(wèn)的頁(yè)面

 更新時(shí)間:2022年12月14日 10:13:54   作者:CJc_3103  
這篇文章主要介紹了Vue?Router?實(shí)現(xiàn)登錄后跳轉(zhuǎn)到之前相要訪問(wèn)的頁(yè)面,本文僅演示路由跳轉(zhuǎn)和導(dǎo)航守衛(wèi)相關(guān)代碼的實(shí)現(xiàn),不包含具體的權(quán)限驗(yàn)證和登錄請(qǐng)求,需要的朋友可以參考下

簡(jiǎn)介

該功能主要用于判定用戶權(quán)限,在用戶無(wú)權(quán)限時(shí)重定向至登錄頁(yè),并在用戶完成登錄后,再定向至用戶之前想要訪問(wèn)的路由;或者用戶在任意路由點(diǎn)擊登錄時(shí),登錄成功后返回當(dāng)前路由。是一個(gè)很常規(guī)的小功能。

簡(jiǎn)單示例

本文僅演示路由跳轉(zhuǎn)和導(dǎo)航守衛(wèi)相關(guān)代碼的實(shí)現(xiàn),不包含具體的權(quán)限驗(yàn)證和登錄請(qǐng)求。

實(shí)現(xiàn)該功能主要分為四步:

  • 在登錄組件的路由配置對(duì)象中添加 props: route => ({ redirect: route.query.redirect })
  • 在登錄組件中使用 props 接收參數(shù) props: ['redirect'] ,同時(shí)在登錄事件完成時(shí)判定路由參數(shù)并跳轉(zhuǎn):
props: ['redirect'],
...
handleLogin() {
  this.$store.dispatch('LOGIN', { somePramsHere })
    .then(() => {
      this.$router.push(
        this.redirect ? { path: this.redirect } : { name: 'Home' }
      );
    })
    .catch((err) => {
      // 登錄失敗
    });
},

在其他路由的登錄入口添加相應(yīng)的 rediect 參數(shù),如首頁(yè)的登錄鏈接:

<router-link 
  :to="{
         name: 'Login',
         query: { redirect: $route.fullPath },
       }"
 ><span class="login">登錄</span></router-link>

在路由守衛(wèi)中添加相應(yīng)的判定邏輯,當(dāng)用戶不具備權(quán)限時(shí),重定向至登錄頁(yè):

import router from './index';
import store from '@/store/index';
import whiteList from './whiteList';
 
router.beforeEach((to, from, next) => {
    if (!store.state.token) {
        // 未登錄
        if (
            to.matched.length > 0 &&
            to.matched.some((record) => whiteList.includes(record.path))
            // 此處還可添加用戶權(quán)限驗(yàn)證相關(guān)邏輯,如 to.matched.some(record => record.requiresAuth)
        ) {
            // 該路由不要求用戶登錄,繼續(xù)完成導(dǎo)航
            next();
        } else {
            // 用戶未登錄,且目標(biāo)路由不在白名單中,重定向至登錄頁(yè)
            next({ name: 'Login', query: { redirect: to.fullPath } });
        }
    else { ... // 已登錄時(shí)的路由守衛(wèi)判定 }
    }
}

補(bǔ)充用戶退出時(shí)的處理

由于導(dǎo)航守衛(wèi)只有在路由變化時(shí)才會(huì)被觸發(fā),而使用 $router.replace() 模擬刷新并不會(huì)觸發(fā)導(dǎo)航守衛(wèi)(push() 也不行),因?yàn)?VueRouter 不允許進(jìn)入相同的路由,這是其內(nèi)部機(jī)制,我們無(wú)法在外部干涉。

因此,只能在用戶退出成功時(shí),手動(dòng)加入與導(dǎo)航守衛(wèi)相同的判定邏輯,若在白名單之內(nèi)或擁有相應(yīng)的路由權(quán)限,則留在當(dāng)前路由;若不符合條件,則重定向至登錄頁(yè):

退出相關(guān)組件

import whiteList from '@/store/whiteList';
import routePaths from '@/store/routePaths';
 
...
handleLogoutRedirect() {
  let location = {};
  if (
    !whiteList.includes(this.routePath) &&
    !whiteList.includes(routePaths[this.routeName])
  ) {
    location = { name: 'Login', query: { redirect: this.routePath } }; // 注意這里,需要手動(dòng)帶上當(dāng)前路徑,否則重新登錄后只能到首頁(yè)
    this.$router.push(location);
  }
  // 當(dāng)前路由在白名單之內(nèi)的,不需要跳轉(zhuǎn),留在當(dāng)前路由即可
},
handleLogout() {
  this.$store
    .dispatch('LOGOUT')
    .then(() => {
      this.handleLogoutRedirect();
    })
    .catch((err) => err);
},
...

注意,我在頂部導(dǎo)入了一個(gè) routePaths 對(duì)象。由于搜索頁(yè)等組件是帶有 params 參數(shù)的,若想要判定當(dāng)前路由是否屬于白名單,需要使用路由配置對(duì)象中的完整 path 字符串,比如搜索頁(yè)是 /search/:keyword?,那么白名單數(shù)組和 routePaths 對(duì)象里都需要使用這個(gè)字符串。此處為了匹配的方便,使用路由組件的 name 屬性作為 routePaths 的 key。示例:

routePaths.js

// 其他路由若是 path 不帶 params 參數(shù)的,可以不用配置,像上述代碼那樣分開(kāi)判定即可
const routePaths = {
    Search: '/search/:keyword?',
}
export default routePaths;

進(jìn)階

在任意路由點(diǎn)擊登錄,將當(dāng)前路由和路由參數(shù)都帶給登錄組件,登錄成功后返回之前的路由并攜帶全部路由參數(shù)。

此處的導(dǎo)航守衛(wèi)、以及帶有登錄鏈接或跳轉(zhuǎn)至登錄頁(yè)功能的組件代碼無(wú)需改動(dòng),只需要修改路由配置對(duì)象和登錄組件。

首先,定義路由的配置對(duì)象時(shí),將登錄組件的路由 props 改為:

props: route => {
  let params = route.params, query = route.query; // 這里不能解構(gòu) route 對(duì)象,否則拿不到值
  const redirect = query.redirect;
  Reflect.deleteProperty(query, 'redirect'); // 原本的 query 對(duì)象不帶 redirect 屬性,因此需要?jiǎng)h除
  return { redirect, params, query }
},

其次,登錄成功時(shí),給路由跳轉(zhuǎn)添加 prams 和 query 參數(shù)

props: ['redirect', 'params', 'query'],
...
handleLogin() {
  this.$store
    .dispatch('LOGIN', { phone: this.phone, password: this.password })
    .then((data) => {
      this.$router.push(
        this.redirect
          ? { path: this.redirect, params: this.params, query: this.query }
          : { name: 'Home' }
      );
    })
    .catch((err) => {
      console.log('登錄失敗:', err);
    });
},

到此這篇關(guān)于Vue Router 實(shí)現(xiàn)登錄后跳轉(zhuǎn)到之前相要訪問(wèn)的頁(yè)面的文章就介紹到這了,更多相關(guān)Vue Router 登錄后跳轉(zhuǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue3+ts實(shí)現(xiàn)樹(shù)形組件(菜單組件)

    vue3+ts實(shí)現(xiàn)樹(shù)形組件(菜單組件)

    本文主要介紹了vue3+ts實(shí)現(xiàn)樹(shù)形組件(菜單組件),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Vue.js每天必學(xué)之指令系統(tǒng)與自定義指令

    Vue.js每天必學(xué)之指令系統(tǒng)與自定義指令

    Vue.js每天必學(xué)之指令系統(tǒng)與自定義指令,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Vue實(shí)現(xiàn)生成本地Json文件功能方式

    Vue實(shí)現(xiàn)生成本地Json文件功能方式

    這篇文章主要介紹了Vue實(shí)現(xiàn)生成本地Json文件功能方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • vue-openlayers實(shí)現(xiàn)地圖坐標(biāo)彈框效果

    vue-openlayers實(shí)現(xiàn)地圖坐標(biāo)彈框效果

    這篇文章主要為大家詳細(xì)介紹了vue-openlayers實(shí)現(xiàn)地圖坐標(biāo)彈框效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • Spring Boot/VUE中路由傳遞參數(shù)的實(shí)現(xiàn)代碼

    Spring Boot/VUE中路由傳遞參數(shù)的實(shí)現(xiàn)代碼

    在路由時(shí)傳遞參數(shù),一般有兩種形式,一種是拼接在url地址中,另一種是查詢參數(shù)。這篇文章主要介紹了Spring Boot/VUE中路由傳遞參數(shù),需要的朋友可以參考下
    2018-03-03
  • Vue.js實(shí)現(xiàn)可編輯的表格

    Vue.js實(shí)現(xiàn)可編輯的表格

    這篇文章主要為大家詳細(xì)介紹了Vue.js實(shí)現(xiàn)可編輯的表格,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 如何用 Deepseek 寫(xiě)的uniapp血型遺傳查詢工具

    如何用 Deepseek 寫(xiě)的uniapp血型遺傳查詢工具

    在現(xiàn)代社會(huì)中,了解血型遺傳規(guī)律對(duì)于優(yōu)生優(yōu)育、醫(yī)療健康等方面都有重要意義,本文將介紹如何使用Uniapp開(kāi)發(fā)一個(gè)跨平臺(tái)的血型遺傳查詢工具,幫助用戶預(yù)測(cè)孩子可能的血型,感興趣的朋友一起看看吧
    2025-04-04
  • vue導(dǎo)出excel多層表頭的實(shí)現(xiàn)方案詳解

    vue導(dǎo)出excel多層表頭的實(shí)現(xiàn)方案詳解

    這篇文章主要為大家詳細(xì)介紹了vue導(dǎo)出excel多層表頭的實(shí)現(xiàn)方案,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • vue項(xiàng)目中用cdn優(yōu)化的方法

    vue項(xiàng)目中用cdn優(yōu)化的方法

    本篇文章主要介紹了vue項(xiàng)目中用cdn優(yōu)化的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Vue中使用event的坑及解決event is not defined

    Vue中使用event的坑及解決event is not defined

    這篇文章主要介紹了Vue中使用event的坑及解決event is not defined,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03

最新評(píng)論

图们市| 柞水县| 堆龙德庆县| 桐庐县| 罗定市| 凤台县| 宁海县| 台湾省| 城口县| 滁州市| 灵石县| 马关县| 潢川县| 龙海市| 尉犁县| 平原县| 东阳市| 鹿泉市| 元阳县| 营口市| 年辖:市辖区| 天祝| 新宁县| 顺义区| 普格县| 临泉县| 慈利县| 札达县| 涡阳县| 普兰县| 巨鹿县| 磐石市| 定陶县| 马尔康县| 崇礼县| 年辖:市辖区| 平遥县| 宜兴市| 栾川县| 巴东县| 比如县|