位置: IT常识 - 正文

(二) Vue3 + Element-Plus 实现动态菜单栏

编辑:rootadmin
(二) Vue3 + Element-Plus 实现动态菜单栏 系列文章目录系列介绍:Vue3 + Vite + TS 从零开始学习项目搭建:(一) Vue3 + Vite + TS 项目搭建实现动态菜单栏:(二) Vue3 + Element-Plus 实现动态菜单栏实现动态面包屑:(三) Vue3 + Element-Plus 实现动态面包屑实现动态标签页:(四) Vue3 + Element-Plus 实现动态标签页实现动态主题色切换(demo):(五) Vue3 + Element-Plus 实现动态主题色切换踩坑记录(持续更新):(六) Vue3 踩坑记录文章目录系列文章目录一、引入依赖二、目录结构三、核心代码1. auth-api.js2. permission.js3.sidebar.vue4.router.js四、最终效果一、引入依赖

推荐整理分享(二) Vue3 + Element-Plus 实现动态菜单栏,希望有所帮助,仅作参考,欢迎阅读内容。

(二) Vue3 + Element-Plus 实现动态菜单栏

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

开始前请确保已经安装以下依赖:

VueX$ npm i vuex --saveVue-Router$ npm i vue-router --saveNProgress$ npm i nprogress --save二、目录结构|-src -- 主目录---|api -- Ajax请求统一存放目录------|auth-api.js -- 路由数据获取接口---|js -- JS脚本------|permission.js -- NProgress进度条数据处理---|layout -- 页面布局组件------|sidebar.vue -- 侧边栏布局组件---|store -- VueX------|router.js -- 路由全局常量三、核心代码1. auth-api.jsimport request from '@/js/request'export default { routers(data) { return request.post('/routers', data) }}2. permission.jsimport router from '../router'import store from '../store'import NProgress from 'nprogress'import 'nprogress/nprogress.css'import { getCookie } from './cookie'import Layout from '../layout/index.vue'import ParentView from '../components/ParentView/index.vue'NProgress.configure({ showSpinner: false })const whiteList = ['/login', '/register']router.beforeEach((to, from, next) => { NProgress.start() if (getCookie()) { if (to.path === '/login') { next({ path: '/' }) NProgress.done() } else { if (store.state.user.menus.length === 0) { store.dispatch('GetInfo').then(res => { const menuIds = res.data.menuIds store.dispatch('GenerateRoutes', menuIds).then(routes => { filterRoutes(routes) routes.forEach(route => { router.addRoute(route) }) next({ ...to, replace: true }) }) }).catch(() => { next() }) } else { next() } } } else { if (whiteList.indexOf(to.path) !== -1) { next() } else { next(`/login?redirect=${to.fullPath}`) NProgress.done() } }})router.afterEach(() => { NProgress.done()})const filterRoutes = (routes) => { const accessRoutes = routes.filter(route => { let modules = import.meta.glob('../views/**/*.vue') if (route.component) { if (route.component === 'ParentView') { route.component = ParentView } else if (route.component === 'Layout') { route.component = Layout } else { route.component = modules[`../views/${route.component}.vue`] } } if (route.children && route.children.length) { filterRoutes(route.children) } return true }) return accessRoutes}3.sidebar.vue<template> <el-aside width="210px" class="aside-wrapper"> <el-scrollbar> <el-menu :default-active="route.path" mode="vertical" :collapse-transition="false" router class="menu-wrapper"> <el-sub-menu v-for="menu in menus" :key="menu.path" :index="menu.path"> <template #title> <el-icon><component :is="menu.meta.icon" /></el-icon> <span>{{ menu.name }}</span> </template> <el-menu-item v-for="child in menu.children" :key="child.path" :index="child.path"> <template #title> <el-icon><component :is="child.meta.icon" /></el-icon> <span>{{ child.name }}</span> </template> </el-menu-item> </el-sub-menu> </el-menu> </el-scrollbar> </el-aside></template><script lang="ts" setup>import { computed } from 'vue'import { useStore } from 'vuex'import { useRoute } from 'vue-router'const store = useStore()const route = useRoute()const menus = store.state.router.accessRoutes</script>4.router.jsimport { authApi } from '@/api'import constantRoutes from '@/router/routes'const router = { state: { routes: [], accessRoutes: [] }, mutations: { SET_ROUTES: (state, routes) => { state.routes = routes }, SET_ACCESSROUTES: (state, accessRoutes) => { state.accessRoutes = accessRoutes } }, actions: { GenerateRoutes({ commit }, roleIds) { return new Promise(resolve => { authApi.routers(roleIds).then(res => { const accessRoutes = res.data filterRoutes('', accessRoutes) const routes = constantRoutes.concat(accessRoutes) commit('SET_ROUTES', routes) commit('SET_ACCESSROUTES', accessRoutes) resolve(routes) }) }) } }}const filterRoutes = (path, routes) => { routes.forEach(route => { const routePath = route.path if (route.parentId !== '0') { route.path = path + "/" + routePath } if (route.children && route.children.length) { filterRoutes(routePath, route.children) } })}export default router四、最终效果

本文链接地址:https://www.jiuchutong.com/zhishi/285057.html 转载请保留说明!

上一篇:Linux basename命令的使用详解(linux-base)

下一篇:石楠花丛中的一只欧亚红松鼠,英格兰 (© Christopher Drabble/Alamy)(石楠花 开花)

  • 系统评价与meta分析的区别(系统评价与meta分析的关系)

    系统评价与meta分析的区别(系统评价与meta分析的关系)

  • 华为mate20pro指纹锁没有了(华为mate20pro指纹设置不见了)

    华为mate20pro指纹锁没有了(华为mate20pro指纹设置不见了)

  • 笔记本bios电池在哪里(笔记本bios电池能用多久)

    笔记本bios电池在哪里(笔记本bios电池能用多久)

  • 苹果xsmax屏幕有绿线怎么办(苹果xsmax换屏幕)

    苹果xsmax屏幕有绿线怎么办(苹果xsmax换屏幕)

  • 快手当前在线是什么意思(快手当前在线是在玩快手吗)

    快手当前在线是什么意思(快手当前在线是在玩快手吗)

  • qq通知栏不显示消息怎么设置

    qq通知栏不显示消息怎么设置

  • windows是什么系统(windows是什么电脑)

    windows是什么系统(windows是什么电脑)

  • vivox27自带美颜吗(vivox20美颜)

    vivox27自带美颜吗(vivox20美颜)

  • q77主板支持的cpu有哪些(q77主板支持的e31280v2吗)

    q77主板支持的cpu有哪些(q77主板支持的e31280v2吗)

  • 支付宝新人专区找不到(支付宝新人专享活动界面怎么找)

    支付宝新人专区找不到(支付宝新人专享活动界面怎么找)

  • ipad微信没有注册按钮(ipad微信注册不了怎么回事)

    ipad微信没有注册按钮(ipad微信注册不了怎么回事)

  • 中继器和路由器的区别(中继器和路由器分别工作在)

    中继器和路由器的区别(中继器和路由器分别工作在)

  • 一个人坐飞机能带几个充电宝(一个人坐飞机能带几瓶酒)

    一个人坐飞机能带几个充电宝(一个人坐飞机能带几瓶酒)

  • 微信朋友圈仅聊天什么意思(微信朋友圈仅聊天怎么恢复)

    微信朋友圈仅聊天什么意思(微信朋友圈仅聊天怎么恢复)

  • 手机上方出现hd怎么关(手机上方出现HD收费吗)

    手机上方出现hd怎么关(手机上方出现HD收费吗)

  • 蓝牙耳机怎么调双声道(蓝牙耳机怎么调成中文)

    蓝牙耳机怎么调双声道(蓝牙耳机怎么调成中文)

  • 华为3手环怎么接电话(华为3手环怎么换表盘)

    华为3手环怎么接电话(华为3手环怎么换表盘)

  • 微信好友上限怎么突破(微信好友上限怎么弄)

    微信好友上限怎么突破(微信好友上限怎么弄)

  • 腾讯能用手机号登录吗(腾讯用手机号怎么登录会员)

    腾讯能用手机号登录吗(腾讯用手机号怎么登录会员)

  • iphone 11支持双卡吗(iphone11支持双卡双待吗)

    iphone 11支持双卡吗(iphone11支持双卡双待吗)

  • 键盘剪切是哪个键(键盘剪切是什么意思)

    键盘剪切是哪个键(键盘剪切是什么意思)

  • appleid不在激活状态什么意思(苹果id不在激活状态)

    appleid不在激活状态什么意思(苹果id不在激活状态)

  • 高德地图没有语音播报怎么回事(高德地图没有语音助手)

    高德地图没有语音播报怎么回事(高德地图没有语音助手)

  • nginx部署多个前端项目(nginx部署前后端项目)

    nginx部署多个前端项目(nginx部署前后端项目)

  • Dedecms v5.3没有下载地址的解决方法(dedecms安装及配置)

    Dedecms v5.3没有下载地址的解决方法(dedecms安装及配置)

  • 车船税是否每年都交
  • 餐饮流水账表格excel
  • 上年数为负数,今年数为正数怎么算增减比率
  • 发票开错但已勾选还需要认证吗
  • 小规模10万元免税
  • 服务类公司没有营业执照
  • 跨年调整会计科目怎么写
  • 从农民合作社取得的普通发票可以抵扣吗
  • 盘盈资产开具发票是否符合规定
  • 买卖金融商品应交增值税计算
  • 融资租赁流程
  • 建安企业无收入怎么结转成本?
  • 进口货物付款计入哪个科目?
  • 腾讯计算机系统扣费15元怎么查
  • 去税务局税种认定需要带什么资料
  • 电子承兑都是银行承兑吗
  • 不动产分期转出要交税吗
  • 专用发票没有写购买方电话号码
  • 按揭的车可以只买交强险吗
  • win11桌面图标如何固定不动
  • 水土保持补偿费是一次性征收吗
  • 主营业务收入的计算公式
  • php删除数组中的某个值
  • 开机后网络连接很慢
  • 收到客户预付的保费90000元,存入银行
  • 最强笔记本2021
  • 无法将node项识别为
  • 保险公司应收账款管理现状及存在的问题
  • 坏账损失的核算方法属于会计政策吗
  • 取得企业债券利息为什么要交个人所得税
  • php dicom
  • 房地产企业公司
  • php 表单
  • 采用权益法核算
  • 在高地陶恩山脉的滑雪旅行,奥地利巴德加斯坦 (© RooM the Agency/Alamy)
  • smarty模板注入
  • yolov2模型
  • transformerss
  • 销售费用工资明细科目
  • 公司账户转账给个人要交税吗
  • 经销商会议是什么意思
  • 政府补助的界定
  • 土地增值税中开发间接费用工资包括哪些人
  • 税控盘抄报税逾期怎么办
  • 如何冲减计提费用
  • 个税速算扣除数2023
  • 财务报表中的净利润
  • 无形资产出售时累计摊销为什么在借方
  • 公司购买银行理财产品怎么做账
  • 多付款项退回怎么做账
  • 本期盈余为负数怎么调整
  • 个体工商户怎样为员工缴纳社保
  • 企业凭证处理流程图
  • 企业购入树木花草如何入账
  • 年度利润总额怎么填
  • 实现分页功能的多种原理方案
  • mysql 非聚集索引
  • win10免费安装吗
  • 设置ubuntu
  • kali linux 视频教程
  • xp蓝屏事件
  • xboxone系统更新错误
  • shell下同时读取多个文件的方法
  • win7如何更改欢迎界面
  • node.js gui
  • 在布局中使用选定的比例
  • Android游戏开发案例教程小小弹球
  • 游戏输入法安卓
  • css怎么更换图片
  • python 入门
  • 处理及遍历xml文件怎么做
  • python利用数据文件统计成绩
  • python可变参数和不可变参数
  • 在unity中单例的主要作用
  • 下列关于js的说法正确的是
  • bash fi
  • 安卓高德地图开启相机权限
  • 中国有没有豁免权
  • 010是哪个市区的电话号码
  • 微信 税务
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设