当前位置:首页 > JavaScript

js实现无穷树形菜单

2026-04-04 17:29:45JavaScript

实现无穷树形菜单的方法

使用递归组件是实现无穷树形菜单的核心方法。递归组件能够处理任意深度的树形结构数据,通过组件调用自身的方式渲染嵌套的子菜单。

数据结构设计

树形菜单的数据通常采用嵌套对象的形式,每个节点包含子节点数组。示例数据结构如下:

const treeData = [
  {
    id: 1,
    name: '节点1',
    children: [
      {
        id: 2,
        name: '节点1.1',
        children: []
      }
    ]
  },
  {
    id: 3,
    name: '节点2',
    children: []
  }
]

递归组件实现

创建可递归调用的树形菜单组件:

js实现无穷树形菜单

const TreeNode = {
  name: 'TreeNode',
  props: {
    node: Object
  },
  template: `
    <li>
      <div>{{ node.name }}</div>
      <ul v-if="node.children && node.children.length">
        <tree-node 
          v-for="child in node.children" 
          :key="child.id" 
          :node="child"
        />
      </ul>
    </li>
  `
}

完整示例代码

const app = Vue.createApp({
  components: {
    TreeNode
  },
  data() {
    return {
      treeData: [
        {
          id: 1,
          name: '根节点',
          children: [
            {
              id: 2,
              name: '子节点1',
              children: []
            },
            {
              id: 3,
              name: '子节点2',
              children: [
                {
                  id: 4,
                  name: '孙节点',
                  children: []
                }
              ]
            }
          ]
        }
      ]
    }
  },
  template: `
    <ul>
      <tree-node 
        v-for="node in treeData" 
        :key="node.id" 
        :node="node"
      />
    </ul>
  `
})

app.mount('#app')

动态加载子节点

对于大数据量的树形菜单,可采用懒加载方式,当用户展开节点时才加载子节点数据:

methods: {
  async loadChildren(node) {
    if (!node.childrenLoaded && !node.loading) {
      node.loading = true
      const children = await fetchChildren(node.id)
      node.children = children
      node.childrenLoaded = true
      node.loading = false
    }
  }
}

样式优化

添加CSS样式增强用户体验:

js实现无穷树形菜单

ul {
  list-style-type: none;
  padding-left: 20px;
}

li > div {
  cursor: pointer;
  padding: 5px;
}

li > div:hover {
  background-color: #f0f0f0;
}

交互功能扩展

添加展开/折叠功能:

data() {
  return {
    expanded: false
  }
},
methods: {
  toggle() {
    this.expanded = !this.expanded
  }
}

性能优化建议

对于大型树形结构,应考虑虚拟滚动技术,只渲染可视区域内的节点,避免性能问题:

import { VirtualTree } from 'vue-virtual-scroller'

// 使用虚拟滚动组件替换常规渲染

这种实现方式可以处理任意深度的树形结构,具有良好的扩展性和性能表现。

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

相关文章

css制作下拉菜单

css制作下拉菜单

CSS 制作下拉菜单的方法 使用纯 CSS 可以创建简单的下拉菜单效果,主要依赖 :hover 伪类和 display 属性控制子菜单的显示与隐藏。 基础 HTML 结构 <div c…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

vue 菜单实现

vue 菜单实现

Vue 菜单实现方法 基于路由的动态菜单 在 Vue 项目中,可以利用 Vue Router 实现动态菜单。首先定义路由配置,包含菜单所需的元信息(如标题、图标等)。 const routes =…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…