位置: 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)(石楠花 开花)

  • 萤石摄像头怎么连接wifi(萤石摄像头怎么看回放)

    萤石摄像头怎么连接wifi(萤石摄像头怎么看回放)

  • 闲鱼订单怎么删除(闲鱼订单怎么删不掉)

    闲鱼订单怎么删除(闲鱼订单怎么删不掉)

  • qq扫码授权登录在哪里找(qq扫码授权登录游戏多久失效)

    qq扫码授权登录在哪里找(qq扫码授权登录游戏多久失效)

  • redmi k30pro变焦版和标准版的区别在哪里(redmik30pro变焦版什么时候上市的)

    redmi k30pro变焦版和标准版的区别在哪里(redmik30pro变焦版什么时候上市的)

  • 快手可以挂淘宝链接吗(快手可以挂淘宝商品吗)

    快手可以挂淘宝链接吗(快手可以挂淘宝商品吗)

  • 怎么故意让手机死机(怎么故意让手机开不了机)

    怎么故意让手机死机(怎么故意让手机开不了机)

  • oppo改不了主题锁屏(oppo手机为什么设置不了主题)

    oppo改不了主题锁屏(oppo手机为什么设置不了主题)

  • 开发版切换为稳定版时会清除手机数据吗(开发版切换稳定版)

    开发版切换为稳定版时会清除手机数据吗(开发版切换稳定版)

  • 怎么改快手昵称为什么显示已经被注册了(改快手昵称说该名字已被注册)

    怎么改快手昵称为什么显示已经被注册了(改快手昵称说该名字已被注册)

  • 手机无法连接wifi,别的手机就可以(手机无法连接wifi是怎么回事)

    手机无法连接wifi,别的手机就可以(手机无法连接wifi是怎么回事)

  • 八位的二进制数+0110101的补码是(八位的二进制数10010110的补码为)

    八位的二进制数+0110101的补码是(八位的二进制数10010110的补码为)

  • 闲鱼追评为什么不显示(闲鱼追评为什么被删除了)

    闲鱼追评为什么不显示(闲鱼追评为什么被删除了)

  • los不亮怎么解决(los不亮是什么原因)

    los不亮怎么解决(los不亮是什么原因)

  • 电脑显示器显示无信号是为什么(电脑显示器显示不全怎么调整)

    电脑显示器显示无信号是为什么(电脑显示器显示不全怎么调整)

  • 苹果手机全网通是啥意思(苹果手机全网通和wifi版的区别)

    苹果手机全网通是啥意思(苹果手机全网通和wifi版的区别)

  • 微信朋友圈可以对指定人开放吗(微信朋友圈可以编辑修改吗)

    微信朋友圈可以对指定人开放吗(微信朋友圈可以编辑修改吗)

  • 手机文件怎么备份(手机文件怎么备份到另一个手机)

    手机文件怎么备份(手机文件怎么备份到另一个手机)

  • 为什么无法下载小红书(为什么无法下载steam)

    为什么无法下载小红书(为什么无法下载steam)

  • 抖音忘记账号密码怎么办(抖音账号密码忘记,记得抖音号)

    抖音忘记账号密码怎么办(抖音账号密码忘记,记得抖音号)

  • 苹果6sp闪光灯在哪开(苹果6sp闪光灯不亮)

    苹果6sp闪光灯在哪开(苹果6sp闪光灯不亮)

  • 摇一摇被限制要多久(摇一摇被限制了怎么办)

    摇一摇被限制要多久(摇一摇被限制了怎么办)

  • 苹果手机怎么下载200m以上的软件(苹果手机怎么下一行打字)

    苹果手机怎么下载200m以上的软件(苹果手机怎么下一行打字)

  • 苹果xs有nfc功能吗(苹果xsnfc功能能刷门禁)

    苹果xs有nfc功能吗(苹果xsnfc功能能刷门禁)

  • 火狐浏览器如何截屏(火狐浏览器如何收藏网址)

    火狐浏览器如何截屏(火狐浏览器如何收藏网址)

  • PHPCMS中CSS文件放到哪里?(css文件代码示例)

    PHPCMS中CSS文件放到哪里?(css文件代码示例)

  • 资产现金流量收益率计算例题
  • 出差补贴要不要发票
  • 隔年的发票能冲销吗
  • 支付宝转账到银行卡多久到账
  • 未计提坏账准备金额在哪个科目
  • 不动产转让费用咋算
  • 企业外包项目如何确认收入成本配比?
  • 小规模纳税人的税率是多少(含国、地税)
  • 预缴增值税预缴的城建税怎么申报
  • 工会经费按上年工资总额还是本年
  • 个人独资企业所得税
  • 简并税率后,申报增值税要注意哪几点?
  • 增值税优惠政策有哪些
  • 小规模免税增值税申报表怎么填
  • 上个月个税申报能作废重报吗
  • 境外企业在境外提供劳务
  • 超市收取的返利的税收处理
  • windows 10鼠标如何操作
  • 结转采购材料的实际成本会计分录怎么写
  • 收到招标公司开的发票
  • 预提利息的分录怎么做
  • 动态路由协议rip配置实验心得
  • ipad os 16
  • php统计当前在线人数
  • Win11 Build10.0.22000.51预览版正式推送 (附完整更新日志)
  • 税控机抵减增值税税额
  • macos字体
  • css边框怎么做
  • 房屋租赁费如何结转成本
  • 企业新录用并签订
  • php @method
  • laravel dump
  • 职工福利费的开支范围有哪些
  • 工商年报中营业费用包括
  • 进销存如何结转成本
  • idea如何运行springboot项目
  • 数据库impala
  • php正则表达式匹配链接
  • 食堂维修费用计什么科目
  • cvpr2023最佳论文
  • 房地产预缴所得税计算公式
  • vue vscode snippets
  • sortable js
  • mysql_install_db命令 初始化MySQL数据目录
  • 增值税留抵税额计入什么科目
  • 自产自用车辆购置税组成计税价格
  • 年末未分配利润怎么算
  • 企业的资产评估报告在哪里获取
  • 未确认融资费用账务处理
  • 建设单位罚款
  • 资产减值损失是什么意思
  • 开红字发票需要做收回原发票吗?
  • 企业借款利息如何计算
  • 开立银行承兑汇票利率
  • 租车费报销管理规定
  • 个人支付宝开票一年可以开多少
  • 怎么看发票的凭证号
  • 收到上市公司分红企业所得税减半征收的情景
  • 企业注销其他应付款怎么处理账务
  • 年度的汇算清缴
  • 系统组策略打不开
  • 如何配置samba配置文件
  • linux怎么用u盘传输文件
  • 如何使用windows 10
  • Win10 Mobile RS2预览版WiFi设置页面将和pc页面相同
  • 安装ubuntu不支持nvidia显卡
  • windows中alt+tab
  • win7360安全卫士有必要装吗
  • windows桌面右下角图标不显示
  • WIN10系统更新怎么关闭
  • shell脚本用法
  • 网关绑定失败怎么设置
  • node.js速成
  • jquery html5 视频播放控制代码
  • Nodejs+express+ejs简单使用实例代码
  • javascript 基础篇2 数据类型,语句,函数
  • shell脚本 ftp
  • Android的AdapterView及其子类简介-android学习之旅(二十三)
  • javascript new fun的执行过程
  • jquery的选择器都有哪些
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设