iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue3.0实现无限级菜单
  • 830
分享到

Vue3.0实现无限级菜单

2024-04-02 19:04:59 830人浏览 独家记忆
摘要

业务需求 菜单项是业务系统的重要组成部分,一般业务系统都要支持显示多级业务菜单,但是根据每个业务人员的权责不同,看到的的菜单项也是不同的。 这就要求页面可以支持无限极菜单显示,根据每

业务需求

菜单项是业务系统的重要组成部分,一般业务系统都要支持显示多级业务菜单,但是根据每个业务人员的权责不同,看到的的菜单项也是不同的。

这就要求页面可以支持无限极菜单显示,根据每个用户的权限不同,后台服务返回对应的菜单项。

本文基于Vue 3.0实现了一个可配置的无限等级菜单,关键代码如下:

后端返回的菜单项数据结构

后端服务一般不会直接返回一个树型结构菜单集合前端,这样做也不合理。前端应该根据自己的具体需求,构建自己的菜型单树。后端返回的数据结构一般包含以下一个字段:

  • Id 菜单ID, 数字类型
  • pId当前菜单的父级菜单ID, 数字类型
  • title 菜单的标题
  • link 菜单对应的链接
  • order 同级菜单的排列顺序,数字类型

其他业务字段需要具体问题具体分析,在这里不再赘述。本文不再讨论后端如何进行菜单项的权限控制,所使用的菜单内容,包括在一个JSON文件中,具体见附录。

菜单内容是一个足球数据管理系统,包括多级菜单:

  • 第一级菜单只有一项,是所有节点的祖先节点。
  • 第二级菜单包括联赛管理,俱乐部管理和球员管理
  • 第三级菜单包括二级菜单内容的CRUD。

关键代码

为了支持无限级菜单,本文所有关键算法全部基于递归实现。主要包括:

1.后端数据转换为树形结构
2.后端数据排序
3.基于菜单树形结构生成Vue的路由数据
4.菜单组件的递归调用

后端数据转为树形结构

dataToTree函数调用的实参是附录的jsON数据,该代码参考Vue 3.0的AST树转换的代码,具体思想是:

1.将集合的数据分为父节点和子节集合,最外层的父节点为pId为0的节点。
2.在子节点中找到当前父节点的直接子节点,将其从当前子节点集合剔除。
3.递归回到1,寻找子节点的子节点。
4.如果当前子节点不是任何节点的父节点,将该子节点放入父节点的children集合中。

在生成当前树型结构菜单数据后,可以将该数据保存在vuex中,作为公共数据便于其他模块使用。

function dataToTree(data) {
  const parents = data.filter((item) => item.pId === 0);
  const children = data.filter((item) => item.pId !== 0);
  toTree(parents, children);
  return parents;
  function toTree(parents, children) {
    for (var i = 0; i < parents.length; ++i) {
      for (var j = 0; j < children.length; ++j) {
        if (children[j].pId === parents[i].Id) {
          let _children = deepClone(children, []);
          toTree([children[j]], _children);
          if (parents[i].children) {
            parents[i].children.push(children[j]);
          } else {
            parents[i].children = [children[j]];
          }
        }
      }
    }
  }
}

function deepClone(source, target) {
  var _tar = target || {};
  let keys = Reflect.ownKeys(source);
  keys.map((key) => {
    if (typeof source[key] === "object") {
      _tar[key] =
        Object.prototype.toString.call(source[key]) === "[object Array]"
          ? []
          : {};
      deepClone(source[key], _tar[key]);
    } else {
      _tar[key] = source[key];
    }
  });
  return _tar;
}

菜单项排序

根据同级节点的order值进行排序,本文没有将该排序和上节的树型结构转换放在一起,主要是考虑有些系统可能不需要排序。如果需要,每次添加元素都要进行一次排序,效率低下,所以在获取树型结构后,再进行一次排序,具体排序函数如下:

function SortTree(tree) {
  tree = tree.sort((a, b) => a.order - b.order);
  tree.map((t) => {
    if (t.children) {
      t.children = SortTree(t.children);
    }
  });

  return tree;

采用最简单的递归方式,遍历当前树型集合,按照order字段的升序方式进行排序,如果当前节点有children项,递归排序。

基于菜单树形结构生成Vue的路由数据

在获取树型菜单后后,我们可以基于当前数据,生成该用户在App中要使用到的路由项,具体代码如下:

function TreeToRoutes(treeData, routes) {
  routes = routes || [];
  for (var i = 0; i < treeData.length; ++i) {
    routes[i] = {
      path: treeData[i].link,
      name: treeData[i].name,
      component: () => import(`@/views/${treeData[i].name}`),
    };
    if (treeData[i].children) {
      routes[i].children = TreeToRoutes(
        treeData[i].children,
        routes[i].children
      );
    }
  }
  return routes;
}

1.遍历树型菜单,将当前菜单项的link和tname复制到Vue路由数据的path和name上,component采用动态加载方式。
2.如果当前菜单项包含子节点children,递归调用,复制其子节点内容。

在main.js方法中,将菜单数据通过vuex进行读取,然后调用上述算法生成路由数据。将该数据直接加载到Vue的路由中,保证了如果当前用户没有某一个菜单的权限,即使通过URL进行访问,也是访问不到的,因为App只会为有权限的菜单项生成路由数据。如果用户没有某一个菜单的权限,也就不会从后端获取到该菜单的数据,也就不会为该菜单项生成路由。

菜单组件的递归调用

菜单组件代码如下:

<template>
  <div>
      <ul v-if="data.children && data.children.length > 0">
          <li><router-link :to="data.link">{{data.title}}</router-link></li> 
          <menu-item :data="item" :key="index"  v-for="(item,index) in data.children">
      </ul>
      <ul v-else>
          <li><router-link :to="data.link">{{data.title}}</router-link></li> 
      </ul>
  </div>
</template>

<script>
export default {
    name: "MenuItem",
    props:{
        data: Object
    }
}
</script>

如果当前菜单项包含子节点,则递归调用MenuItem组件自己

菜单组件调用的代码如下:

<template>
  <div>
     <menu-item :data="item" :key="index" v-for="(item,index) in data" />
  </div>
</template>

<script>
import MenuItem from './MenuItem'
export default {
    name: "Page",
    components:{
        MenuItem
    }
}
</script>

由于生成的菜单数据结构最外层是数据,所以MenuItem组件需要进行循环调用。

附录-菜单项数据

export default [
  {
    Id: 15,
    pId: 0,
    name: "all",
    title: "all",
    link: "/all",
    order: 2,
  },
  {
    Id: 1,
    pId: 15,
    name: "clubs",
    title: "Club Management",
    link: "/clubs",
    order: 2,
  },
  {
    Id: 2,
    pId: 15,
    name: "leagues",
    title: "League Management",
    link: "/leagues",
    order: 1,
  },
  {
    Id: 3,
    pId: 15,
    name: "players",
    title: "Player Management",
    link: "/players",
    order: 3,
  },
  {
    Id: 5,
    pId: 2,
    name: "LeagueDelete",
    title: "Delete League",
    link: "/leagues/delete",
    order: 3,
  },
  {
    Id: 6,
    pId: 2,
    name: "LeagueUpdate",
    title: "Update League",
    link: "/leagues/update",
    order: 2,
  },
  {
    Id: 7,
    pId: 2,
    name: "LeagueAdd",
    title: "Add League",
    link: "/leagues/add",
    order: 1,
  },
  {
    Id: 8,
    pId: 3,
    name: "PlayerAdd",
    title: "Add Player",
    link: "/players",
    order: 1,
  },
  {
    Id: 9,
    pId: 3,
    name: "PlayerUpdate",
    title: "Update Player",
    link: "/players",
    order: 3,
  },
  {
    Id: 10,
    pId: 3,
    name: "PlayerDelete",
    title: "Delete Player",
    link: "/players",
    order: 2,
  },
  {
    Id: 11,
    pId: 1,
    name: "ClubAdd",
    title: "Add Club",
    link: "/clubs/add",
    order: 3,
  },
  {
    Id: 12,
    pId: 1,
    name: "ClubUpdate",
    title: "Update Club",
    link: "/clubs/update",
    order: 1,
  },
  {
    Id: 13,
    pId: 1,
    name: "ClubDelete",
    title: "Delete Club",
    link: "/clubs/delete",
    order: 2,
  },
];

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Vue3.0实现无限级菜单

本文链接: https://www.lsjlt.com/news/164316.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue3.0实现无限级菜单
    业务需求 菜单项是业务系统的重要组成部分,一般业务系统都要支持显示多级业务菜单,但是根据每个业务人员的权责不同,看到的的菜单项也是不同的。 这就要求页面可以支持无限极菜单显示,根据每...
    99+
    2022-11-13
  • Angluar+zorro实现无限级菜单
    关于Angular + zorro 实现无限级菜单,供大家参考,具体内容如下 该文章为思路+代码,为通用式前端无限级菜单。 首先通过后台接收到的数据是这样的 "table":[   ...
    99+
    2022-11-13
  • Ajax怎么实现无限级菜单
    本篇内容主要讲解“Ajax怎么实现无限级菜单”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Ajax怎么实现无限级菜单”吧!支持Form的无闪提交(方法有点笨)支...
    99+
    2022-10-19
  • Vue2组件tree如何实现无限级树形菜单
    小编给大家分享一下Vue2组件tree如何实现无限级树形菜单,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!How to run ...
    99+
    2022-10-19
  • vue+el-menu实现菜单栏无限多层级分类
    本文实例为大家分享了vue+el-menu实现菜单栏无限多层级分类的具体代码,供大家参考,具体内容如下 思路:数据格式须为数组内部多层嵌套模式,利用递归渲染菜单栏数据实现菜单多层级分...
    99+
    2022-11-13
  • vue3.0实现下拉菜单的封装
    vue3.0出来已经有段时间的了,也与必要开始研究它了! 先看下我们要实现的效果 很常见的展开显示菜单项的内容,在vue3.0里面怎么开发,这里样式我们用的是bootstrap的默...
    99+
    2022-11-12
  • vue+el-menu如何实现菜单栏无限多层级分类
    这篇文章主要介绍了vue+el-menu如何实现菜单栏无限多层级分类,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下思路:数据格式须为数组内部多层嵌套模式,利用递归...
    99+
    2023-06-29
  • Vue3Element-plusel-menu无限级菜单组件封装过程
    目录 一、定义数据二、封装组件 三、使用组件对于element中提供给我们的el-menu组件最多可以实现三层嵌套,如果多一层数据只能自己通过变量去加一层,如果加...
    99+
    2023-05-17
    Vue3 Element-plus el-menu无限级 Vue3 Element-plus 无限级菜单 el-menu无限级菜单组件
  • jQuery如何实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
    这篇文章主要介绍jQuery如何实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、手风琴菜单效果图及代码如下:<!DOCTYPE...
    99+
    2022-10-19
  • 详解织梦dedecms5.7 无限级多级栏目菜单调用方法
    以前在用到5.7无限级栏目列表菜单时下载了网上的资料都未成功,因此我参考网上及dedecms本身的channel.lib.php及cattree.lib.php制作了调用标签。 1、在include\taglib建立ra...
    99+
    2022-06-12
    dedecms5.7 无限级 多级栏目 菜单调用
  • React四级菜单的实现
    效果图 JS import { Fragment, useState } from 'react'; import styles from './style.less'; cons...
    99+
    2022-11-13
  • Python下三级菜单实现
    今天学了一个三级菜单,甚是开心!!! 1.流程图 2.代码如下: #!/usr/bin/env python #name bearcatfly university_list = { # 大学列表 "安...
    99+
    2023-01-31
    菜单 Python
  • Vue3 Element-plus和el-menu无限级菜单组件怎么封装
    对于element中提供给我们的el-menu组件最多可以实现三层嵌套,如果多一层数据只能自己通过变量去加一层,如果加了两层、三层这种往往是行不通的,所以只能进行封装效果图 一、定义数据MenuData.tsexport default [...
    99+
    2023-05-14
    Vue3 Element-plus el-menu
  • Vue3 Element-plus和el-menu无限级菜单组件如何封装
    本文小编为大家详细介绍“Vue3 Element-plus和el-menu无限级菜单组件如何封装”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue3 Element-plus和el-menu无限级菜单组件如何封装”文...
    99+
    2023-07-06
  • python 字典实现三级菜单
    简介:1.用字典建立一个省市县的三级菜单    2.开始显示所有的省份,输入要进入的省份之后,显示该省份下的所有市,输入市显示该市下的所有县    3.在每一级菜单下都可以返回到上一层菜单    4.随时可以退出 1 menu =...
    99+
    2023-01-30
    字典 菜单 python
  • react如何实现三级菜单
    这篇文章主要讲解了“react如何实现三级菜单”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react如何实现三级菜单”吧!react实现三级菜单的方法:1、创建展开三级父级菜单的方法为“o...
    99+
    2023-07-05
  • Android实现横向二级菜单
    本文实例为大家分享了Android二级横向菜单的实现过程.效果如上图:     这种横向的二级菜单在很多的app都有所应用.效果看起来还是非常的美观的.也算...
    99+
    2022-06-06
    菜单 Android
  • 如何实现jQuery级联菜单
    这篇文章主要为大家展示了“如何实现jQuery级联菜单”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现jQuery级联菜单”这篇文章吧。具体内容如下层叠样...
    99+
    2022-10-19
  • CSS如何实现多级菜单
    这篇文章主要为大家展示了“CSS如何实现多级菜单”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“CSS如何实现多级菜单”这篇文章吧。   这是一个相当炫的功能,...
    99+
    2022-10-19
  • vue递归实现三级菜单
    本文实例为大家分享了vue递归实现三级菜单的具体代码,供大家参考,具体内容如下 父组件 <template> <div class="menu-leve...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作