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

实现多级菜单的递归效果,我们可以使用 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日

相关文章

  • Android解决ScrollView下嵌套ListView和GridView中内容显示不全的问题

    Android解决ScrollView下嵌套ListView和GridView中内容显示不全的问题攻略 在Android开发中,当我们将ListView或GridView嵌套在ScrollView中时,可能会遇到内容显示不全的问题。这是因为ScrollView会将其内部的ListView或GridView的高度设置为wrap_content,导致无法正确计算…

    other 2023年7月28日
    00
  • 公众号自定义菜单设置 公众号子菜单下怎么设置文章目录

    下面是“公众号自定义菜单设置 公众号子菜单下怎么设置文章目录”的完整攻略。 1. 什么是公众号自定义菜单? 公众号自定义菜单是指公众号主可以根据自己的需求,将常用的功能按钮制作成菜单,让用户更方便地使用公众号的服务和功能。 2. 如何设置公众号自定义菜单? 第一步:登录微信公众平台,进入“自定义菜单”页面。 第二步:点击“创建菜单”,然后根据需要设置菜单名称…

    other 2023年6月25日
    00
  • babel插件去除console示例详解

    Babel插件去除console示例详解攻略 在JavaScript开发中,我们经常使用console对象来进行调试和输出信息。然而,在生产环境中保留这些console语句可能会导致性能下降或者泄露敏感信息。为了解决这个问题,我们可以使用Babel插件来去除代码中的console语句。本攻略将详细介绍如何使用Babel插件去除console语句,并提供两个示…

    other 2023年8月5日
    00
  • solr学习(一)安装与部署

    Solr学习(一) 安装与部署 Solr是一个基于Lucene的全文搜索引擎,可以帮助用户快速地构建搜索引擎应用程序。本文将为您提供Solr的安装与部署的完整攻略,包括下载Solr、安装Solr、启动Solr等内容。 下载Solr 以下是下载Solr的步骤: 访问Solr官网。 在浏览器中访问Solr官网,下载最新版本的Solr。 选择下载方式。 根据自己的…

    other 2023年5月6日
    00
  • PHP递归遍历指定文件夹内的文件实现方法

    实现递归遍历指定文件夹内的文件,可以使用PHP标准库中的递归函数 RecursiveDirectoryIterator 和 RecursiveIteratorIterator 结合使用。 以下是实现递归遍历指定目录下所有文件的代码: $path = ‘/path/to/directory’; $iterator = new RecursiveIterator…

    other 2023年6月27日
    00
  • 详解Java 中的嵌套类与内部类

    ” + outerData); } }} 在上面的示例中,`InnerClass`是一个非静态内部类,它可以访问外部类`OuterClass`的静态和非静态成员`outerData`。可以通过以下方式使用非静态内部类: “`java OuterClass outerObject = new OuterClass(); OuterClass.InnerCla…

    other 2023年7月27日
    00
  • nodeserver零基础——开发环境文件自动重载

    nodeserver零基础——开发环境文件自动重载 在软件开发中,不断地修改代码,并且反复测试是一个必不可少的过程。然而,对于初学者来说,这一过程会变得很繁琐。每一次修改代码后,需要手动重启服务器,才能看到修改后的效果,这对于时间的浪费是不必要的。因此,为了方便初学者,现在我们来介绍一种零基础操作的方法,将我们的开发环境改进为支持自动重载的环境。 什么是文件…

    其他 2023年3月28日
    00
  • 非常简单的Android打开和保存对话框功能

    下面我将为您详细讲解如何实现Android上的打开和保存对话框功能。 一、什么是打开和保存对话框 打开和保存对话框是指在Android应用程序中,打开或保存文件时弹出的用户界面,提供给用户选择文件或保存文件的路径和名称等自定义信息的功能。 二、如何实现Android打开和保存对话框 2.1 打开对话框 打开对话框的功能可以通过Intent的ACTION_GE…

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