首页 > 其他分享 >10.动态路由绑定怎么做

10.动态路由绑定怎么做

时间:2024-08-10 18:25:42浏览次数:14  
标签:10 menu 绑定 component state store validation 路由

为什么要动态路由绑定

因为,如果我们的导航栏没有这个权限,输入对应网址,一样可以获取对应的页面,为了解决这个问题,有两种解决方案,一种是动态路由绑定(导航有多少个,就有多少个路由,在路由修改之前,先进行一个导航路由的加载和路由的动态绑定,然后看是否有这个路由,有就跳转),一种是权限的校验(路由修改之前,进行一个拦截,对用户的权限进行一个校验),这两种方法都可以在路由页面里,使用beforeEach来进行操作,这里是动态路由绑定

思路

将这个用户的能显示显示的导航栏对应的路由,和我们的路由配置进行一个绑定和校验,这样的话,如果说没有这个用户对应的路由,那么就无法跳转到对应的页面

步骤(1-3步是准备步骤)

1.使用mock.js返回对应的菜单栏和用户权限

因为还没写后端,所以使用mock.js来模拟一下

Mock.mock('/sys/menu/nav', 'get', () => {
    let nav = [
        {
            name: 'SysManga',
            title: '系统管理',
            icon: 'el-icon-s-operation',
            component: "",
            path: '',
            children: [
                {
                    name: 'SysUser',
                    title: '用户管理',
                    icon: 'el-icon-s-custom',
                    component: "sys/User",
                    path: '/sys/user',
                    children: []
                }
            ]
        },
        {
            name: 'SysTools',
            title: '系统工具',
            icon: 'el-icon-s-tools',
            path: '',
            component: "",
            children: [
                {
                    name: 'SysDict',
                    title: '数字字典',
                    icon: 'el-icon-s-order',
                    path: '/sys/dicts',
                    component: "sys/Dict",
                    children: []
                },
            ]
        },
    ]
    let authoritys = [];
    Result.data = {
        nav: nav,
        authoritys: authoritys
    }
    return Result;
});

2.在store里面写一个menu.js的页

将我们需要再其他页面使用的变量和方法写入

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default {
    state: {
        menuList: [],
        authoritys: [],
        validation: false,

    },
    getters: {
    },
    mutations: {
        // 菜单列表
        setMenuList(state, menu) {
            state.menuList = menu
        },
        // 权限列表
        setPermList(state, perms) {
            state.authoritys = perms
        },
        setValidation(state, validation) {
            state.validation = validation;
        }

    },
    modules: {
    },
    actions: {
    },
}

3.给对应的页面插入对应的元素

<template>
  <el-menu
      class="el-menu-vertical-demo"
      background-color="#545c64"
      text-color="#fff"
      active-text-color="#ffd04b"
      @select="handleSelect"
  >
    <!-- 首页菜单项 -->
    <el-menu-item index="Index">
      <template #title>
        <i class="el-icon-s-home"></i>
        首页
      </template>
    </el-menu-item>
    <!-- 系统管理子菜单 -->
    <el-submenu :index="menu.name" v-for="menu in menuList" :key="menu.name">
      <template #title>
        <i :class="menu.icon"></i>
        <span>{{ menu.title }}</span>
      </template>
      <!-- 用户管理子菜单 -->
      <el-menu-item
          v-for="item in menu.children"
          :key="item.name"
          :index="item.path"
      >
        <template #title>
          <i :class="item.icon"></i>
          <span>{{ item.title }}</span>
        </template>
      </el-menu-item>
    </el-submenu>
  </el-menu>
</template>

<script>
export default {
  name: "SideMenu",
  data() {
    return {

    }
  },
  computed: {
    menuList: {
      get() {
        return this.$store.state.menu.menuList
      },
    }
  },

  methods: {
    handleSelect(index) {
      this.$router.push(index);
    },

  }
}
</script>

<style scoped>
.el-menu-vertical-demo {
  flex: 1; /* 菜单项占据 el-aside 的剩余空间 */
  overflow-y: auto; /* 如果内容过多,显示滚动条 */
  width: 200px;
}
</style>

4.在路由页面写入beforeEach方法(有注释的)

思路:

1.在路由改变时发一个请求,拿到对应的菜单栏和权限

2.动态绑定路由

2.1 因为这里是子路由,所以先遍历,排除没有子路由的路由
2.2 再遍历子路由,看有没有component(具体的页面),排除没有的
2.3 将有component的对象里的元素封装为一个主路由(我这里主路由名为Home)的子路由
2.4 但是现在有个问题,每次路由修改之后我都要发请求,浪费,所以,在store中的页面里定义一个布尔类型的validation,给个默认值false,当请求完成,修改为true,下次就不会发请求,节约性能
router.beforeEach((to, from, next) => {
    const validation = store.state.menu.validation;
    if (!validation) {
        axios.get("/sys/menu/nav", {
            headers: {
                Authorization: localStorage.getItem("token"),
            }
        }).then(res => {
            // 拿到 menuList
            store.commit("setMenuList", res.data.data.nav);
            // 拿到用户权限
            store.commit("setPermList", res.data.data.permList);

            // 动态绑定路由
            store.state.menu.menuList.forEach(item => {
                if (item.children) {
                    item.children.forEach(e => {
                        if (e.component) {
                            router.addRoute("Home", {
                                path: e.path,
                                name: e.name,
                                component: () => import(`@/views/${e.component}`),
                            });
                        }
                    });
                }
            });

            // 更新 validation 状态
            console.log(123456)
            store.commit('setValidation', true);

            // 确保在异步操作完成后继续导航
            next({path: to.fullPath});
        }).catch(error => {
            console.error('Error fetching menu:', error);
            // 处理请求失败的情况,例如重定向到登录页面
            next('/login');
        });
    } else {
        // 如果已经验证过,直接继续导航
        next();
    }
});

标签:10,menu,绑定,component,state,store,validation,路由
From: https://blog.csdn.net/qq_55121347/article/details/141059128

相关文章

  • 010.Vue3入门,数组变化侦听,实时在界面显示变化后的数据
    1、代码如下:<template><h3>数组变化侦听</h3><button@click="addListHandle">添加数据</button><ul><liv-for="(item,index)ofnames":key="index">{{item}}</li></ul>&l......
  • 8.10日周记
    一.C语言学习1.7-38数列求和-加强版给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1,N=3时,S=1+11+111=123。输入格式:输入数字A与非负整数N。输出格式:输出其N项数列之和S的值。输入样例:13输出样例:123答案:include<stdio.h>......
  • 吴恩达深度学习deeplearning.ai学习笔记(二)2.6 2.7 2.8 2.9 2.10
    2.6动量梯度下降法这种算法运行速度总是快于标准的梯度下降算法,基本思想是计算梯度的指数加权平均数并利用该梯度来更新你的权重;假设你要优化一个下图的成本函数,红点是最小值,假设从一点开始进行梯度下降法,如果进行梯度下降法的第一次迭代,无论是batch还是mini-batch,可能都会......
  • vue3中piniaPluginPersistedstate解决动态路由刷新空白问题
    总结:使用了回调函数来防止持久化数据前就渲染页面,导致刷新空白1.Store里的代码(**这里主要就是在addNewRoute写了回调callback**)addNewRoute(menuList,()=>{//重新渲染router.push({path:'/home/individual'})});import{defineStore}from"pinia";import......
  • VS2010旗舰版VB.NET版本音频剪辑代码2024-8-10
    ImportsSystem.ComponentModelImportsSystem.IOImportsSystem.DiagnosticsImportsSystem.DrawingImportsSystem.Windows.FormsPublicClassForm1PrivateWithEventsbgWorkerAsNewBackgroundWorkerPrivateffmpegPathAsString=“C:\ffmpeg-master-lates......
  • 10分钟学会Docker的安装和使用
    前言在现代软件开发中,Docker作为一种轻量级的容器化技术,已成为开发者必备的工具之一。本文将带您在10分钟内快速掌握Docker的安装和基本使用方法。1.Docker是什么?Docker是一种开源的容器化平台,它通过将应用程序及其所有依赖项打包到一个标准化的单元中,使应用程序能够在......
  • P1091 [NOIP2004 提高组] 合唱队形
    这道题主要考察的是线性dp,最基础的dp,这道题的主要思路1.求出最大子序列,2.求出最小子序列,3.找出最少要多少个人要出列。其实我们主要2可以变成逆序查找最大子序列,所以我们只需要把前两个找出来之后我们就可以求出主要3(注意一定要减1,因为中间的那个同学一定会被多算一次所以必......
  • 004.Vue3入门,使用绑定属性时undefined和disabled用法
    1、代码如下:<template><divv-bind:id="myId1"v-bind:class="testCls">测试1</div><divv-bind:id="myId2"v-bind:title="testTitle">测试2</div><div:id="myId3":class="te......
  • Github 2024-08-10开源项目日报 Top10
    根据GithubTrendings的统计,今日(2024-08-10统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下:开发语言项目数量Python项目4JavaScript项目2TypeScript项目2C#项目1Dockerfile项目1RichTextFormat项目1Swift项目1Jupyt......
  • 0810day03
    1.简述python垃圾回收机制就是对于之前占用的内存空间,比如一开始x的值为10,后面改为了11,那之前定义占用的空间(被视为垃圾)就会被自动删除,这也是与其他语言不一样的点,其他的语言可能还需要自己去删,python会自动删去不需要的内存占用2.对于下述代码:x=10y=10z=10dely10......