<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在做Vue管理系統的時候,都會遇到的一個需求:每個使用者的許可權是不一樣的,那麼他可以存取的頁面(路由),可以操作的選單選項是不一樣的,如果由後端控制,我們前端需要去實現動態路由,動態渲染側邊選單欄。
重點:實現動態路由api
定義共用的頁面路由(無論哪個使用者都會有的)
如無論什麼使用者都可存取登入頁login,錯誤頁面404。
import { createRouter, createWebHashHistory } from 'vue-router' const publicRoutes = [ { path: '/', redirect: { path: '/login' } }, { path: '/login', name: 'login', component: () => import('../views/login') }, { path: '/404', name: '404', component: () => import('../views/404') }, { path: '/home', name: 'home', component: () => import('../views/home'), redirect: '/welcome', children: [ { path: '/:pathMatch(.*)*', // 捕獲所有路由或 404 Not found 路由 component: () => import('../views/welcome') } ] } ] const router = createRouter({ history: createWebHashHistory(), routes: publicRoutes }) export default router
介面資料:這裡模擬介面的路由資料(這裡進行資料精簡,便於演示,實際情況可能要進行資料結構格式的轉換)
navigationList : [ { id: 1, icon: 'icon-jurassic_user', name: '使用者管理', url: '/user' }, { id: 2, icon: 'icon-jurassic_user', name: '角色管理', url: '/role' }, { id: 3, icon: 'icon-shebei', name: '裝置管理', url: '/device' } ]
新增動態路由進去的時機(router.beforeEach)
利用全域性前置守衛router.beforeEach,在跳轉路由前先判斷是否已經新增過動態路由了,如果沒有,則先獲取資料進行新增路由。(router.beforeEach也會做登入等攔截,這裡省略)
import store from '@/store' //這裡我用vuex的一個變數 asyncRoutestMark 來標識是否拼接過路由 router.beforeEach((to, from, next) => { if (!store.state.asyncRoutestMark) { // navigationList 是上面模擬介面返回的資料 // 這裡將新的路由都作為 home 的子路由(實際開發根據情況) // meta 是儲存一些資訊,可以用於許可權校驗或其他 navigationList.forEach( navigation => { router.addRoute('home', { path: navigation.url, meta: { name: navigation.name, isAsync: true, icon: navigation.icon }, name: menu.url, component: () => import(`../views/${menu.url}`) }) }) console.log(router.getRoutes(), '檢視現有路由') store.commit('setAsyncRoutestMark', true) // 新增路由後更改標識為true next({ ...to, replace: true }) //路由進行重定向放行 } else { next() } })
利用router.getRoutes()方法檢視現有路由,我們將會看到根據新的路由新增進去了。
這樣我們就實現了動態路由啦!
很多元件庫都可以實現這個功能,這裡我們將使用 Ant Design of Vue 元件庫的內嵌選單元件(如下圖)去實現,有父選單,子選單,父級選單的是用 a-sub-menu 包裹,子選單的是直接使用 a-menu-item,大家可以去看檔案看一下元件的使用。
介面資料:這裡模擬介面的選單資料(實際情況可能要進行資料結構格式的轉換)
menuList :[ { url: '', name: '人員管理', icon: 'icon-renyuan', menuId: 1, children: [ { url: '/user', name: '使用者管理', icon: 'icon-jurassic_user', menuId: 1001, children: [] }, { url: '/role', name: '角色管理', icon: 'icon-jiaose', menuId: 1002, children: [] } ] }, { url: '/device', name: '裝置管理', icon: 'icon-shebei', menuId: 2 } ]
重點:元件遞迴
使用v-for迴圈選單資料陣列,渲染元件庫 ant design of vue的選單元件,這時分兩種情況,
下面為選單元件,元件名為MenuList,遞迴呼叫的時候要用到元件名,以達到根據不同資料渲染選單的情況
沒有圖示版本
<template> <template v-for="menu in menuList" :key="menu.menuId"> <a-sub-menu v-if="menu.children && menu.children.length" :key="menu.menuId"> <template #title>{{ menu.name }}</template> <MenuList :menuList="menu.children" /> </a-sub-menu> <a-menu-item :key="menu.menuId" v-else> <span>{{ menu.name }}</span> </a-menu-item> </template> </template> <script setup> import { defineProps } from 'vue' defineProps({ menuList: { type: Array, default: () => [] } }) </script>
效果如下
有圖示版本
圖示是根據介面資料的icon去匹配的,有多種方法,例如使用iconFont、svg、png,主要是去對應圖示的名字,這裡使用元件庫提供的使用icon的iconFont方法。
<template> <template v-for="menu in menuList" :key="menu.menuId"> <a-sub-menu v-if="menu.children && menu.children.length" :key="menu.menuId"> <template #icon> <icon-font :type="menu.icon" /> </template> <template #title>{{ menu.name }}</template> <MenuList :menuList="menu.children" /> </a-sub-menu> <a-menu-item :key="menu.menuId" v-else> <template #icon> <icon-font :type="menu.icon" /> </template> <span>{{ menu.name }}</span> </a-menu-item> </template> </template> <script setup> import { defineProps } from 'vue' import { createFromIconfontCN } from '@ant-design/icons-vue' const IconFont = createFromIconfontCN({ scriptUrl: '//at.alicdn.com/t/font_2572336_4hg62uu7hxd.js' }) defineProps({ menuList: { type: Array, default: () => [] } }) </script>
效果如下:
這樣我們就實現了動態側邊選單欄啦!
到此這篇關於如何利用Vue3管理系統實現動態路由和動態側邊選單欄的文章就介紹到這了,更多相關Vue3動態路由和動態側邊選單欄內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45