当前位置:首页 > 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();
}

完整示例代码

整合后的组件实现:

js实现四层树形菜单

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优化组件重渲染

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

相关文章

css制作二级菜单

css制作二级菜单

CSS制作二级菜单的方法 通过纯CSS实现二级菜单主要依赖HTML结构嵌套和CSS的:hover伪类选择器。以下是具体实现方式: HTML结构 <ul class="main-menu"&g…

uniapp 长按菜单

uniapp 长按菜单

实现长按菜单的方法 在UniApp中实现长按菜单功能,可以通过以下几种方式完成,具体取决于平台和需求。 使用@longpress事件绑定 在模板中为元素添加@longpress事件监听,触发后显示自…

实现树形菜单vue

实现树形菜单vue

实现树形菜单的Vue方案 递归组件实现 创建递归组件TreeMenu.vue,通过组件自身调用自身实现无限层级渲染: <template> <ul> <li…

vue实现变色菜单

vue实现变色菜单

实现变色菜单的方法 在Vue中实现变色菜单可以通过多种方式完成,以下是几种常见的实现方法: 动态绑定class 通过Vue的v-bind:class或简写:class动态绑定CSS类,根据条件切换不…

vue实现动态菜单

vue实现动态菜单

Vue 动态菜单实现方法 基于路由配置的动态菜单 在 Vue 项目中,可以利用路由配置自动生成菜单。路由配置通常包含 path、name、meta 等字段,其中 meta 可以存储菜单标题、图标等信息…

vue实现顶部菜单

vue实现顶部菜单

使用 Vue 实现顶部菜单 在 Vue 中实现顶部菜单可以通过多种方式完成,以下是几种常见的方法。 使用 Vue Router 实现导航菜单 通过 Vue Router 可以轻松实现顶部菜单的导航功…