当前位置:首页 > JavaScript

js实现tree实现树菜单

2026-04-07 06:20:36JavaScript

实现树形菜单的JavaScript方法

数据结构设计

使用对象数组表示树节点,每个节点包含idlabelchildren等属性:

const treeData = [
  {
    id: 1,
    label: 'Parent 1',
    children: [
      {
        id: 2,
        label: 'Child 1',
        children: []
      }
    ]
  }
]

递归渲染方法

通过递归函数遍历树结构并生成DOM元素:

function renderTree(node, parentElement) {
  const li = document.createElement('li');
  li.textContent = node.label;

  if (node.children && node.children.length > 0) {
    const ul = document.createElement('ul');
    node.children.forEach(child => renderTree(child, ul));
    li.appendChild(ul);
  }

  parentElement.appendChild(li);
}

事件处理

添加展开/折叠功能的事件监听:

js实现tree实现树菜单

document.querySelectorAll('li').forEach(li => {
  li.addEventListener('click', (e) => {
    e.stopPropagation();
    const ul = li.querySelector('ul');
    if (ul) ul.style.display = ul.style.display === 'none' ? 'block' : 'none';
  });
});

完整组件实现

结合上述方法的完整树组件示例:

class TreeMenu {
  constructor(containerId, data) {
    this.container = document.getElementById(containerId);
    this.data = data;
    this.render();
  }

  renderNode(node) {
    const nodeElement = document.createElement('div');
    nodeElement.className = 'tree-node';
    nodeElement.innerHTML = `
      <div class="node-label">${node.label}</div>
      ${node.children?.length ? `<div class="children"></div>` : ''}
    `;

    if (node.children) {
      const childrenContainer = nodeElement.querySelector('.children');
      node.children.forEach(child => {
        childrenContainer.appendChild(this.renderNode(child));
      });
    }

    return nodeElement;
  }

  render() {
    this.data.forEach(rootNode => {
      this.container.appendChild(this.renderNode(rootNode));
    });
  }
}

CSS样式建议

为树形菜单添加基础样式:

js实现tree实现树菜单

.tree-node {
  margin-left: 20px;
}
.node-label {
  cursor: pointer;
  padding: 5px;
}
.node-label:hover {
  background-color: #f0f0f0;
}
.children {
  display: none;
}
.children.show {
  display: block;
}

动态加载优化

实现按需加载子节点的优化方案:

function lazyLoadChildren(node, callback) {
  if (!node.loaded && node.hasChildren) {
    fetch(`/api/nodes/${node.id}`)
      .then(res => res.json())
      .then(children => {
        node.children = children;
        node.loaded = true;
        callback();
      });
  }
}

第三方库方案

使用现有库快速实现(如zTree):

// 引入zTree库后
const setting = {
  data: { simpleData: { enable: true } }
};
const zNodes = [
  { id:1, pId:0, name:"父节点" },
  { id:11, pId:1, name:"子节点" }
];
$.fn.zTree.init($("#tree"), setting, zNodes);

标签: 菜单js
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

js实现分页

js实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

纯css制作tab菜单

纯css制作tab菜单

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