vue+ java 实现多级菜单递归效果

yizhihongxing

实现多级菜单的递归效果,我们可以使用 Vue.js 库来实现前端逻辑,Java 库来实现后端逻辑,也可以使用 Vue.js 的插件 Element UI 来实现前端部分。

下面是一些实现多级菜单递归效果的建议步骤:

步骤一:准备数据

在实现多级菜单递归效果前,需要准备好一组菜单数据。数据的结构大致如下:

[
    {
        "id": 1,
        "name": "菜单1",
        "parentId": 0
    },
    {
        "id": 2,
        "name": "菜单2",
        "parentId": 0
    },
    {
        "id": 3,
        "name": "菜单3",
        "parentId": 1
    },
    {
        "id": 4,
        "name": "菜单4",
        "parentId": 1
    },
    {
        "id": 5,
        "name": "菜单5",
        "parentId": 4
    },
    {
        "id": 6,
        "name": "菜单6",
        "parentId": 2
    }
]

其中 id 为菜单的唯一编号,name 为菜单名称,parentId 则是指向当前菜单的父级菜单的 ID,当 parentId 为 0 时表示为父级菜单。

步骤二:前端页面实现递归

使用 Vue.js 框架的时候,需要向 Vue 组件传递多级菜单数据,逐层递归渲染菜单,实现页面效果。

以 Element UI 为例,需要使用 el-cascader 组件实现多级选择,需要在页面 script 中进行如下设置:

export default {
  data() {
    return {
      data: [], // 显示的多级菜单数据
      options: [], // 多级菜单的配置项
      defaultProps: {
        children: 'children', // 配置项的 children 属性默认为 'children' 
        label: 'name', // 配置项的 label 属性默认为 'name' 
      }
    }
  },
  mounted() {
    // 请求数据
    this.$http.get('/menu').then((res) => {
      // 设置菜单数据
      this.data = res.data;
      // 包装菜单数据,为其添加 children 属性
      const rootChildNodes = this.buildTreeWithChildren(res.data);
      this.options = [{id: 0, name: '根节点', children: rootChildNodes}];
    });
  },
  methods: {
    // 包装菜单数据为带有 children 属性的节点
    buildTreeWithChildren(list) {
      const map = {};
      const roots = [];
      for (const node of list) {
        node.children = []; // 为每个节点添加 children 属性
        map[node.id] = node;
      }
      for (const node of list) {
        const parent = map[node.parentId];
        if (parent) {
          parent.children.push(node);
        } else {
          roots.push(node);
        }
      }
      return roots;
    },
  }
}

以上的代码会向服务器请求多级菜单数据,并且将其作为 data 属性的值进行更新。在页面的模板中,使用如下方法循环遍历每一个子菜单(包括子菜单的子菜单),从而达到递归遍历的效果:

<template>
  <el-cascader
    v-model="selectedItem"
    :options="options"
    :props="defaultProps"
    clearable
    placeholder="请选择分类"
    @change="handleChange">
  </el-cascader>
</template>

这里使用了 Element UI 的 el-cascader 组件实现了多级选择,其中 :options 属性用于设置多级菜单的配置项,:props 则用于设置配置项中的子属性名,:clearable 属性用于设置是否清除已选择的子选项,@change 属性用于监控子菜单选择的变化。

步骤三:后端实现递归

在服务端使用 Java 实现多级菜单的递归功能。可以参考以下示例代码:

@Service
public class MenuService {

    @Autowired
    private MenuMapper menuMapper;

    @Transactional(rollbackFor = Exception.class)
    public List<MenuDO> getMenuList() {
        // 查询所有菜单的列表
        List<MenuDO> menuList = menuMapper.selectMenuList();
        // 构建树形菜单结构
        return buildTree(menuList, 0L);
    }

    /**
      * 构建多级菜单的树形结构
      * @param menuList  菜单列表
      * @param parentId  父级菜单 ID
      * @return          构建完成的树形结构
      */
    private List<MenuDO> buildTree(List<MenuDO> menuList, Long parentId) {
        List<MenuDO> treeList = new ArrayList<>();
        for (MenuDO menu : menuList) {
            if (parentId.equals(menu.getParentId())) {
                List<MenuDO> childList = buildTree(menuList, menu.getId());
                menu.setChildList(childList);
                treeList.add(menu);
            }
        }
        return treeList;
    }
}

在以上代码中,MenuMapper 是数据访问层的接口,MenuDO 则是数据实体类。

getMenuList() 方法中,使用菜单列表递归遍历每一个子菜单,将其转化为树形结构,返回构建成功的多级菜单数据。

步骤四:前后端联调

将前端页面通过路由链接到后端服务,并调用 getMenuList() 方法获取多级菜单的数据。从服务器返回的 JSON 数据中,可以看到父页菜单和各子页菜单的级别关系,这意味着 Vue 组件可以根据这些关系实现递归。给每个组件设置 label 属性,以表示菜单的名称,并设置菜单元素的 key 属性,从而保证可编辑的有效性。

多级菜单的递归实现,已经可以通过上述步骤实现。但要实现具有样式和交互性的多级菜单,则需要更多的工作。对元素的使用彻底掌握后,您可以通过以下一些额外的步骤添加样式:

  • 创作可以缩进的子选项,使菜单树看起来更美观
  • 通过视觉样式将父级选项和子选项区分开来,使用户可以轻松地识别每个节点
  • 创造一个视觉响应,可以显示一个可见的验证标记,指示一个节点是打开还是关闭的
  • 使用类似过渡和动画等视觉效果,使多级菜单看起来更具交互性。

实现多级菜单的递归效果并不难,关键在于数据和递归遍历,这是一项脱离 UI 实现的基础任务,因此,我们先要专注于如何在此阶段构建出具有正确结构和合适属性的多级菜单。管理组织得当,能够将项目分解成相对简单和可管理的部分,以便更容易地弄清楚繁琐的细节。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue+ java 实现多级菜单递归效果 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • python之PyQt按钮右键菜单功能的实现代码

    下面我将为您详细讲解“Python之PyQt按钮右键菜单功能的实现代码”的完整攻略。 一、需求分析 在实现按钮右键菜单功能之前,我们需要先明确需求。在本例中,我们需要实现以下功能:1. 当鼠标右键点击按钮时,弹出菜单;2. 菜单包含多个选项,如“选项1”、“选项2”等;3. 当点击菜单中的任意选项时,弹出相应的消息框; 二、代码实现 1.导入模块 我们首先需…

    other 2023年6月27日
    00
  • Java常用基础代码

    Java是一种广泛使用的编程语言,具有简单、面向对象、跨平台等特点。在Java编程中,常用的基础代码包括变量、数据类型、运算符、流程控制语句、循环语句、数组、字符串等。下面将对这些基础代码进行详细讲解,并提供示例说明。 变量 变量是Java程序中存储数据的基本单元,可以存储不同类型的数据。在Java中,变量的声明需要指定变量的类型和名称。例如: int ag…

    other 2023年5月5日
    00
  • javascript长按事件实现方式

    以下是“JavaScript长按事件实现方式的完整攻略”的标准markdown格式文本,其中包含两个示例: JavaScript长按事件实现方式的完整攻略 在前端开发中,长按事件是一种常的交互方式,常用于实现长按删除、长按复制等功能。以下是一些实现长按事件的方式及示例说明。 1. 使用setTimeout实现长按事件 使用setTimeout函数可以实现长按…

    other 2023年5月10日
    00
  • Java面试之如何获取客户端真实IP

    获取客户端真实IP是Java Web应用中常见的需求,例如统计网站访问量、IP地址的黑白名单限制等等。由于客户端与服务器之间可能经过代理等中间层,因此需要进行一定的处理才能获取到真实IP。 以下是获取客户端真实IP的完整攻略: 步骤1:获取HTTP请求相关对象 需要使用Java Web应用中的HttpServletRequest对象,代码如下: HttpSe…

    other 2023年6月27日
    00
  • [下载]Android M开发者预览版镜像下载 支持4款Nexus

    下载Android M开发者预览版镜像下载 支持4款Nexus设备 Android M开发者预览版目前只支持以下4款Nexus设备: Nexus 5 Nexus 6 Nexus 9 Nexus Player 下载步骤 以下是下载Android M开发者预览版镜像的详细步骤: 在官方下载页面选择您的设备:https://developer.android.co…

    other 2023年6月26日
    00
  • SpringBoot @ConfigurationProperties使用详解

    SpringBoot @ConfigurationProperties使用详解 在Spring Boot中,@ConfigurationProperties注解是一个非常有用的注解,它可以帮助我们将配置文件中的属性值绑定到Java对象上。这样,我们就可以方便地通过Java对象来获取配置文件中的属性值,而不需要手动解析配置文件。 1. 创建配置类 首先,我们需…

    other 2023年7月28日
    00
  • R语言中merge函数详解

    R语言中merge函数详解 在R语言中,merge函数是用于合并两个或多个数据框的函数。它可以根据指定的键将数据框按行连接起来。以下是merge函数的详细使用方法: 语法 merge(x, y, by = NULL, by.x = NULL, by.y = NULL, all = FALSE, …) 参数说明:- x:要合并的第一个数据框。- y:要合并…

    other 2023年10月18日
    00
  • 你可能会用到的16个Linux命令

    下面是对于“你可能会用到的16个Linux命令”完整攻略的详细讲解: 命令介绍 1. ls 用于显示当前文件夹中的文件和目录列表。 示例: ls 2. cd 用于切换工作目录。 示例: cd Documents/ 3. pwd 用于显示当前工作目录的完整路径。 示例: pwd 4. mkdir 用于创建新的目录。 示例: mkdir NewDirectory…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部