当前位置:首页 > VUE

实现树形菜单vue

2026-03-29 20:40:43VUE

实现树形菜单的Vue方案

递归组件方案

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

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

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

动态组件方案

使用v-for和条件渲染实现多级菜单

<template>
  <div class="tree-menu">
    <div 
      v-for="node in treeData" 
      :key="node.id"
      :style="{ paddingLeft: `${level * 20}px` }"
    >
      <div @click="toggleExpand(node)">
        <span v-if="node.children">{{ node.expanded ? '▼' : '▶' }}</span>
        {{ node.label }}
      </div>
      <TreeMenu 
        v-if="node.expanded && node.children"
        :treeData="node.children"
        :level="level + 1"
      />
    </div>
  </div>
</template>

<script>
export default {
  props: {
    treeData: Array,
    level: {
      type: Number,
      default: 0
    }
  },
  methods: {
    toggleExpand(node) {
      this.$set(node, 'expanded', !node.expanded)
    }
  }
}
</script>

第三方库方案

使用vue-treeselect等成熟组件库

npm install @riophae/vue-treeselect
<template>
  <treeselect
    v-model="value"
    :multiple="true"
    :options="options"
  />
</template>

<script>
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'

export default {
  components: { Treeselect },
  data() {
    return {
      value: null,
      options: [{
        id: 'group',
        label: 'Group',
        children: [{
          id: 'child',
          label: 'Child'
        }]
      }]
    }
  }
}
</script>

性能优化技巧

添加v-memo指令缓存静态节点

<li 
  v-for="item in data" 
  :key="item.id"
  v-memo="[item.id, item.label]"
>
  {{ item.label }}
</li>

使用虚拟滚动处理大数据量

<template>
  <RecycleScroller
    :items="flattenData"
    :item-size="32"
    key-field="id"
  >
    <template #default="{ item }">
      <div :style="{ paddingLeft: `${item.level * 20}px` }">
        {{ item.label }}
      </div>
    </template>
  </RecycleScroller>
</template>

数据格式建议

推荐使用标准树形结构

const treeData = [
  {
    id: 1,
    label: '节点1',
    children: [
      {
        id: 2,
        label: '子节点1'
      }
    ]
  }
]

扁平化数据结构转换方法

实现树形菜单vue

function flattenTree(nodes, level = 0) {
  return nodes.reduce((acc, node) => {
    return [
      ...acc,
      { ...node, level },
      ...(node.children ? flattenTree(node.children, level + 1) : [])
    ]
  }, [])
}

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

相关文章

vue怎么实现

vue怎么实现

Vue 实现方法 Vue 是一个流行的前端框架,用于构建用户界面。以下是几种常见的实现方法: 数据绑定 使用 v-model 指令实现双向数据绑定,适用于表单输入元素。 <input v-m…

vue实现toggle

vue实现toggle

Vue 实现 Toggle 功能 在 Vue 中实现 toggle(切换)功能可以通过多种方式完成,以下是几种常见的方法: 使用 v-model 和 v-on 通过 v-model 绑定数据,结合…

vue实现抖动

vue实现抖动

Vue 实现抖动效果 在 Vue 中实现抖动效果可以通过 CSS 动画或 JavaScript 动画库来实现。以下是几种常见的方法: 使用 CSS 动画 通过定义 @keyframes 动画并在 V…

vue实现computed

vue实现computed

Vue 中 computed 的实现原理 computed 属性是 Vue 的一个核心特性,它基于响应式依赖进行缓存,仅在依赖发生变化时重新计算。以下是 computed 的实现方式: 基本用法 在…

vue滑块实现

vue滑块实现

Vue滑块实现方法 使用原生HTML5 range input Vue中可以绑定原生HTML5的range类型input元素实现基础滑块功能: <template> <div&…

vue实现截屏怎么实现

vue实现截屏怎么实现

Vue实现截屏的方法 使用html2canvas库 html2canvas是一个流行的JavaScript库,可以将网页元素转换为Canvas图像。在Vue项目中安装html2canvas: npm…