国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

vue后臺管理之動態加載路由的方法

來源:懂視網 責編:小采 時間:2020-11-27 22:10:16
文檔

vue后臺管理之動態加載路由的方法

vue后臺管理之動態加載路由的方法:在這里我們將會實現一個vue動態路由的案列,當用戶登陸成功后,根據用戶的角色,拿到他對應的菜單信息,并將它動態的載入到我們的路由中。 我們的通用的后臺管理系統中,我們會根據權限的粗細不同,會對每個角色每個權限每個資源進行控制。同樣的我們也需要實
推薦度:
導讀vue后臺管理之動態加載路由的方法:在這里我們將會實現一個vue動態路由的案列,當用戶登陸成功后,根據用戶的角色,拿到他對應的菜單信息,并將它動態的載入到我們的路由中。 我們的通用的后臺管理系統中,我們會根據權限的粗細不同,會對每個角色每個權限每個資源進行控制。同樣的我們也需要實

在這里我們將會實現一個vue動態路由的案列,當用戶登陸成功后,根據用戶的角色,拿到他對應的菜單信息,并將它動態的載入到我們的路由中。

我們的通用的后臺管理系統中,我們會根據權限的粗細不同,會對每個角色每個權限每個資源進行控制。同樣的我們也需要實現一個這樣的功能。 這篇文章我將主要講vue端的實現,關于后臺接口我就不會涉及,當我接觸的時候我們的后臺接口是springcloud實現。

一、思路

在vue-router對象中首先初始化公共路由,比如(404,login)等,然后在用戶登陸成功,根據用戶的角色信息,獲取對應權限菜單信息menuList,并將后臺返回的menuList轉換成我們需要的router數據結構,然后通過vue-router2.2新添的router.addRouter(routes)方法,同時我們可以將轉后的路由信息保存于vuex,這樣我們可以在我們的SideBar組件中獲取我們的全部路由信息,并且渲染我們的左側菜單欄,讓動態路由實現。

二、實現

1、公共路由定義

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)
/* Layout */
import Layout from '../views/layout/Layout'

export const constantRouterMap = [
 { path: '/login', component: () => import('@/views/login/index'), hidden: true },
 { path: '/404', component: () => import('@/views/404'), hidden: true },

 {
 path: '/',
 component: Layout,
 redirect: '/dashboard',
 name: 'Dashboard',
 hidden: true,
 children: [{
 path: 'dashboard',
 component: () => import('@/views/dashboard/index')
 }]
 },
]
export default new Router({
 scrollBehavior: () => ({ y: 0 }),
 routes: constantRouterMap
})

2、獲取菜單信息

router.beforeEach((to, from, next) => {
 NProgress.start() // start progress bar
 if (getToken()) { // determine if there has token
 /* has token*/
 if (to.path === '/login') {
 next({ path: '/' })
 NProgress.done() // if current page is dashboard will not trigger afterEach hook, so manually handle it
 } else {
 if (store.getters.roles.length === 0) { // 判斷當前用戶是否已拉取完user_info信息
 store.dispatch('GetInfo').then(res => { // 拉取user_info
 const roles = res.roles
 store.dispatch("GetMenu").then(data => {
 initMenu(router, data);
 });
 next()
 }).catch((err) => {
 store.dispatch('FedLogOut').then(() => {
 Message.error(err || 'Verification failed, please login again')
 next({ path: '/' })
 })
 })
 } else {
 next()
 }
 }
 } else {
 /* has no token*/
 if (whiteList.indexOf(to.path) !== -1) { // 在免登錄白名單,直接進入
 next()
 } else {
 next('/login') // 否則全部重定向到登錄頁
 NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it
 }
 }
})

router.afterEach(() => {
 NProgress.done() // finish progress bar
})

在這里 我們通過在router的beforeEach鉤子函數 判斷用戶是否已經獲得角色信息,如果沒有,則請求后臺獲取對應的角色信息,然后通過角色信息再次請求獲取對應的菜單列表,獲取到菜單列表,然后去格式化菜單列表,使其轉換成router數組的結構。

3、動態加載路由

import store from '../store'

export const initMenu = (router, menu) => {
 if (menu.length === 0) {
 return
 }
 let menus = formatRoutes(menu);
 // 最后添加
 let unfound = { path: '*', redirect: '/404', hidden: true }
 menus.push(unfound)
 router.addRoutes(menus)
 store.commit('ADD_ROUTERS',menus)
}

export const formatRoutes = (aMenu) => {
 const aRouter = []
 aMenu.forEach(oMenu => {
 const {
 path,
 component,
 name,
 icon,
 childrens
 } = oMenu
 if (!validatenull(component)) {
 let filePath;
 const oRouter = {
 path: path,
 component(resolve) {
 let componentPath = ''
 if (component === 'Layout') {
 require(['../views/layout/Layout'], resolve)
 return
 } else {
 componentPath = component
 }
 require([`../${componentPath}.vue`], resolve)
 },
 name: name,
 icon: icon,
 children: validatenull(childrens) ? [] : formatRoutes(childrens)
 }
 aRouter.push(oRouter)
 }

 })
 return aRouter
}

在這里我們把menList轉換成routerList因為我們后臺返回的數據不是規范的router結構,所以這里需要我們處理一下,如果你們后臺返回規范的就不需要處理,然后通過router.addRoutes把后臺返回的加入到我們的路由中,并且將其保存在我們的vuex中,需要主要的 如果404組件一定要放在動態路由在后載入。

4、渲染菜單

其實這里已經不屬于我們的所講的重點,在這里只需要取出上一步存在vuex中的路由信息,并且將其渲染成我們的左側菜單欄就可以。在這里我們使用了element-ui。

<template>
 <el-scrollbar wrapClass="scrollbar-wrapper">
 <el-menu
 mode="vertical"
 :show-timeout="200"
 :default-active="$route.path"
 :collapse="isCollapse"
 background-color="#304156"
 text-color="#bfcbd9"
 active-text-color="#409EFF"
 >
 <sidebar-item v-for="route in permission_routers" :key="route.name" :item="route" :base-path="route.path"></sidebar-item>
 </el-menu>
 </el-scrollbar>
</template>

<script>
import { mapGetters } from 'vuex'
import SidebarItem from './SidebarItem'
import { validatenull } from "@/utils/validate";
import { initMenu } from "@/utils/util";

export default {
 components: { SidebarItem },
 created() {
 },
 computed: {
 ...mapGetters([
 'permission_routers',
 'sidebar',
 'addRouters'
 ]),
 isCollapse() {
 return !this.sidebar.opened
 }
 }
}
</script>

就這樣我們動態加載路由就是實現了,是不是很簡單,關鍵點就是router.addRoute方法。下面我就說一下防踩坑點。

三、防坑

1、關于加載菜單信息的時機

在此之前我將第二步獲取菜單信息放在我的SideBar組件的create函數中,當時我發現也沒有什么問題。登錄跳轉到home界面 左側菜單也成功渲染,點擊菜單進入我們動態加載的路由界面,也沒問題。但是當我點擊刷新的時候問題來。頁面空白 控制臺也不報錯。當時我就蒙蔽了,什么情況,不是好好的嘛?如果大家也遇到這種這時候大家不要著急,冷靜的分析整個流程,就會發現問題的所在。

1、登陸成功跳轉home界面,home組件是公共路由,存在的沒問題。

2、這時候 sidebar組件create鉤子觸發,成功獲取菜單列表

3、菜單列表轉成路由數組,并且加載到router實例中和vuex中

4、sidebar從vuex獲取到路由數組渲染菜單 進入我們動態加載頁面中,顯示正常,這一切看起來沒什么問題

5、點擊瀏覽器的刷新按鈕、或者F5,頁面空白。

原因: 第五步中我們我們瀏覽器刷新,在spa應用整個vue實例會重新加載,也是說我的vue-router會重新初始化,那么我們之前的動態addRoute就不存在了,但是我們此時訪問一個不存在的頁面,所以我們的sidebar組件也就不會被訪問,那么也無法獲取菜單信息,就導致頁面空白。所以我們需要把加載菜單信息這一步放在router的全局守衛beforeEach中就可以了。

2、關于404組件的位置

大家可以看到

export const initMenu = (router, menu) => {
 if (menu.length === 0) {
 return
 }
 let menus = formatRoutes(menu);
 // 最后添加
 let unfound = { path: '*', redirect: '/404', hidden: true }
 menus.push(unfound)
 router.addRoutes(menus)
 store.commit('ADD_ROUTERS',menus)
}

我強調了 404組件一定要放在動態路由組件的最后,不然你刷新動態加載的頁面,會跳轉到404頁面的。

四、效果圖

動態路由

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

vue后臺管理之動態加載路由的方法

vue后臺管理之動態加載路由的方法:在這里我們將會實現一個vue動態路由的案列,當用戶登陸成功后,根據用戶的角色,拿到他對應的菜單信息,并將它動態的載入到我們的路由中。 我們的通用的后臺管理系統中,我們會根據權限的粗細不同,會對每個角色每個權限每個資源進行控制。同樣的我們也需要實
推薦度:
標簽: VUE 管理 動態的
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 欧美激情视频一区二区 | 国产精品亚洲欧美一级久久精品 | 黄色二级毛片 | 精品综合一区二区三区 | 欧美成人高清在线视频大全 | 国产欧美综合一区二区 | 91av欧美| 国产最新进精品视频 | 国产激情一区二区三区成人91 | 国产一区二区三区在线看 | 国产精品资源在线观看 | 亚洲欧美在线观看视频 | 香蕉久久网 | 国产成人久久精品区一区二区 | 亚欧免费视频一区二区三区 | 亚洲精国产一区二区三区 | 日韩 欧美 综合 在线 制服 | 国产不卡一区二区视频免费 | 国产成人精品日本亚洲语音2 | 国产不卡在线看 | 亚洲伦理中文字幕一区 | 国产欧美va欧美vahd | 美国一级大黄大色毛片视频一 | 国产精品免费观看视频 | 欧美午夜在线 | 亚洲欧美久久精品一区 | 免费国产在线视频 | 国产成人精品一区二区免费 | 日韩在线小视频 | 亚洲色图欧美自拍 | 亚洲欧美在线观看视频 | 亚洲 欧美 中文字幕 | 久久精品a亚洲国产v高清不卡 | 欧美日a| 欧美日韩性视频在线 | 久久国产精品成人免费 | 日本a中文字幕 | 91在线一区二区三区 | 国产一区二区免费播放 | 天天做天天爱夜夜爽毛片毛片 | 日韩高清欧美 |