位置: IT常识 - 正文

Vue 动态菜单+动态路由(基于Element UI)(vue实现动态菜单权限配置)

编辑:rootadmin
Vue 动态菜单+动态路由(基于Element UI) 文章目录使用场景一、动态菜单

1.创建菜单组件二、动态面包屑

1.创建面包屑组件三、动态标签页

1.创建标签页组件四、动态路由

1.router代码2.store代码总结使用场景

推荐整理分享Vue 动态菜单+动态路由(基于Element UI)(vue实现动态菜单权限配置),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue动态菜单实例,vue动态界面,vue如何实现动态组件,vue实现动态菜单,vue实现动态菜单,vue动态界面,vue3动态菜单,vue动态菜单栏,内容如对您有帮助,希望把文章链接给更多的朋友!

主要使用Vue3与Element UI,在项目开发中可能会遇到从后端取得数据,到前端去渲染菜单,从而实现动态路由与动态菜单。

一、动态菜单1.创建动态菜单组件

 代码如下:

<template> <div> <el-menu :unique-opened="true" :default-openeds="openList" :default-active="'/index/' + this.$store.state.TabseditableTabsValue" :collapse-transition="true" router class="el-menu-vertical-demo" style="width: 200px;min-height: calc(100vh );"> <el-sub-menu v-for="(menu, i) in menus" :index="i + 1" :key="i"> <template #title> <el-icon> <Avatar /> </el-icon> <span>{{ menu.authname }}</span> </template> <el-menu-item-group> <el-menu-item @click="getpath(item.path, item.authname, item.name, menu.authname ,menu.path)" :index="'/index/' + item.path" v-for="(item, index) in menu.children" :key="index"> <el-icon> <ArrowRight /> </el-icon>{{ item.authname }} </el-menu-item> </el-menu-item-group> </el-sub-menu> </el-menu> </div></template><style>.el-menu-item-group__title { display: none;}</style><script>import { ref } from 'vue'import Tabs from '@/components/Tabs.vue';export default { name: 'Aside', created() { this.getrouter(); }, data() { return { openList: ['1'], menus: '', } }, components: { Tabs }, methods: { //登录界面请求网络已经拿到数据存入vuex,取出数据渲染使用; getrouter() { this.menus=this.$store.state.Routers }, //点击子菜单触发事件 getpath(path, authname, name, Menu_title ,Menu_path) { //将面包屑的数据传入vuex,方便面包屑数据变换 this.$store.state.Breadcrumb_title = Menu_title; this.$store.state.Breadcrumb.title = authname; this.$store.state.Breadcrumb.path = path; this.$store.state.Breadcrumb.name = name; let tabs = this.$store.state.Tabs; const index = tabs.some(item => { if (item.title === authname) { return true; } else { return false; } }) if (index === false) { //添加Tab标签页(将数据放入vuex存起来) let tab = { title: authname, name: name, path: path, }; this.$store.state.Tabs.push(tab); this.$store.state.TabseditableTabsValue = name; } else { this.$store.state.TabseditableTabsValue = name; } this.$router.replace({path: "/index/"+path}) }, },}</script>二、动态面包屑1.创建面包屑组件

代码如下:

<style>.el-breadcrumb__item{ cursor: pointer;}.el-breadcrumb__item .el-breadcrumb__inner{ cursor: pointer;}</style><template> <el-breadcrumb style="transform: translate(-12%,-50%);margin-left: 10.7%;padding: 10px;"> <el-breadcrumb-item>首页</el-breadcrumb-item> <el-breadcrumb-item >{{this.$store.state.Breadcrumb_title}}</el-breadcrumb-item> <el-breadcrumb-item replace :to="{path:Breadcrumb.path}" >{{this.$store.state.Breadcrumb.title}}</el-breadcrumb-item> </el-breadcrumb></template><script>export default { name: 'Breadcrumb', created(){ }, components: { }, data() { return { Breadcrumb:this.$store.state.Breadcrumb,//从vuex中拿到面包屑数据并渲染 } }, methods:{ },}</script> 三、动态标签页1.创建标签页组件

代码如下:

<template> <el-tabs v-model="this.$store.state.TabseditableTabsValue" type="card" @tab-click="tabClick" closable @tab-remove="removeTab"> <el-tab-pane v-for="(item, index) in editableTabs" :key="index" :label="item.title" :name="item.name"></el-tab-pane> </el-tabs></template><script>import store from '@/store/index.js';import router from '@/router/index.js';export default { name: 'Tabs', data() { return { editableTabs: store.state.Tabs,//从vuex获取Tabs的数据。 tabIndex: 2 } }, methods: { //标签页被点击,则换面包屑数据。 tabClick(tab,event) { store.state.Breadcrumb.title=tab.props.label; store.state.Breadcrumb.path='/index/'+tab.props.name; store.state.Breadcrumb.name=tab.props.name; router.replace({ path:'/index/'+tab.props.name }) }, //删除标签页,则选中前一个标签页,并激活其对应的路由页面。 removeTab(targetName) { if (targetName == 'Home') { return } store.commit('delTabRouter', targetName)//在vuex找到方法delTabRouter,删除标签。 if (store.state.TabseditableTabsValue == targetName) { // 设置当前激活的路由 if (this.editableTabs && this.editableTabs.length >= 1) { store.state.Breadcrumb.title=this.editableTabs[this.editableTabs.length - 1].title; store.state.Breadcrumb.path='/index/'+this.editableTabs[this.editableTabs.length - 1].name; store.state.Breadcrumb.name=this.editableTabs[this.editableTabs.length - 1].name; store.commit('setActiveIndex', this.editableTabs[this.editableTabs.length - 1].name) router.replace({ path: this.editableTabs[this.editableTabs.length - 1].path }) } else { router.replace({ path: '/index/Home' }) store.state.TabseditableTabsValue = 'Home'; store.commit('setTabRouter', { path: '/Home', name: 'Home', title: '员工信息表' }) } } }, },}</script> 四、动态路由1.router

index.js代码如下:

import { createRouter, createWebHistory } from 'vue-router'import store from '@/store';const routes = [//初始静态路由 { path: '/', name: 'login', component: () => import('@/views/Login.vue'), }, { path: '/index', name: 'Homepage', component: () => import('@/views/Homepage.vue'), redirect: '/index/Home', children: [{ path: 'Home', name: 'Home', component: () => import('@/views/Home.vue'), }] },]const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes})var tag = true;//设置全局变量//路由拦截router.beforeEach(async (to, form, next) => { //第一次登录时,全局变量为true执行,第二次刷新,再次执行 if (tag) { tag = false; if (to.name === 'login') { next() } else { let Routers = store.state.Routers; addRoutes(Routers); next(to.path); } } else { next() }})//添加路由的方法export function addRoutes(res) { res.forEach((Router, index) => { router.addRoute({ path: Router.path, name: Router.name, component: () => import('@/views/' + Router.name + '.vue'), }) let childrens = Router.children; if (childrens != undefined) { for (let i = 0; i < childrens.length; i++) { if (childrens[i] != undefined) { router.addRoute('Homepage', { path: childrens[i].path, name: childrens[i].name, component: () => import('@/views/' + childrens[i].name + '.vue') }) } } } })}export default router2.storeVue 动态菜单+动态路由(基于Element UI)(vue实现动态菜单权限配置)

index.js代码如下:

import { createStore } from 'vuex';import router from '@/router';export default createStore({ state: { Routers: '',//登录获取的全部路由 setAsyncRoutestMark: 'false', TabseditableTabsValue: 'Home',//当前选中Tab的名字 Breadcrumb_title: '员工管理',//菜单栏标签 //全部标签 Tabs: [ { title: '员工信息表', name: 'Home', path: '/index/Home', } ], //选中的标签 Breadcrumb: { title: '员工信息表', name: 'Home', path: '/index/Home' } }, getters: { getTabs: state => { return state.Tabs; }, getRouters: state => { return state.Routers; } }, mutations: { //添加tabs路由 setTabRouter(state, data) { state.Tabs.push(data) }, // 删除tabs路由 delTabRouter(state, data) { let index = 0; for (let option of state.Tabs) { if (option.path == data) { break } index++ } state.Tabs.splice(index, 1); // 删完路由后也要保存到session中 // sessionStorage.setItem('Tabs', JSON.stringify(state.Tabs)) }, // 设置当前激活的tabs setActiveIndex(state, index) { state.TabseditableTabsValue = index state.Breadcrumb.name = index; }, }, actions: { }, modules: { }})总结思路

1.  路由守卫判定当初次登录时,后端返回路由数据,处理完数据放进vuex存起来。

2.(1)菜单组件去获取vuex的路由数据,进行处理形成自己需要的菜单数据并进行渲染。

   (2)标签页组件去vuex获取Tabs数据,进行渲染。

     (3)   面包屑直接从vuex里获取数据,进行渲染。

3.  操作(1)当子菜单栏被点击时,在vuex(即store)里面添加Tab数据,同时标签页、面包屑实时渲染。

     操作(2)当标签页被删除时,在vuex里删除其数据,同时选中上一次点击的子菜单栏和标签页,面包屑也跟着变化

     操作(3)  切换标签,动态菜单跟着切换选中

4.  当路由守卫判定不为初次登录时,则被认为是在刷新,则从sessionStorage缓存中找到数据赋值给store,重新渲染路由,使页面不为空白

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

上一篇:【Vue】动态组件和异步组件(vue 动态组件)

下一篇:go语言入门-一文带你掌握go语言函数(go语言入门指南)

  • vivo手机来电视频怎么取消(vivo手机来电视频铃声怎么取消)

    vivo手机来电视频怎么取消(vivo手机来电视频铃声怎么取消)

  • 苹果微距怎么打开(苹果微距怎么打开12)

    苹果微距怎么打开(苹果微距怎么打开12)

  • 抖音隐藏作品会有影响吗(抖音隐藏作品会不会有影响)

    抖音隐藏作品会有影响吗(抖音隐藏作品会不会有影响)

  • 淘宝退货上传凭证什么意思(淘宝退货上传凭证没有权限)

    淘宝退货上传凭证什么意思(淘宝退货上传凭证没有权限)

  • 注销微信后手机号能重新注册账号吗(注销微信后手机号多久解绑)

    注销微信后手机号能重新注册账号吗(注销微信后手机号多久解绑)

  • 交换机能直接连光猫吗(交换机能直接连DDN线路吗)

    交换机能直接连光猫吗(交换机能直接连DDN线路吗)

  • 表格中间线如何加粗(中间表格的线不见怎么加上去)

    表格中间线如何加粗(中间表格的线不见怎么加上去)

  • 快手级别是什么意思(快手上的级别是怎样升的)

    快手级别是什么意思(快手上的级别是怎样升的)

  • 服务器已满是什么意思(服务器已满请稍后再试)

    服务器已满是什么意思(服务器已满请稍后再试)

  • 电脑ie系列浏览器有哪些(电脑ie系列浏览器怎么用)

    电脑ie系列浏览器有哪些(电脑ie系列浏览器怎么用)

  • opporeno3pro怎么放卡(opporeno3怎么使用)

    opporeno3pro怎么放卡(opporeno3怎么使用)

  • 红米k20是不是三星屏(红米k20是三星屏吗)

    红米k20是不是三星屏(红米k20是三星屏吗)

  • 淘宝预售定金能退吗(淘宝预售定金能退吗怎么退)

    淘宝预售定金能退吗(淘宝预售定金能退吗怎么退)

  • 电脑开始菜单不见了(电脑开始菜单不见了没法关机)

    电脑开始菜单不见了(电脑开始菜单不见了没法关机)

  • 南方cass怎么标注线条长度(南方Cass怎么标注尺寸)

    南方cass怎么标注线条长度(南方Cass怎么标注尺寸)

  • 如何将纸质版转换为电子版(如何把纸质版转换成电子版)

    如何将纸质版转换为电子版(如何把纸质版转换成电子版)

  • 手机横幅显示是什么

    手机横幅显示是什么

  • 华为agsl09是什么型号(华为ags-l03是什么型号)

    华为agsl09是什么型号(华为ags-l03是什么型号)

  • 什么是ac(什么是ace)

    什么是ac(什么是ace)

  • 手机怎么下载b站视频(手机怎么下载不了软件了?)

    手机怎么下载b站视频(手机怎么下载不了软件了?)

  • beatssolo3怎么重置(beatssolo3怎么重新连接)

    beatssolo3怎么重置(beatssolo3怎么重新连接)

  • 苹果电池寿命在哪看(苹果电池寿命在爱思怎么越来越多)

    苹果电池寿命在哪看(苹果电池寿命在爱思怎么越来越多)

  • 手机键盘大小怎么设置(手机键盘大小怎么调整oppo)

    手机键盘大小怎么设置(手机键盘大小怎么调整oppo)

  • 鸿蒙系统怎么同时打开两个应用?鸿蒙同时开两个应用方法(鸿蒙系统怎么同步数据)

    鸿蒙系统怎么同时打开两个应用?鸿蒙同时开两个应用方法(鸿蒙系统怎么同步数据)

  • 羊肚菌的功效(图文)(羊肚菌的功效和价格)

    羊肚菌的功效(图文)(羊肚菌的功效和价格)

  • 【第十七届智能车】智能车图像处理(3)-元素识别(十字)(第十七届全国大学生智能车)

    【第十七届智能车】智能车图像处理(3)-元素识别(十字)(第十七届全国大学生智能车)

  • ES6中 Promise 概念、基本用法和封装ajax(json数据使用)(es6 promise是什么)

    ES6中 Promise 概念、基本用法和封装ajax(json数据使用)(es6 promise是什么)

  • Python中怎么像PS一样处理图像(python photoshop)

    Python中怎么像PS一样处理图像(python photoshop)

  • 消费税是什么意思大白话
  • 城镇土地使用税的计算公式
  • 企业所得税成本没有发票怎么处理
  • 公司内部人员发言稿
  • 工会经费入账
  • 房地产企业印花税税目
  • 对外支付代扣代缴企业所得税
  • 汽车减税
  • 对于子女继承父母的评价
  • 员工宿舍免征房产税
  • 怎么算应纳税收多少
  • 周转材料计入什么账
  • 施工企业结算金额怎么算
  • 供应商质量问题告知函
  • 新公司第一个月报税怎么弄
  • 个体工商户转为企业要交税吗
  • 什么发票可以用来抵税
  • 增加注册资本需要多少股东通过
  • 腾讯计算机系统扣费15元怎么查
  • 车船税为什么没有优惠
  • 票面税费和实际上税为什么不一样
  • 收到公司投入的土地使用权
  • 基础设施建设包括哪些方面
  • 有哪些不同类型的金融机构
  • 资源综合利用企业税收优惠
  • 补发上月工资如何计税
  • vue获取当前页面请求头信息
  • 收到上级工会下拨的工会经费
  • 解决思路怎么写
  • win11系统怎么设置密码锁屏
  • 变更营业执照中心怎么改
  • 企业记账的主要内容包括
  • 普通发票丢了如何入账
  • 微信小程序分成比例
  • 房产税是什么意思,简单的回答
  • 预算会计组成体系不包括
  • 建筑行业预交增值税税率是多少
  • python中if语句的用法
  • 缴纳文化事业建设费
  • 什么叫做印花??
  • 固定资产原值增加当月计提折旧吗
  • 免税所得包括哪些
  • 公司缴纳的残保金是什么
  • 自制小汽车
  • 流动资产周转率和总资产周转率
  • 房地产开发企业与转让房地产有关的税金
  • 记账凭证背面贴原始凭证图片
  • 公司法人借款给公司用责任承担
  • 给个体工商户付款可以打到法人卡上吗
  • 工程发票可以作废吗
  • 失控发票进项税转出企业无法承担所得税怎么办
  • 登记银行存款日记账的实训心得
  • 明细账的设置与登记
  • sqlserver 储存过程
  • wind如何安装
  • sql查询结果数量
  • Mysql5.7.11在windows10上的安装与配置(解压版)
  • sqlserver isnull在数据库查询中的应用
  • navicate创建存储过程
  • win1010卸载
  • 记录一次博客迁移到Docker上的操作
  • windows7 excel
  • windows8语言栏不见了
  • windows7文件丢失
  • win8的开始和运行在哪儿
  • javascript数据结构
  • node创建服务
  • vue做一个table
  • jquery的方法get做什么
  • 运算符优先级由高到低的顺序
  • jquery中的eq是什么
  • javascript高级程序设计电子书
  • express框架的优缺点
  • 菜鸟教程安卓
  • unity3d入门视频教程
  • javascript模拟器
  • 国家税务局大厅上班时间
  • 税务部门协作
  • 晋江电视
  • 工程审计费计入什么科目
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设