当前位置:首页 > JavaScript

js实现四层树形菜单

2026-01-31 05:23:17JavaScript

实现四层树形菜单的步骤

数据结构设计

使用嵌套对象或数组表示树形结构,每个节点包含 idlabelchildren 等属性:

const treeData = [
  {
    id: 1,
    label: "一级菜单1",
    children: [
      {
        id: 11,
        label: "二级菜单1",
        children: [
          {
            id: 111,
            label: "三级菜单1",
            children: [
              { id: 1111, label: "四级菜单1" },
              { id: 1112, label: "四级菜单2" }
            ]
          }
        ]
      }
    ]
  }
];

递归渲染组件

通过递归组件实现动态渲染,支持任意层级展开/折叠:

function TreeNode({ node }) {
  const [isExpanded, setIsExpanded] = useState(false);

  return (
    <div>
      <div onClick={() => setIsExpanded(!isExpanded)}>
        {node.children && <span>{isExpanded ? '−' : '+'}</span>}
        {node.label}
      </div>
      {isExpanded && node.children && (
        <div style={{ marginLeft: '20px' }}>
          {node.children.map(child => (
            <TreeNode key={child.id} node={child} />
          ))}
        </div>
      )}
    </div>
  );
}

样式优化

添加基础样式增强交互体验:

.tree-node {
  cursor: pointer;
  padding: 5px;
}
.tree-node:hover {
  background-color: #f0f0f0;
}

动态加载支持

对于大数据量场景,可结合懒加载优化性能:

async function loadChildren(parentId) {
  const res = await fetch(`/api/menu?parent=${parentId}`);
  return res.json();
}

完整示例代码

整合后的组件实现:

import React, { useState } from 'react';

function TreeMenu({ data }) {
  return (
    <div className="tree-menu">
      {data.map(node => (
        <TreeNode key={node.id} node={node} />
      ))}
    </div>
  );
}

function TreeNode({ node }) {
  const [isExpanded, setIsExpanded] = useState(false);
  const [children, setChildren] = useState(node.children || []);

  const handleToggle = async () => {
    if (!children.length && node.hasChildren) {
      const loadedChildren = await loadChildren(node.id);
      setChildren(loadedChildren);
    }
    setIsExpanded(!isExpanded);
  };

  return (
    <div className="tree-node">
      <div onClick={handleToggle}>
        {node.hasChildren && <span>{isExpanded ? '−' : '+'}</span>}
        {node.label}
      </div>
      {isExpanded && children.length > 0 && (
        <div style={{ marginLeft: '20px' }}>
          {children.map(child => (
            <TreeNode key={child.id} node={child} />
          ))}
        </div>
      )}
    </div>
  );
}

关键实现要点

  • 使用递归组件处理无限层级结构
  • 通过状态管理控制展开/折叠状态
  • 支持静态数据或动态加载两种模式
  • 通过CSS缩进实现视觉层级区分

性能优化建议

  • 对于大数据量使用虚拟滚动技术
  • 添加节点加载状态指示器
  • 实现节点展开/折叠动画效果
  • 使用React.memo优化组件重渲染

js实现四层树形菜单

标签: 四层菜单
分享给朋友:

相关文章

vue 菜单实现

vue 菜单实现

Vue 菜单实现方法 在Vue中实现菜单功能可以通过多种方式完成,以下是几种常见的实现方法: 使用v-for动态生成菜单 通过数据驱动的方式动态渲染菜单项,适合菜单内容可能变化的场景: <t…

纯css制作tab菜单

纯css制作tab菜单

纯CSS制作Tab菜单的方法 使用radio input控制切换 通过<input type="radio">和<label>元素配合实现无JavaScript的Tab切换效果…

vue实现菜单

vue实现菜单

使用 Vue 实现菜单 Vue 可以轻松实现动态菜单,通常结合路由和组件化思想。以下是一个基于 Vue 3 和 Vue Router 的菜单实现方案: 基础菜单结构 在 Vue 中,菜单通常是一个递…

jquery菜单

jquery菜单

以下是关于使用jQuery创建交互式菜单的几种常见方法及实现示例: 基础下拉菜单实现 通过jQuery的slideToggle和toggleClass实现简单下拉效果: $('.menu-it…

css制作下拉菜单

css制作下拉菜单

使用纯CSS制作下拉菜单 通过HTML和CSS可以创建无需JavaScript的下拉菜单,主要利用:hover伪类和display属性控制显示隐藏。 HTML结构示例: <div cla…

css div 制作导航菜单

css div 制作导航菜单

使用 CSS 和 Div 制作导航菜单 导航菜单是网站的重要组成部分,以下是通过 CSS 和 div 元素制作导航菜单的方法。 基本 HTML 结构 创建一个简单的 div 结构作为导航菜单的基础:…