vue2动态路由实现

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

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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

想设计完美Banner?这7个步骤教你快速上手!

一个合格的网页横幅设计体现在吸引用户点击&#xff0c;促进用户的购物欲望上。网页横幅设计可能是一个漫长而复杂的过程&#xff0c;涉及到每个职位。团队工作时&#xff0c;横幅设计的沟通过程越长&#xff0c;越容易忘记某些步骤&#xff0c;或者因为时间限制而忽略某些部分…

visio添加表格

插入Excel表格&#xff1a; 打开Microsoft Visio&#xff0c;新建一个空白画布。点击菜单栏中的“插入”。在插入中点击“图表”。在弹出的插入对象设置页面中选择“Microsoft Excel工作表”。点击确定按钮&#xff0c;然后在表格中输入内容。将鼠标点击到画布的空白处&#x…

翻译《The Old New Thing》- The case of the exception that a catch (…) didn’t catch

The case of the exception that a catch (...) didnt catch - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20240405-00/?p109621 Raymond Chen 2024年04月05日 一位客户认为他们修复了一个bug&#xff0c;但他们仍然因为这个bug而崩溃。…

基于SpringBoot3+Vue3宠物小程序宠物医院小程序的设计与实现

大家好&#xff0c;我是程序员小孟。 最近开发了一个宠物的小程序&#xff0c;含有详细的文档、源码、项目非常的不错&#xff01; 一&#xff0c;系统的技术栈 二&#xff0c;项目的部署教程 前端部署包&#xff1a;npm i 启动程序&#xff1a;npm run dev 注意事项&…

C++ 25 之 调用函数调用规则

c25调用函数调用规则.cpp #include<iostream> using namespace std;class Students04{ // 1.创建好类之后&#xff0c;编译器会默认提供三个函数&#xff1a;默认构造函数、构造函数、拷贝构造函数 // 2.自己写了有参构造函数&#xff0c;编译器就不会提供默认构造函数&…

JAVA云HIS医院管理系统源码 云HIS运维平台源码 SaaS模式支撑电子病历4级,HIS与电子病历系统均拥有自主知识产权

JAVA云HIS医院管理系统源码 云HIS运维平台源码 SaaS模式支撑电子病历4级&#xff0c;HIS与电子病历系统均拥有自主知识产权 系统简介&#xff1a; SaaS模式Java版云HIS系统&#xff0c;在公立二甲医院应用三年&#xff0c;经过多年持续优化和打磨&#xff0c;系统运行稳定、功…

EasyGBS下载、安装、登录WEB

下载 解压后有一个UserManual.pdf&#xff0c;可以参考。 安装 运行EasyGBS.exe 需要重启机器 打开WEB http://localhost:10000 登录WEB easygbs/easygbs

歌曲怎么转换格式?这几个方法帮你轻松搞定

把歌曲转换为mp3格式?mp3是一种数据压缩格式&#xff0c;因其具有文件尺寸小、音质好两大绝对优势&#xff0c;直到现在作为主流音频格式的地位仍难以被撼动&#xff0c;很多时候大家都需要将其他格式的音频文件转换为MP3进行使用&#xff0c;那么怎样把歌曲转换为mp3格式呢&a…

数据挖掘丨轻松应用RapidMiner机器学习内置数据分析案例模板详解(下篇)

RapidMiner 案例模板 RapidMiner 机器学习平台提供了一个可视化的操作界面&#xff0c;允许用户通过拖放的方式构建数据分析流程。RapidMiner目前内置了 13 种案例模板&#xff0c;这些模板是预定义的数据分析流程&#xff0c;可以帮助用户快速启动和执行常见的数据分析任务。 …

搜索是门艺术,大神都是这样找资源

以下所有资源均可在星云导航找到&#xff0c;网站地址&#xff1a;https://www.xygalaxy.com/ 浏览器搜索高级用法 1、排除干扰&#xff0c;指定关键词 1.1、排除指定关键字 格式&#xff1a;关键字1 -关键字2比如搜索&#xff1a;星云导航&#xff0c;不想要CSDN的内容 星…

长沙干洗服务,打造您的专属衣橱

长沙干洗服务&#xff0c;用心呵护您的每一件衣物&#xff01;致力于为您打造专属的衣橱&#xff0c;让您的每一件衣物都焕发出独特的魅力。 我们深知每一件衣物都承载着您的故事和情感&#xff0c;因此我们会以更加细心的态度对待每一件衣物。无论是您心爱的牛仔裤&#xff0c…

【最新鸿蒙应用开发】——总结ArkUI生命周期

鸿蒙ArkUI相关的生命周期都有哪些? 1. UIAbility生命周期 onCreate、onWindowStageCreate、onForeground、onBackground、onWindowStageDestroy、onDestroy。 onCreate&#xff1a;Create状态为在应用加载过程中&#xff0c;UIAbility实例创建完成时触发&#xff0c;系统会调…

C++ 19 之 封装

c19封装.cpp #include <iostream> #include <string.h> using namespace std;// 封装&#xff1a;将行为和属性作为一个整体来表现生活中的事物// 人&#xff1a; 行为&#xff1a; 吃饭 属性&#xff1a; 姓名、年龄 struct person {char name[20];int age;…

LeetCode435无重叠区间

题目描述 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 解析 由于要删除尽可能少的区间 &#xff0c;因此区间跨度大的一定是要先删除的&#xff0c;这样就有两种贪心思想了…

4090显卡 安装cuda 11.3 版本

文章目录 cuda 安装安装过程中会要求选择安装的内容更改cuda地址到你安装的地方 cuda 安装 cuda官网寻找cuda11.3 版本 https://developer.nvidia.com/cuda-11.3.0-download-archive?target_osLinux&target_archx86_64&DistributionUbuntu&target_version20.04&…

使用代理IP常见问题及解答

代理IP在互联网数据收集和业务开展中发挥着重要作用&#xff0c;它充当用户客户端和网站服务器之间的“屏障”&#xff0c;可以保护用户的真实IP地址&#xff0c;并允许用户通过不同的IP地址进行操作。然而&#xff0c;在使用代理IP的过程中&#xff0c;用户经常会遇到一些问题…

Spring 内置BeanPostProcessor 的子子孙孙

Spring 框架已经实现了很多BeanPostProcessor的类&#xff0c;如下是关于BeanPostProcessor 的类图&#xff0c;图片过大&#xff0c;可以下载资源包看。 要能说清楚这些类&#xff0c;挺难&#xff0c;我也不知道怎么写&#xff0c;这几个类都分布在不同的包中&#xff0c;我感…

3389端口修改工具,修改3389端口的操作

3389端口作为远程桌面协议&#xff08;RDP&#xff09;的默认端口&#xff0c;常常成为黑客攻击的目标。为了提高系统的安全性&#xff0c;修改3389端口成为一项重要的安全措施。本文将详细介绍如何使用3389端口修改工具进行专业操作&#xff0c;以确保系统的安全稳定。 一、备…

python 只有ListNode类的情况下,创建链表和遍历链表

class ListNode:def __init__(self, val0, nextNone):self.val valself.next nextif __name__ __main__: linklist dummy ListNode() for x in ([2,4,3]): linklist .next ListNode(x) linklist linklist .nextwhile dummy:print(dummy.val)dummy dummy.next 这里的…

ISO17025认证是什么?怎么做?

ISO17025认证是一种国际通用的实验室质量管理体系认证&#xff0c;其目标是确保实验室的技术能力、管理水平以及测试结果的可靠性和准确性达到国际认可的标准。该认证由国际标准化组织&#xff08;ISO&#xff09;和国际电工委员会&#xff08;IEC&#xff09;联合发布&#xf…