当前位置:首页 > VUE

vue实现菜单树

2026-03-10 05:56:21VUE

实现菜单树的基本思路

在Vue中实现菜单树通常需要递归组件来处理嵌套的树形结构数据。核心是通过组件自身调用自身的方式渲染子菜单,并利用CSS控制缩进和交互效果。

数据结构示例

菜单数据通常是一个嵌套结构的数组对象,每个节点包含标题、唯一标识、子节点等属性:

const menuData = [
  {
    id: 1,
    title: '首页',
    children: []
  },
  {
    id: 2,
    title: '产品管理',
    children: [
      {
        id: 21,
        title: '产品列表',
        children: []
      }
    ]
  }
]

递归组件实现

创建名为TreeMenu.vue的组件:

<template>
  <ul class="menu-tree">
    <li v-for="item in treeData" :key="item.id">
      <div @click="toggleChildren(item)">
        {{ item.title }}
        <span v-if="item.children?.length">[{{ item.isOpen ? '-' : '+' }}]</span>
      </div>
      <tree-menu 
        v-if="item.children && item.isOpen"
        :tree-data="item.children"
        class="sub-menu"
      />
    </li>
  </ul>
</template>

<script>
export default {
  name: 'TreeMenu',
  props: {
    treeData: {
      type: Array,
      required: true
    }
  },
  methods: {
    toggleChildren(item) {
      if (item.children?.length) {
        this.$set(item, 'isOpen', !item.isOpen)
      }
    }
  }
}
</script>

<style>
.menu-tree {
  list-style: none;
  padding-left: 20px;
}
.sub-menu {
  margin-left: 15px;
}
</style>

使用组件

在父组件中引入并使用:

<template>
  <div>
    <tree-menu :tree-data="menuData" />
  </div>
</template>

<script>
import TreeMenu from './TreeMenu.vue'

export default {
  components: { TreeMenu },
  data() {
    return {
      menuData: [...] // 你的菜单数据
    }
  }
}
</script>

进阶优化方向

添加默认展开/折叠控制

// 在数据初始化时添加状态
function initMenuData(data) {
  return data.map(item => {
    return {
      ...item,
      isOpen: false,
      children: item.children ? initMenuData(item.children) : []
    }
  })
}

添加路由跳转功能

<div @click="handleItemClick(item)">
  {{ item.title }}
</div>

methods: {
  handleItemClick(item) {
    if (item.path) {
      this.$router.push(item.path)
    } else if (item.children?.length) {
      this.toggleChildren(item)
    }
  }
}

使用第三方库

对于复杂需求可以考虑使用现成的树形组件库:

vue实现菜单树

  • vue-tree-list:提供拖拽、复选框等功能
  • element-uiel-tree组件
  • ant-design-vuea-tree组件

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

相关文章

vue里实现增删改查

vue里实现增删改查

在Vue中实现增删改查 数据初始化 在Vue组件的data中定义初始数据和表单绑定的变量: data() { return { items: [ { id: 1, name:…

vue实现文章锚点定位

vue实现文章锚点定位

实现文章锚点定位的方法 在Vue中实现文章锚点定位可以通过多种方式完成,以下是几种常见的方法: 使用原生HTML锚点 通过HTML的id属性和<a>标签的href属性实现锚点跳转。在Vu…

vue实现a4打印模板

vue实现a4打印模板

使用Vue实现A4打印模板 在Vue中实现A4打印模板需要结合CSS的打印样式和Vue的模板渲染能力。以下是具体实现方法: 设置A4纸张尺寸 在CSS中定义A4纸张的标准尺寸(210mm × 297…

vue实现博客

vue实现博客

Vue 实现博客的基本步骤 使用 Vue.js 实现一个博客系统可以分为前端和后端两部分。以下是基于 Vue 的前端实现方案,后端可以选择 Node.js、Django 或其他框架。 项目初始化 使…

vue实现toast

vue实现toast

Vue 实现 Toast 的方法 使用第三方库(推荐) 对于快速实现 Toast 功能,推荐使用成熟的第三方库如 vue-toastification 或 vant 的 Toast 组件。 安装 v…

vue实现录像

vue实现录像

Vue 实现录像功能 在 Vue 中实现录像功能通常需要借助浏览器的 MediaDevices API 和 MediaRecorder API。以下是实现步骤: 获取用户摄像头和麦克风权限 使用 n…