当前位置: 首页 > news >正文

JavaScript 树形菜单总结

树形菜单是前端开发中常见的交互组件,用于展示具有层级关系的数据(如文件目录、分类列表、组织架构等)。以下从核心概念、实现方式、常见功能及优化方向等方面进行总结。

一、核心概念

  • 层级结构:数据以父子嵌套形式存在,如{ id: 1, children: [{ id: 2 }] }
  • 节点:树形结构的基本单元,包含自身信息及子节点(若有)。
  • 展开 / 折叠:子节点的显示与隐藏切换,是树形菜单的核心交互。
  • 递归渲染:因数据层级不固定,通常通过递归函数生成 DOM 结构。

二、数据格式设计

常见的树形数据格式(以 JSON 为例):

javascript

const treeData = [{id: 1,label: "父节点1",// 可选:是否默认展开expanded: false,// 可选:是否禁用节点disabled: false,// 子节点(数组,无则为叶子节点)children: [{ id: 11, label: "子节点1-1", children: [] },{ id: 12, label: "子节点1-2" }]},{ id: 2, label: "父节点2" }
];

三、实现方式

1. 原生 JavaScript + DOM 操作

核心步骤

  1. 定义递归函数,根据数据生成节点 DOM。
  2. 为父节点添加点击事件,控制子节点显示 / 隐藏。
  3. 处理特殊状态(如禁用、默认展开)。

示例代码片段

javascript

function renderTree(data, container) {const ul = document.createElement("ul");data.forEach(node => {const li = document.createElement("li");li.innerHTML = `<span class="node-label ${node.disabled ? 'disabled' : ''}">${node.children?.length ? (node.expanded ? '▼' : '►') : '•'} ${node.label}</span>`;// 处理展开/折叠if (node.children?.length && !node.disabled) {li.querySelector(".node-label").addEventListener("click", () => {node.expanded = !node.expanded;li.querySelector("ul")?.classList.toggle("hidden");li.querySelector(".node-label").firstChild.textContent = node.expanded ? '▼' : '►';});// 递归渲染子节点const ch
http://www.lryc.cn/news/583883.html

相关文章:

  • SoC程序如何使用单例模式运行
  • vue3 el-table 列汉字 排序时排除 null 或空字符串的值
  • 第二章-AIGC入门-AI视频生成:几款实用AI视频生成工具全解析(7/36)
  • 2025年软件测试面试题,精选33道,附答案
  • 数据结构笔记10:排序算法
  • 【办公类-107-01】20250710视频慢速与视频截图
  • 用OpenCV标定相机内参应用示例(C++和Python)
  • window显示驱动开发—XR_BIAS 和 PresentDXGI
  • 图像亮度调整的简单实现
  • 0基础学Python系列【31】 详细讲解Python中SQLAlchemy包的用法:从入门到精通
  • k8s:安装 Helm 私有仓库ChartMuseum、helm-push插件并上传、安装Zookeeper
  • zookeeper etcd区别
  • 在 Mac 上安装 Java 和 IntelliJ IDEA(完整笔记)
  • macOS 上安装 Miniconda + Conda-Forge
  • 算法练习5-原地移除数组中所有的元素
  • 龙迅#LT8619B适用于HDMI转LVDS/RGB,芯片支持视频图像处理,OSD功能.
  • MacOS 终端(Terminal)配置显示日期时间
  • 在Docker中运行macOS的超方便体验!
  • 基于深度学习的自动调制识别网络(持续更新)
  • 【PTA数据结构 | C语言版】顺序队列的3个操作
  • 在 Mac 上使用 Git 拉取项目:完整指南
  • 【macos用镜像站体验】Claude Code入门使用教程和常用命令
  • 029_构造器重载与默认构造器
  • 基于多模态感知的裂缝2D及3D检测方案
  • 【leetcode】2236. 判断根节点是否等于子节点之和
  • git fetch的使用
  • vue3 uniapp 使用ref更新值后子组件没有更新 ref reactive的区别?使用from from -item执行表单验证一直提示没有值
  • TCP 保活(KeepAlive)机制详解
  • STM32F103之ModBus\RS232\RS422\RS485
  • OpenCV 图像进阶处理:特征提取与车牌识别深度解析