当前位置:首页 > VUE

实现树形菜单vue

2026-01-17 03:59:09VUE

实现树形菜单的Vue方案

递归组件实现

创建递归组件TreeMenu.vue,通过组件自身调用自身实现无限层级渲染:

<template>
  <ul>
    <li v-for="item in data" :key="item.id">
      {{ item.name }}
      <TreeMenu v-if="item.children" :data="item.children"/>
    </li>
  </ul>
</template>

<script>
export default {
  name: 'TreeMenu',
  props: {
    data: Array
  }
}
</script>

数据格式要求

树形数据应满足以下结构:

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

添加展开/折叠功能

通过v-show和点击事件控制子级显示:

<template>
  <ul>
    <li v-for="item in data" :key="item.id">
      <span @click="toggle(item)">
        {{ item.expanded ? '▼' : '►' }} {{ item.name }}
      </span>
      <TreeMenu 
        v-if="item.children" 
        v-show="item.expanded"
        :data="item.children"/>
    </li>
  </ul>
</template>

<script>
export default {
  methods: {
    toggle(item) {
      this.$set(item, 'expanded', !item.expanded)
    }
  }
}
</script>

使用第三方库

对于复杂需求,可考虑以下成熟方案:

  • vue-tree-halower:支持拖拽、复选框等功能
  • element-uiel-tree组件
  • ant-design-vuea-tree组件

样式优化建议

添加CSS增强视觉效果:

ul {
  list-style: none;
  padding-left: 20px;
}
li {
  cursor: pointer;
  line-height: 1.8;
}

动态加载数据

实现异步加载子节点:

async loadChildren(item) {
  if(!item.children) {
    const res = await api.getChildren(item.id)
    this.$set(item, 'children', res.data)
  }
  this.$set(item, 'expanded', true)
}

事件处理

通过$emit向上传递节点事件:

<span @click="$emit('node-click', item)">
  {{ item.name }}
</span>

性能优化

对于大型树结构:

  • 使用虚拟滚动(如vue-virtual-scroller
  • 实现懒加载
  • 避免深度响应式,对静态数据使用Object.freeze

以上方案可根据实际需求组合使用,基础递归组件适合简单场景,复杂业务推荐基于成熟组件库扩展。

实现树形菜单vue

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

相关文章

vue点击实现排序

vue点击实现排序

实现点击排序的方法 在Vue中实现点击排序功能,可以通过以下几种方式完成: 使用计算属性结合排序方法 定义一个响应式数据存储排序状态,通过计算属性动态返回排序后的数组。点击事件切换排序状态。…

vue实现密码框的包

vue实现密码框的包

Vue 密码框实现方案 在 Vue 中实现密码框功能,可以通过原生 HTML 结合 Vue 指令或使用第三方组件库完成。以下是几种常见方案: 原生 HTML + Vue 双向绑定 <temp…

vue实现store

vue实现store

Vue 实现 Store 在 Vue 中,可以通过 Vuex 或 Pinia 实现全局状态管理(Store)。以下是两种主流方案的实现方法。 使用 Vuex 实现 Store Vuex 是 Vue…

vue页面实现

vue页面实现

Vue 页面实现方法 创建 Vue 组件 使用 Vue 单文件组件(SFC)方式创建页面,文件扩展名为 .vue。一个基本的 Vue 组件包含三个部分:模板(template)、脚本(script)和…

vue  实现tab

vue 实现tab

实现 Tab 切换功能 在 Vue 中实现 Tab 切换功能可以通过动态组件或条件渲染完成。以下是两种常见方法: 使用 v-if 或 v-show 实现条件渲染 通过绑定 currentTab 变…

vue实现分栏

vue实现分栏

Vue实现分栏的常见方法 使用CSS Flexbox布局 通过Flexbox可以快速实现分栏效果,适合大多数响应式布局场景 <template> <div class="co…