国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Vue實(shí)現(xiàn)動(dòng)態(tài)路由

這篇具有很好參考價(jià)值的文章主要介紹了Vue實(shí)現(xiàn)動(dòng)態(tài)路由。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

前言

一、項(xiàng)目介紹

1.開發(fā)環(huán)境

2.功能

3.項(xiàng)目運(yùn)行截圖??

二、實(shí)現(xiàn)

1.動(dòng)態(tài)路由如何實(shí)現(xiàn)

2.項(xiàng)目目錄介紹

3.核心代碼

4.坑和知識(shí)點(diǎn)

小結(jié)


前言

最近在學(xué)權(quán)限相關(guān)的管理項(xiàng)目,前端用到了動(dòng)態(tài)路由,就是根據(jù)用戶角色顯示不同的菜單,動(dòng)態(tài)添加路由。說著好像很簡(jiǎn)單,但看了很多教程,也跟著教程寫了很多代碼,但最后都跑不通(很多原因,比如:版本問題,教程沒有全部代碼,只有核心代碼片段等)。??????所以,我只能狠下心,寫下這篇博客,方便自己總結(jié),也為了避免大家踩坑。

一、項(xiàng)目介紹

廢話不多說,直接附上項(xiàng)目下載地址:
gitee:https://gitee.com/wusupweilgy/springboot-vue.git

藍(lán)奏云:https://wwp.lanzoup.com/iO74W0r6bcob

1.開發(fā)環(huán)境

前端:vue2+element-ui組件

2.功能

根據(jù)用戶的賬號(hào)密碼,生成不同的菜單,動(dòng)態(tài)添加路由

3.項(xiàng)目運(yùn)行截圖??

generateroutes,SpringBoot+Vue實(shí)現(xiàn)小功能,vue.js,前端,javascript

?generateroutes,SpringBoot+Vue實(shí)現(xiàn)小功能,vue.js,前端,javascript

二、實(shí)現(xiàn)

1.動(dòng)態(tài)路由如何實(shí)現(xiàn)

流程:

  1. 登錄的時(shí)候,根據(jù)登錄用戶返回此角色可以訪問的頁面的路由和token
  2. 前端將路由存儲(chǔ)到sessionStorage和vuex中(因?yàn)関uex存儲(chǔ)的數(shù)據(jù)一刷就沒了,所以需要配合sessionStorage)
  3. 在路由前置守衛(wèi)處動(dòng)態(tài)添加拿到的路由,對(duì)頁面進(jìn)行渲染。

2.項(xiàng)目目錄介紹

generateroutes,SpringBoot+Vue實(shí)現(xiàn)小功能,vue.js,前端,javascript

  • ?assets:存放圖片和樣式
  • router:路由配置
    • dynamicRoutes.js:動(dòng)態(tài)路由模板
    • index.js:靜態(tài)路由
    • permission.js:路由前置守衛(wèi)
  • store:vuex存儲(chǔ)全局的狀態(tài)變量
  • util:工具類
    • index.js:動(dòng)態(tài)添加路由工具類
    • request.js:axios請(qǐng)求工具類
  • views:存放頁面

3.核心代碼

1)/views/Login.vue:登錄(onSubmit方法)成功時(shí),根據(jù)用戶名密碼區(qū)分角色,根據(jù)角色將不同路由和token寫入vuex,dynamicRoutes.js中有兩個(gè)路由模板,分別是user和admin,然后調(diào)用generateRoutes()方法向vue-router中動(dòng)態(tài)添加路由

import {admin,user} from '@/router/dynamicRoutes'
...

onSubmit(formName) {
    //為表單綁定驗(yàn)證功能
    this.$refs [formName].validate((valid) => {
        if (valid) {
            if(this.form.username==="user"&&this.form.password==="user"){
                store.commit('SET_MENULIST', user);
                store.commit('SET_TOKEN', 'user');
            }else if(this.form.username==="admin"&&this.form.password==="admin"){
                store.commit('SET_MENULIST', admin);
                store.commit('SET_TOKEN', 'admin');
            }else{
                this.$message.error("登錄失敗")
                return
            }
            this.$message.success("登錄成功")
            generateRoutes()
            this.$router.replace('/')

        } else {
            this.dialogVisible = true;
            return false;
        }
    });
},

2)/store/index.js:vuex狀態(tài)管理(配合sessionStorage)

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    token:'',
    menuList:[],
    isLoadRouters:false
  },
  getters: {
    GET_TOKEN:state => {
      state.token = sessionStorage.getItem("token")
      return state.token
    },
    GET_MENULIST:state => {
      state.menuList = JSON.parse(sessionStorage.getItem("menuList")||'[]')
      return state.menuList
    },
    GET_ISLOADROUTERS:state=>{
      return state.isLoadRouters
    }
  },
  mutations: {
    SET_TOKEN:(state,token)=>{
      state.token = token
      sessionStorage.setItem("token",token);
    },
    SET_MENULIST:(state,menuList)=>{
      state.menuList = menuList
      sessionStorage.setItem("menuList",JSON.stringify(menuList));
    },
    SET_ISLOADROUTERS:(state,isLoadRouters)=>{
      state.isLoadRouters = isLoadRouters
    }
  },
})

3)/util/index.js:方法動(dòng)態(tài)添加路由工具

import router from '../router'
import store from '@/store'

//動(dòng)態(tài)添加路由
export function generateRoutes() {
    const _asyncRoutes = store.getters.GET_MENULIST
    if(_asyncRoutes==null)
        return
    _asyncRoutes.forEach(menu => {
        if (menu.children) {
            menu.children.forEach(m => {
                let route = menuToRoute(m, menu.name);
                if (route) {
                    router.addRoute("Home",route)
                }
            })
        }
    })
}

//將菜單轉(zhuǎn)換成router可以識(shí)別的路由
const menuToRoute = (menu, parentName) => {
    if (!menu.component) {
        return null;
    } else {
        let route = {
            name: menu.name,
            path: menu.path,
            meta: {
                parentName: parentName
            }
        }
        route.component = () => import('@/views/' + menu.component + '.vue');
        return route;
    }
}

4)/router/permission.js前置路由守衛(wèi),判斷是否登錄和是否已經(jīng)添加過路由

import router from "@/router/index"
import store from "@/store"
import {generateRoutes} from "@/util";

// 檢查是否存在于免登陸白名單
function inWhiteList(toPath) {
    const whiteList = ['/login', '/404']
    const path = whiteList.find((value) => {
        // 使用正則匹配
        const reg = new RegExp('^' + value)
        return reg.test(toPath)
    })
    return !!path
}

router.beforeEach((to, from, next) => {
    console.group('%c%s', 'color:blue', `${new Date().getTime()}  ${to.path} 的全局前置守衛(wèi)----------`)
    console.log('所有活躍的路由記錄列表', router.getRoutes())
    console.groupEnd()
    const token = store.getters.GET_TOKEN
    let isLoadRouters = store.state.isLoadRouters
    if (inWhiteList(to.path)) {
        next()
    } else {
        //用戶已登錄
        if (token && JSON.stringify(store.getters.GET_MENULIST) !== '[]') {
            if (isLoadRouters) {
                // console.log('路由已添加,直接跳轉(zhuǎn)到目標(biāo)頁面');
                next()
            } else {
                //解決刷新頁面空白
                //console.log('重新加載路由,并跳轉(zhuǎn)到目標(biāo)頁');
                let menuList = store.getters.GET_MENULIST
                store.commit('SET_ISLOADROUTERS', true)
                //添加動(dòng)態(tài)路由
                generateRoutes(menuList)

                next({...to, replace: true})
            }
        } else {
            // console.log('無登錄信息,跳轉(zhuǎn)到登錄頁');
            store.commit('SET_ISLOADROUTERS', false)
            next(`/login`)
        }
    }

})

4.坑和知識(shí)點(diǎn)

1)遇到的坑

  • 這里有個(gè)大坑,就是頁面刷新的情況,頁面一旦刷新,動(dòng)態(tài)添加的路由也會(huì)清空,只剩靜態(tài)路由,所有還要判斷頁面刷新的操作,這里通過一個(gè)vuex的變量解決,因?yàn)樗⑿虏僮?,vuex的值也會(huì)刷新,所以我在vuex中設(shè)置了isLoadRouters:false這個(gè)變量,如果刷新,這個(gè)值就是默認(rèn)的false
  • 第二個(gè)坑就是,在addRoute()之后第一次訪問被添加的路由會(huì)白屏,這是因?yàn)閯倓俛ddRoute()就立刻訪問被添加的路由,然而此時(shí)addRoutes()沒有執(zhí)行結(jié)束,因而找不到剛剛被添加的路由導(dǎo)致白屏。因此需要從新訪問一次路由才行,所以需要next({...to, replace: true}),來保證路由添加完了再進(jìn)入頁面 (可以理解為重進(jìn)一次)。小伙伴可以試試把它換成next(),看會(huì)不會(huì)出現(xiàn)白屏。是

這兩個(gè)坑就已經(jīng)卡了我很長(zhǎng)時(shí)間了,更何況還有其他小坑(哭死我了)

  • 用戶點(diǎn)擊退出后,需要重置路由,不然你添加過路由了,再通過addRoute()方法添加路由就會(huì)造成重復(fù)添加路由,瀏覽器的控制臺(tái)會(huì)有警告,不重置也沒事,就是看著有點(diǎn)不舒服。

// 重置路由
export function resetRouter() {
    const newRouter = createRouter()
    router.matcher = newRouter.matcher
}

2)學(xué)到的知識(shí)點(diǎn)

  • js語法:兩個(gè)感嘆號(hào),將非布爾型變量轉(zhuǎn)為布爾值

// 檢查是否存在于免登陸白名單
function inWhiteList(toPath) {
    const whiteList = ['/login', '/404']
    const path = whiteList.find((value) => {
        // 使用正則匹配
        const reg = new RegExp('^' + value)
        return reg.test(toPath)
    })
    return !!path
}
  • component: () => import("@/views/Index") 實(shí)現(xiàn)路由組件懶加載。vue這種單頁面應(yīng)用單頁面應(yīng)用單頁面應(yīng)用,如果我們不去做路由懶加載,打包之后的文件將會(huì)異常的大,就會(huì)造成進(jìn)入首頁時(shí),需要加載的內(nèi)容過多,時(shí)間過長(zhǎng),會(huì)出現(xiàn)長(zhǎng)時(shí)間的白屏,不利于用戶體驗(yàn),運(yùn)用懶加載就可以將頁面進(jìn)行劃分,需要的時(shí)候加載頁面,可以有效的分擔(dān)首頁所承擔(dān)的加載壓力,減少首頁加載用時(shí)。
  • next({...to, replace: true}) 重新訪問一次路由,避免路由還沒添加完成就訪問路
  • router.matcher = newRouter.matcher相當(dāng)于重置路由,避免重復(fù)添加路由

小結(jié)

本文介紹了使用Vue實(shí)現(xiàn)動(dòng)態(tài)路由。關(guān)于這個(gè)東西,我網(wǎng)上找的很多教程都不怎么靠譜,給我挖了很多坑,所以希望我的這篇教程可以幫助你,少走點(diǎn)彎路,快速掌握這技術(shù),代碼的下載地址在文章開頭,記得npm install一下,就可以運(yùn)行了。如果這篇文章有幸?guī)椭侥?,希望讀者大大們可以給作者給個(gè)三連呀??????????????????文章來源地址http://www.zghlxwxcb.cn/news/detail-737730.html

到了這里,關(guān)于Vue實(shí)現(xiàn)動(dòng)態(tài)路由的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Vue實(shí)現(xiàn)動(dòng)態(tài)路由【記錄學(xué)習(xí)的快樂】

    Vue實(shí)現(xiàn)動(dòng)態(tài)路由【記錄學(xué)習(xí)的快樂】

    1、什么是動(dòng)態(tài)路由? 2、動(dòng)態(tài)路由的好處 3、動(dòng)態(tài)路由如何實(shí)現(xiàn) 1、什么是動(dòng)態(tài)路由? 動(dòng)態(tài)路由,動(dòng)態(tài)即不是寫死的,是可變的。我們可以根據(jù)自己不同的需求加載不同的路由,做到不同的實(shí)現(xiàn)及頁面的渲染。動(dòng)態(tài)的路由存儲(chǔ)可分為兩種,一種是將路由存儲(chǔ)到前端。另一種則

    2024年02月07日
    瀏覽(14)
  • vue實(shí)現(xiàn)動(dòng)態(tài)路由添加(簡(jiǎn)單無廢話版本)

    最近練習(xí)vue的項(xiàng)目,有關(guān)于后臺(tái)管理系統(tǒng)的動(dòng)態(tài)添加路由部分,根據(jù)思路實(shí)現(xiàn)了基本的功能,在這里記錄一下,等后面學(xué)習(xí)后在進(jìn)行優(yōu)化。 這里只是記錄我個(gè)人最后實(shí)現(xiàn)的思路,本人由于是初學(xué)者,可能思路和代碼有不正確地方,還求多見諒。也請(qǐng)能不吝賜教,一同進(jìn)步。 我

    2023年04月08日
    瀏覽(21)
  • Vue從后端取數(shù)據(jù),實(shí)現(xiàn)動(dòng)態(tài)路由

    Vue從后端取數(shù)據(jù),實(shí)現(xiàn)動(dòng)態(tài)路由

    ? ? ? ? 將獲取菜單的方法放在全局中,以便每次刷新頁面時(shí),能夠加載出。 this.$store.state.userInfo 是登入后存放在Vuex的用戶信息 ?按照上面要求即可實(shí)現(xiàn)

    2024年01月20日
    瀏覽(23)
  • Vue如何實(shí)現(xiàn)權(quán)限管理(動(dòng)態(tài)路由addRoutes)

    目錄 引言 推薦B站視頻 一、權(quán)限管理 二、控制權(quán)限 接口權(quán)限 路由權(quán)限控制 方法一 方法二 菜單權(quán)限 方法一 方法二 按鈕權(quán)限 方法一 方法二 項(xiàng)目中會(huì)遇到權(quán)限管理,來讓特定用戶有特定權(quán)限的場(chǎng)景,那么怎么做這個(gè)權(quán)限管理,以及有多少辦法呢,下面給大家絮叨 vue權(quán)限管

    2023年04月25日
    瀏覽(17)
  • vue3實(shí)現(xiàn)動(dòng)態(tài)菜單和動(dòng)態(tài)路由和刷新后白屏處理

    vue3實(shí)現(xiàn)動(dòng)態(tài)菜單和動(dòng)態(tài)路由和刷新后白屏處理

    項(xiàng)目中,當(dāng)每一個(gè)角色得到的界面不一致的時(shí)候,我們就不能使用靜態(tài)菜單了,而是要從后端得到動(dòng)態(tài)的菜單數(shù)據(jù),然后動(dòng)態(tài)的將菜單數(shù)據(jù)展示在界面上。 除了在界面展示,也還要將界面的路由動(dòng)態(tài)添加,在路由動(dòng)態(tài)添加之后,你可能會(huì)出現(xiàn)刷新界面,界面變白的情況,頁面

    2024年02月06日
    瀏覽(19)
  • Vue+SpringBoot實(shí)現(xiàn)評(píng)論功能

    Vue+SpringBoot實(shí)現(xiàn)評(píng)論功能

    評(píng)論系統(tǒng)相信大家并不陌生,在社交網(wǎng)絡(luò)相關(guān)的軟件中是一種常見的功能。然而對(duì)于初學(xué)者來說,實(shí)現(xiàn)一個(gè)完整的評(píng)論系統(tǒng)并不容易。本文筆者以 Vue+SpringBoot 前后端分離的架構(gòu)細(xì)說博客評(píng)論功能的實(shí)現(xiàn)思路。 對(duì)于一個(gè)評(píng)論系統(tǒng)主要包含評(píng)論人,評(píng)論時(shí)間,評(píng)論內(nèi)容,評(píng)論回

    2023年04月08日
    瀏覽(15)
  • vue + less 實(shí)現(xiàn)動(dòng)態(tài)主題換膚功能

    vue + less 實(shí)現(xiàn)動(dòng)態(tài)主題換膚功能

    在vue項(xiàng)目中(我的是2.6.11版本的)使用less做到切換主題膚色。話不多說,直接開始。 我這里的項(xiàng)目是2.6.11版本的 安裝一些less的插件 路徑: src assets style theme 翻譯:theme 的中文就是主題 注意點(diǎn):考慮到切換樣式也是樣式中的,所以放在style里面,當(dāng)然, 你可以放在任意位置

    2024年02月12日
    瀏覽(15)
  • SpringBoot+Vue實(shí)現(xiàn)文件上傳功能

    SpringBoot+Vue實(shí)現(xiàn)文件上傳功能

    目錄 1.后端代碼部分: 2.前端代碼部分 3.效果展示 1.后端代碼部分: 2.前端代碼部分 3.效果展示 ? ? ?

    2024年02月12日
    瀏覽(30)
  • SpringBoot+Vue實(shí)現(xiàn)一個(gè)系統(tǒng)登錄功能

    1. 創(chuàng)建一個(gè)Spring Boot項(xiàng)目,添加Web和Security依賴。 2. 創(chuàng)建一個(gè)User實(shí)體類,用于存儲(chǔ)用戶信息。 3. 創(chuàng)建一個(gè)UserDetailsService接口的實(shí)現(xiàn)類,用于加載用戶信息。 4. 創(chuàng)建一個(gè)WebSecurityConfig類,繼承WebSecurityConfigurerAdapter,并重寫configure方法,配置SpringSecurity。 5. 在Vue項(xiàng)目中創(chuàng)建一個(gè)

    2024年01月15日
    瀏覽(17)
  • vue+springboot登錄與注冊(cè)功能的實(shí)現(xiàn)

    vue+springboot登錄與注冊(cè)功能的實(shí)現(xiàn)

    ?大致效果: 在component目錄下新建一個(gè)ValidCode.vue: 在登錄頁引入: ?效果圖(可以看到多了驗(yàn)證碼): 首先準(zhǔn)備數(shù)據(jù)庫: ?用IDEA創(chuàng)建springboot工程: 創(chuàng)建springboot教程 連接數(shù)據(jù)庫: application.yml: 目錄結(jié)構(gòu): 按照該目錄創(chuàng)建文件夾 ?CorsConfig:解決跨域問題 Result:返回?cái)?shù)據(jù)

    2024年02月19日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包