当前位置:首页 > VUE

vue树形菜单实现

2026-01-18 09:56:17VUE

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>

添加展开/折叠功能

为树形菜单添加交互功能,允许用户展开或折叠子菜单。

<template>
  <ul>
    <li v-for="item in treeData" :key="item.id">
      <span @click="toggle(item)">
        {{ item.expanded ? '▼' : '►' }} {{ item.label }}
      </span>
      <tree-menu 
        v-if="item.children && item.expanded" 
        :treeData="item.children"
      ></tree-menu>
    </li>
  </ul>
</template>

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

使用第三方库

对于更复杂的需求,可以考虑使用专门处理树形结构的 Vue 组件库。

vue树形菜单实现

安装 element-ui 的树形组件:

npm install element-ui

使用示例:

vue树形菜单实现

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

<script>
import { ElTree } from 'element-ui'

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

动态加载数据

对于大型树形结构,可以实现懒加载功能,只在展开时加载子节点数据。

<template>
  <ul>
    <li v-for="item in treeData" :key="item.id">
      <span @click="loadChildren(item)">
        {{ item.hasChildren ? (item.expanded ? '▼' : '►') : '' }} {{ item.label }}
      </span>
      <tree-menu 
        v-if="item.children && item.expanded" 
        :treeData="item.children"
      ></tree-menu>
    </li>
  </ul>
</template>

<script>
export default {
  methods: {
    async loadChildren(item) {
      if (!item.expanded && item.hasChildren && !item.children) {
        const children = await fetchChildren(item.id)
        this.$set(item, 'children', children)
      }
      this.$set(item, 'expanded', !item.expanded)
    }
  }
}
</script>

样式优化

为树形菜单添加基本样式,提升用户体验。

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

li {
  margin: 5px 0;
  cursor: pointer;
}

span:hover {
  background-color: #f5f5f5;
}

完整示例

结合上述功能的完整树形菜单组件示例:

<template>
  <ul class="tree-menu">
    <li v-for="item in treeData" :key="item.id">
      <div class="node" @click="toggleNode(item)">
        <span class="toggle-icon">
          {{ item.children && item.children.length ? (item.expanded ? '▼' : '►') : '' }}
        </span>
        <span class="node-label">{{ item.label }}</span>
      </div>
      <tree-menu 
        v-if="item.children && item.expanded" 
        :treeData="item.children"
        class="sub-tree"
      ></tree-menu>
    </li>
  </ul>
</template>

<script>
export default {
  name: 'TreeMenu',
  props: {
    treeData: {
      type: Array,
      required: true
    }
  },
  methods: {
    toggleNode(item) {
      this.$set(item, 'expanded', !item.expanded)
    }
  }
}
</script>

<style scoped>
.tree-menu {
  list-style: none;
  padding-left: 20px;
}

.node {
  display: flex;
  align-items: center;
  padding: 5px 0;
  cursor: pointer;
}

.toggle-icon {
  display: inline-block;
  width: 20px;
}

.node-label {
  margin-left: 5px;
}

.node:hover {
  background-color: #f0f0f0;
}

.sub-tree {
  margin-left: 15px;
}
</style>

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

相关文章

vue实现旋转

vue实现旋转

Vue 实现旋转效果的方法 在 Vue 中实现旋转效果可以通过多种方式完成,以下是几种常见的方法: 使用 CSS 动画 通过 Vue 的 :class 或 :style 绑定 CSS 动画实现旋转效…

vue实现订单

vue实现订单

Vue 实现订单功能 订单数据结构设计 订单数据通常包含以下字段: order: { id: String, // 订单ID userId: String,…

vue实现导出

vue实现导出

Vue 实现导出功能的方法 在 Vue 项目中实现导出功能通常涉及将数据导出为 Excel、CSV 或其他格式。以下是几种常见的实现方式: 使用 xlsx 库导出 Excel 安装 xlsx 库:…

vue实现slidetoggle

vue实现slidetoggle

Vue 实现 SlideToggle 效果 SlideToggle 是一种常见的交互效果,元素以滑动方式展开或收起。以下是几种实现方法: 使用 CSS Transition 和 v-show…

vue源码实现

vue源码实现

Vue 源码实现解析 Vue.js 的核心实现可以分为响应式系统、虚拟 DOM、模板编译、组件化等几个关键部分。以下是对这些核心机制的详细解析。 响应式系统 Vue 的响应式系统基于 Object.…

vue实现监控

vue实现监控

Vue 实现监控功能的方法 在 Vue 中实现监控功能通常涉及数据变化监听、事件监听或第三方监控工具集成。以下是几种常见实现方式: 使用 Vue 的 watch 监听数据变化 通过 watch 可以…