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

递归渲染组件

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

js实现四层树形菜单

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>
  );
}

样式优化

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

js实现四层树形菜单

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

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

相关文章

实现树形菜单vue

实现树形菜单vue

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

vue实现抽屉菜单

vue实现抽屉菜单

Vue 实现抽屉菜单 使用 Vue 过渡和 CSS 实现 通过 Vue 的过渡组件和 CSS 实现抽屉菜单的动画效果。定义一个布尔值控制抽屉的显示和隐藏,利用 CSS 过渡效果实现平滑的滑动。 &l…

vue实现菜单缩放

vue实现菜单缩放

实现思路 通过 Vue 的响应式数据和 CSS 过渡效果,结合动态绑定 class 或 style 来实现菜单的缩放功能。核心是利用 v-bind:class 或 v-bind:style 控制菜单宽…

vue  实现多级菜单

vue 实现多级菜单

实现多级菜单的基本思路 在Vue中实现多级菜单通常需要递归组件或动态渲染嵌套数据结构。核心是通过组件递归调用自身,或利用v-for遍历嵌套的菜单数据。 递归组件实现方式 定义菜单数据结构 数据格式…

vue导航菜单实现

vue导航菜单实现

基础导航菜单实现 在Vue中实现基础导航菜单可以通过v-for指令动态渲染菜单项,结合router-link实现路由跳转。需要安装vue-router并配置路由信息。 <template>…

vue实现侧滑菜单

vue实现侧滑菜单

Vue 实现侧滑菜单的方法 使用 CSS 过渡和 Vue 指令 通过 Vue 的 v-show 或 v-if 控制菜单显示,结合 CSS 过渡实现平滑动画效果。定义一个 isMenuOpen 数据属性…