当前位置:首页 > 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 中实现矩阵操作可以通过多种方式完成,以下是一些常见的方法: 使用二维数组表示矩阵 矩阵可以用二维数组来表示,每个元素对应矩阵中的一个值。在 Vue 的 data…

代码实现vue

代码实现vue

创建Vue项目 使用Vue CLI快速初始化项目,确保已安装Node.js和npm/yarn: npm install -g @vue/cli vue create my-vue-project c…

vue实现切换

vue实现切换

Vue 实现切换功能的方法 在 Vue 中实现切换功能可以通过多种方式实现,以下是一些常见的方法: 使用 v-if 和 v-else 指令 通过条件渲染实现切换功能,适用于简单的显示/隐藏场景。…

vue滚动实现

vue滚动实现

Vue 滚动实现方法 使用原生滚动 在 Vue 中可以通过 ref 获取 DOM 元素,调用原生滚动方法实现滚动效果。适用于简单场景。 <template> <div ref=…

vue实现兼容

vue实现兼容

Vue 兼容性实现方案 Vue.js 的兼容性主要涉及对不同浏览器、Vue 版本以及第三方库的支持。以下是常见的兼容性解决方案: 浏览器兼容性 使用 Babel 转换 ES6+ 代码为 ES5 语…

vue实现上划

vue实现上划

Vue 实现上划功能 在Vue中实现上划功能,可以通过监听触摸事件(touchstart、touchmove、touchend)来判断用户的手势方向。以下是实现上划功能的几种方法: 监听触摸事件 通…