elementui树状菜单tree_Java + Element-UI 实现简单的树形菜单

一、简单入门级树形菜单实现(纯后台逻辑)

1、简介

(1)开发环境

IDEA + JDK1.8 + mysql 1.8

SpringBoot 2.2.6 + mybatis-plus

此处仅后台开发(返回 json 数据),前台页面展示后续会讲解。

(2)数据表

如下,仅供参考,可以添加 修改时间、创建时间、逻辑删除等字段。

DROP DATABASE IF EXISTS test;

CREATE DATABASE test;

USE test;/*用于测试 树形的菜单(以商品为例)*/CREATE TABLE tree_menu(

menu_id bigint NOT NULL AUTO_INCREMENT COMMENT"当前菜单ID",

namechar(50) COMMENT "菜单名",

parent_menu_id bigint COMMENT"当前菜单的父菜单 ID",

meun_levelint COMMENT "当前菜单的层级",

sortint COMMENT "排序",

PRIMARY KEY (menu_id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT="树形菜单";

(3)插入测试数据

为了数据直观显示,如下插入数据,每段数据代表一个菜单栏。

注:

parent_menu_id 从 0 开始,0 表示第一级菜单(没有父菜单)。

meun_level 从 1 开始,1 表示第一级菜单,2 表示第二级菜单。

INSERT INTO tree_menu(menu_id, name, parent_menu_id, meun_level, sort)

VALUES

(1, '厨具', 0, 1, 0),

(2, '刀具', 1, 2, 0),(3, '烹饪工具', 1, 2, 0),(4, '餐具', 1, 2, 0),

(5, '菜刀', 2, 3, 0),(6, '剪刀', 2, 3, 0),(7, '水果刀', 2, 3, 0),

(8, '炒菜锅', 3, 3, 0),(9, '压力锅', 3, 3, 0),(10, '平底锅', 3, 3, 0),

(11, '筷子', 4, 3, 0),(12, '碗', 4, 3, 0),(13, '果盘', 4, 3, 0),

(14, '家用电器', 0, 1, 0),

(15, '大家电', 14, 2, 0),(16, '生活家电', 14, 2, 0),

(17, '电视', 15, 3, 0),(18, '电脑', 15, 3, 0),(19, '洗衣机', 15, 3, 0),(20, '冰箱', 15, 3, 0),

(21, '电风扇', 16, 3, 0),(22, '吸尘器', 16, 3, 0),(23, '饮水机', 16, 3, 0),(24, '加湿器', 16, 3, 0),

(25, '数码', 0, 1, 0),

(26, '摄像摄影', 25, 2, 0),(27, '影音娱乐', 25, 2, 0),(28, '教育学习', 25, 2, 0),

(29, '数码相机', 26, 3, 0),(30, '单反相机', 26, 3, 0),(31, '摄像机', 26, 3, 0),(32, '拍立得', 26, 3, 0),

(33, 'MP3/MP4/MP5/PSP', 27, 3, 0),(34, '音箱', 27, 3, 0),(35, '麦克风', 27, 3, 0),

(36, '学生平板', 28, 3, 0),(37, '复读机', 28, 3, 0),(38, '电子辞典', 28, 3, 0),(39, '点读机', 28, 3, 0)

2、构建基本开发环境

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现一个无限级动态菜单树,可以使用 Element UITree 组件。以下是一个简单实现示例: 首先,需要在 Vue 引入 Element UITree 组件: ```javascript import { Tree } from 'element-ui'; ``` 然后,可以在 Vue 的模板使用 `el-tree` 标签来渲染 Tree 组件: ```html <el-tree :data="menuData" :props="treeProps" @node-click="handleNodeClick"></el-tree> ``` 其,`menuData` 是菜单数据,`treeProps` 是 Tree 组件的属性配置对象,`handleNodeClick` 是 Tree 组件的点击事件处理函数。 接下来,我们来看一下如何实现动态加载菜单数据。首先,需要在 Vue 的 `mounted` 生命周期调用一个方法来获取菜单数据: ```javascript mounted() { this.getMenuData(); }, methods: { getMenuData() { // 通过接口获取菜单数据 } } ``` 接着,在菜单数据获取成功后,需要将数据转换成符合 Tree 组件要求的格式,并将数据保存在 Vue 实例的 `menuData` 属性: ```javascript getMenuData() { // 通过接口获取菜单数据 // 将数据转换成符合 Tree 组件要求的格式 const menuData = convertMenuData(data); // 将数据保存在 Vue 实例的 menuData 属性 this.menuData = menuData; } ``` 最后,我们来看一下如何处理 Tree 组件的点击事件。在 `handleNodeClick` 方法,可以根据节点的 `level` 属性来判断当前节点是否为叶子节点。如果是叶子节点,则可以执行相应的操作,比如打开对应的页面;否则,需要递归获取子节点的数据并更新 Tree 组件的数据源: ```javascript handleNodeClick(node) { if (node.level === 2) { // 点击了叶子节点,执行相应操作 // 比如打开对应的页面 window.location.href = node.url; } else { // 点击了非叶子节点,递归获取子节点数据并更新 Tree 组件的数据源 const childNodes = await this.getChildNodes(node); node.children = childNodes; this.menuData = [...this.menuData]; } }, async getChildNodes(node) { // 通过接口获取子节点数据 const childNodesData = await getChildrenData(node.id); // 将数据转换成符合 Tree 组件要求的格式 const childNodes = convertMenuData(childNodesData); return childNodes; } ``` 至此,一个简单的无限级动态菜单树就实现了。完整的代码可以参考下面的示例: ```html <template> <el-tree :data="menuData" :props="treeProps" @node-click="handleNodeClick"></el-tree> </template> <script> import { Tree } from 'element-ui'; export default { components: { [Tree.name]: Tree }, data() { return { menuData: [], treeProps: { label: 'name', children: 'children' } }; }, mounted() { this.getMenuData(); }, methods: { async getMenuData() { // 通过接口获取菜单数据 const data = await getMenuData(); // 将数据转换成符合 Tree 组件要求的格式 const menuData = convertMenuData(data); // 将数据保存在 Vue 实例的 menuData 属性 this.menuData = menuData; }, async handleNodeClick(node) { if (node.level === 2) { // 点击了叶子节点,执行相应操作 // 比如打开对应的页面 window.location.href = node.url; } else { // 点击了非叶子节点,递归获取子节点数据并更新 Tree 组件的数据源 const childNodes = await this.getChildNodes(node); node.children = childNodes; this.menuData = [...this.menuData]; } }, async getChildNodes(node) { // 通过接口获取子节点数据 const childNodesData = await getChildrenData(node.id); // 将数据转换成符合 Tree 组件要求的格式 const childNodes = convertMenuData(childNodesData); return childNodes; } } }; </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值