vue2动态路由实现

news2024/11/25 7:14:14

实现一个简单的动态路由:

1、先定义菜单页面组件的结构,使用的是elementUI的NavMenu 导航菜单

<template>
  <div>
       <el-menu default-active="1" router>
            <el-submenu :index="item.path" v-for="item in menu_data" router>
              <template slot="title">
                <i :class="item.meta.icon"></i>
                {{ item.meta.title }}
              </template>
              <el-menu-item :index="childItem.path" v-for="childItem in item.children" :key="childItem.name">
                {{ childItem.meta.title }}
              </el-menu-item>
            </el-submenu>
        </el-menu>
  </div>
</template>

<script>
export default {
    data () {
        return {
            menu_data: [
        {
          name: '定时任务管理',
          icon: 'location',
          path: '/home/robotManage',
          child: [
            {
              name: '机器人管理',
              path: '/home/robotManage',
            },
            {
              name: '定时任务管理',
              path: '/home/timerTask',
            },
          ],
        },
        {
          name: '资源管理',
          icon: 'github',
          path: '/home/robotPerson',
          child: [
            {
              name: '个人资源',
              path: '/home/robotPerson',
            },
            {
              name: '部门资源',
              path: '/home/robotPart',
            },
            {
              name: '公开资源',
              path: '/home/robotOpen',
            },
          ],
        },
        {
          name: '考勤组管理',
          icon: 'laptop',
          path: 'home/department',
          child: [
            {
              name: '部门考勤管理',
              path: '/home/department',
            },
            {
              name: '考勤组管理',
              path: '/home/group',
            },
          ],
        },
      ],
    }
}
</script>
效果:

2、路由部分的代码,定义需要的路由,router中index.js。

import Vue from 'vue'
import VueRouter from 'vue-router'
// 引入路由组件
import robotManage from '@/views/robotManage'
import timerTask from '@/views/timerTask'
import getmsg from '@/views/getmsg'
import login from '@/components/login.vue'
import home from '@/views/home.vue'
import robotPerson from '@/views/robotPerson.vue'
import robotPart from '@/views/robotPart.vue'
import robotOpen from '@/views/robotOpen'
import group from '@/views/group'
import department from '@/views/department'

// 配置路由
export  default new VueRouter({
  // 路由
  routes: [
    // 登录
    {
      path: '/',
      name: 'login',
      component: login,
    },
    // home
    {
      path: '/home',
      name: 'home',
      component: home,
      children: [
        // 机器人管理
        {
          path: '/home/robotManage',
          name: 'robotManage',
          component: robotManage,
        },
        // 时间管理
        {
          path: '/home/timerTask',
          name: 'timerTask',
          component: timerTask
        },
        // 收集简书地址链接
        {
          path: '/home/getmsg',
          name: 'getmsg',
          component: getmsg
        },
        // 机器人个人问答页面
        {
          path: '/home/robotPerson',
          name: 'robotPerson',
          component: robotPerson
        },
        // 机器人部门问答页面
        {
          path: '/home/robotPart',
          name: 'robotPart',
          component: robotPart
        },
        // 机器人公开问答页面
        {
          path: '/home/robotOpen',
          name: 'robotOpen',
          component: robotOpen
        },
        {
          path: '/home/group',  // 路由参数
          component: group, // 对应的页面组件

        },
        {
          path: '/home/department',
          component: department
        },

      ]
    },
  ],
})

3、定义store,在state中增加属性menu_data

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

export default new Vuex.Store({
    state: {
        menu_data: []
    },
    mutations: {
        setMenuData (state, data) {
            state.menu_data = data
        }
    }
})

4、在router路由中使用前置路由守卫beforeEach获取数据,并且提交到store。

在前置路由守卫中,用用户动态路由接口,拿到后台传递过来的该用户的菜单权限数据,把原来定义的menu_data数据换成该用户的菜单权限数据。

这一步是在router中发起用户动态路由请求,并且把获取到的用户的菜单权限数据提交到store

// 前置路由守卫:to是要进入的目标路由对象,from是当前导航正在离开的路由,next函数用于放行或跳转路由
router.beforeEach((to, from, next) => {
  // 首先放行路由
  next()
  // 然后发起请求
  reqGetRouter().then((res) => {
    // 用于触发一个 mutation从而实现state状态更新,
    // 第一个参数是mutations中定义的方法名,第二个为需要传递的数据
    store.commit('setMenuData', res.data)
    console.log(store.state.menu_data, '前置路由守卫调用接口后获取的状态')
  }).catch((error) => {
    console.error('请求路由数据失败:', error)
  })
})

5、data里面的属性menu_data不能直接返回了,需通过computed来返回,并且返回的值是从store里面获取的

computed:{
   menu_data:{
       get(){
           return this.$store.state.menu_data
       }
    }
}

6、完整代码

<template>
          <el-menu default-active="1" router>
            <el-submenu :index="item.path" v-for="item in menu_data" router>
              <template slot="title">
                <i :class="item.meta.icon"></i>
                {{ item.meta.title }}
              </template>
              <el-menu-item :index="childItem.path" v-for="childItem in item.children" :key="childItem.name">
                {{ childItem.meta.title }}
              </el-menu-item>
            </el-submenu>
          </el-menu>
</template>

<script>
export default {
  computed: {
    menu_data: {
      get () {
        return this.$store.state.menu_data
      }
    }
  }
}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1817224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android14音频进阶之CarAudioManager::getOutputDeviceForUsage流程分析(七十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

C数据结构:排序

目录 冒泡排序 选择排序 堆排序 插入排序 希尔排序 快速排序 hoare版本 挖坑法 前后指针法 快速排序优化 三数取中法 小区间优化 快速排序非递归 栈版本 队列版本 归并排序 归并排序非递归 ​编辑 计数排序 各排序时间、空间、稳定汇总 冒泡排序 void Bub…

嵌入式linux系统中设备树的经典使用方法

第一:设备树简介 大家好,今天主要给大家分享一下,如何使用linux系统里面的设备树,详细分析如下。 可以参考的官方文档有: 官方文档(可以下载到 devicetree-specification-v0.2.pdf): https://www.devicetree.org/specifications/ 内核文档: …

MNIST手写字符分类

MNIST手写字符分类 文章目录 MNIST手写字符分类1 数据集2 模型构建3 训练4 模型保存5 推理6 模型导出7 导出模型测试 1 数据集 MNIST手写字符集包括60000张用于训练的训练集图片和10000张用于测试的测试集图片&#xff0c;所有图片均归一化为28*28的灰度图像。其中字符区域为白…

LabVIEW水箱液位控制系统

介绍了如何使用LabVIEW软件和硬件工具开发水箱液位控制系统。系统集成了数据采集、实时控制和模拟仿真技术&#xff0c;展示了高精度和高可靠性的特点&#xff0c;适用于需要精细水位调节的工业应用。 项目背景 在制造和化工行业&#xff0c;液位控制是保证生产安全与效率的关…

第3章 Unity 3D着色器系统

3.1 从一个外观着色器程序谈起 新建名为basic_diffuse.shader的文件&#xff0c;被一个名为basic_diffuse.mat的材质文件所引用&#xff0c;而basic_diffuse.mat文件则被场景中名为Sphere的game object的MeshRenderer组件所使用。 basic_diffuse.shader代码文件的内容如下所示…

51.Python-web框架-Django开始第一个应用的增删改查

目录 1.概述 2.创建应用 创建app01 在settings.py里引用app01 3.定义模型 在app01\models.py里创建模型 数据库迁移 4.创建视图 引用头 部门列表视图 部门添加视图 部门编辑视图 部门删除视图 5.创建Template 在app01下创建目录templates 部门列表模板depart.ht…

java+vue3+el-tree实现树形结构操作

基于springboot vue3 elementPlus实现树形结构数据的添加、删除和页面展示 效果如下 代码如下&#xff0c;业务部分可以自行修改 java后台代码 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.daztk.mes.common.annotation.LogOperation…

高通Android 12 右边导航栏改成底部显示

最近同事说需要修改右边导航栏到底部&#xff0c;问怎么搞&#xff1f;然后看下源码尝试下。 1、Android 12修改代码路径 frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java a/frameworks/base/services/core/java/com/android/server/wm/Display…

树莓派4B_OpenCv学习笔记6:OpenCv识别已知颜色_运用掩膜

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; 学了这些OpenCv的理论性知识&#xff0c;不进行实践实在…

Roboflow 图片分类打标

今天准备找个图片标注工具&#xff0c;在网上搜了一下&#xff0c;看 Yolo 的视频中都是用 Roboflow 工具去尝试了一下&#xff0c;标注确实挺好用的&#xff0c;可以先用一些图片训练一个模型&#xff0c;随后用模型进行智能标注。我主要是做标注然后到处到本地进行模型的训练…

springboot的WebFlux 和Servlet

Spring Boot 中的 Servlet 定义&#xff1a; 在 Spring Boot 中&#xff0c;Servlet 应用程序通常基于 Spring MVC&#xff0c;它是一个基于 Servlet API 的 Web 框架。Spring MVC 提供了模型-视图-控制器&#xff08;MVC&#xff09;架构&#xff0c;用于构建 Web 应用程序。…

【Mac】增加 safari 体验的插件笔记

Safari 本身的功能不全面&#xff0c;探索积累了一点插件笔记&#xff0c;提升使用体验&#xff1b;但后面因为插件或会影响运行速度&#xff0c;就全部都禁止了。做个笔记记录一下。 Cascadea 相当于 stylus&#xff0c;可以自定义页面。测试过几个&#xff0c;只有几个可行。…

Java:爬虫htmlunit抓取a标签

如果对htmlunit还不了解的话可以参考Java&#xff1a;爬虫htmlunit-CSDN博客 了解了htmlunit之后&#xff0c;我们再来学习如何在页面中抓取我们想要的数据&#xff0c;我们在学习初期可以找一些结构比较清晰的网站来做测试爬取&#xff0c;首先我们随意找个网站如下&#xff…

【StableDiffusion】Embedding 底层原理,Prompt Embedding,嵌入向量

Embedding 是什么&#xff1f; Embedding 是将自然语言词汇&#xff0c;映射为 固定长度 的词向量 的技术 说到这里&#xff0c;需要介绍一下 One-Hot 编码 是什么。 One-Hot 编码 使用了众多 5000 长度的1维矩阵&#xff0c;每个矩阵代表一个词语。 这有坏处&#xff0c…

美国空军发布类ChatGPT产品—NIPRGPT

6月11日&#xff0c;美国空军研究实验室&#xff08;AFRL&#xff09;官网消息&#xff0c;空军部已经发布了一款生成式AI产品NIPRGPT。 据悉&#xff0c;NIPRGPT是一款类ChatGPT产品&#xff0c;可生成文本、代码、摘要等内容&#xff0c;主要为为飞行员、文职人员和承包商提…

Python 中浅拷贝(copy)和深拷贝(deepcopy)

1. 浅拷贝&#xff1a; 它创建一个新的对象&#xff0c;但对于原始对象内的子对象&#xff08;如列表中的嵌套列表&#xff09;&#xff0c;只是复制了引用。例如&#xff1a; import copy original_list [1, 2, 3] shallow_copied_list copy.copy(original_list) original_…

【PIXEL】2024年 Pixel 解除 4G限制

首先在谷歌商店下载 Shizuku 和 pixel IMS 两个app 然后打开shizuku &#xff0c;按照它的方法启动 推荐用adb 启动&#xff08; 电脑连手机 &#xff0c;使用Qtscrcpy最简洁&#xff09; 一条指令解决 shell sh /storage/emulated/0/Android/data/moe.shizuku.privileged.ap…

Chrome/Edge浏览器视频画中画可拉动进度条插件

目录 前言 一、Separate Window 忽略插件安装&#xff0c;直接使用 注意事项 插件缺点 1 .无置顶功能 2.保留原网页&#xff0c;但会刷新原网页 3.窗口不够美观 二、弹幕画中画播放器 三、失败的尝试 三、Potplayer播放器 总结 前言 平时看一些视频的时候&#xff…

ListView的使用

&#x1f4d6;ListView的使用 ✅1. 创建ListView✅2. 创建适配器Adapter✅3. 开始渲染数据 主要3步骤&#xff1a; 创建ListView 创建适配器Adapter&#xff0c;和Adapter对应的视图 开始渲染数据 效果图&#xff1a; ✅1. 创建ListView 例如现有DemoActivity页面&#xf…