当前位置:首页 > VUE

vue 树形菜单实现

2026-01-19 07:47:43VUE

Vue 树形菜单实现方法

递归组件实现

递归组件是Vue中实现树形结构的常见方式。通过组件调用自身实现无限层级嵌套。

<template>
  <ul>
    <li v-for="item in treeData" :key="item.id">
      {{ item.label }}
      <tree-menu v-if="item.children" :treeData="item.children"></tree-menu>
    </li>
  </ul>
</template>

<script>
export default {
  name: 'TreeMenu',
  props: {
    treeData: {
      type: Array,
      required: true
    }
  }
}
</script>

使用第三方库

对于复杂需求,可以考虑使用成熟的第三方组件库:

  • element-uiel-tree
  • ant-design-vuea-tree
  • vuetifyv-treeview

element-ui为例:

<el-tree
  :data="treeData"
  :props="defaultProps"
  @node-click="handleNodeClick">
</el-tree>

<script>
export default {
  data() {
    return {
      treeData: [{
        label: '一级',
        children: [{
          label: '二级'
        }]
      }],
      defaultProps: {
        children: 'children',
        label: 'label'
      }
    }
  },
  methods: {
    handleNodeClick(data) {
      console.log(data)
    }
  }
}
</script>

动态加载数据

对于大数据量场景,可以实现懒加载:

loadNode(node, resolve) {
  if (node.level === 0) {
    return resolve([{ name: '根节点' }])
  }
  if (node.level > 3) return resolve([])

  setTimeout(() => {
    const data = Array.from({ length: 5 }).map((_, i) => ({
      name: `节点${node.level}-${i}`,
      leaf: node.level >= 2
    }))
    resolve(data)
  }, 500)
}

自定义样式和交互

通过CSS可以自定义树形菜单的外观:

.tree-node {
  padding: 5px 10px;
  cursor: pointer;
}
.tree-node:hover {
  background-color: #f5f5f5;
}
.tree-children {
  padding-left: 20px;
}

功能增强

实现常见功能如:

  • 复选框选择
  • 节点展开/折叠
  • 拖拽排序
  • 搜索过滤
  • 右键菜单

示例实现搜索过滤:

filterNode(value, data) {
  if (!value) return true
  return data.label.indexOf(value) !== -1
}

性能优化

对于大型树结构:

  • 使用虚拟滚动
  • 实现节点懒加载
  • 避免不必要的重新渲染
export default {
  shouldComponentUpdate(nextProps) {
    return !shallowEqual(this.props.node, nextProps.node)
  }
}

vue 树形菜单实现

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

相关文章

vue怎么实现选中删除

vue怎么实现选中删除

实现选中删除功能的方法 在Vue中实现选中删除功能通常涉及以下几个关键步骤: 数据绑定与选中状态管理 使用v-model或v-for指令绑定列表数据,结合复选框或单选按钮实现选中状态管理。例如:…

vue实现滚动截屏

vue实现滚动截屏

实现滚动截屏的基本思路 滚动截屏通常指对超出可视区域的长页面进行完整截图。在Vue中,可以通过结合DOM操作、Canvas绘制及第三方库实现。以下是具体方法: 使用html2canvas库实现…

vue实现本地数据存储

vue实现本地数据存储

使用 localStorage 或 sessionStorage Vue 中可以直接调用浏览器提供的 localStorage 或 sessionStorage API 进行数据存储。localSto…

vue实现按卡片轮播

vue实现按卡片轮播

实现卡片轮播的基本思路 在Vue中实现卡片轮播可以通过结合v-for指令和动态样式绑定完成。核心是维护一个当前显示卡片的索引,通过CSS过渡效果实现平滑切换。 基础实现步骤 模板部分 使用v-fo…

vue实现下载暂停

vue实现下载暂停

Vue实现下载暂停功能 在Vue中实现下载暂停功能,通常需要结合XMLHttpRequest或Fetch API的AbortController来控制请求中断。以下是具体实现方法: 使用XMLH…

vue实现边框

vue实现边框

Vue 实现边框的方法 在 Vue 中实现边框效果可以通过多种方式完成,包括内联样式、CSS 类绑定、动态样式以及使用第三方 UI 库。以下是几种常见的实现方法。 内联样式绑定 使用 Vue 的…