当前位置:首页 > VUE

vue实现多级导航目录

2026-01-21 01:24:18VUE

Vue 实现多级导航目录

数据结构设计

使用嵌套的树形结构存储导航数据,例如:

const menuData = [
  {
    title: '一级菜单1',
    children: [
      { title: '二级菜单1-1', path: '/path1' },
      { title: '二级菜单1-2', path: '/path2' }
    ]
  },
  {
    title: '一级菜单2',
    children: [
      { 
        title: '二级菜单2-1',
        children: [
          { title: '三级菜单2-1-1', path: '/path3' }
        ]
      }
    ]
  }
]

递归组件实现

创建可递归调用的菜单组件:

<template>
  <ul class="menu">
    <li v-for="item in data" :key="item.title">
      <div @click="toggle(item)">
        {{ item.title }}
        <span v-if="item.children">{{ isOpen(item) ? '-' : '+' }}</span>
      </div>
      <menu-item 
        v-if="item.children && isOpen(item)" 
        :data="item.children"
      />
    </li>
  </ul>
</template>

<script>
export default {
  name: 'MenuItem',
  props: ['data'],
  data() {
    return { openedItems: [] }
  },
  methods: {
    toggle(item) {
      const index = this.openedItems.indexOf(item)
      index === -1 
        ? this.openedItems.push(item) 
        : this.openedItems.splice(index, 1)
    },
    isOpen(item) {
      return this.openedItems.includes(item)
    }
  }
}
</script>

样式优化

添加基础交互样式:

.menu {
  list-style: none;
  padding-left: 20px;
}
.menu li {
  cursor: pointer;
  margin: 5px 0;
}
.menu li div {
  padding: 5px 10px;
  background: #f5f5f5;
  border-radius: 4px;
}
.menu li div:hover {
  background: #e0e0e0;
}

路由集成

与vue-router结合使用:

// 在导航数据中添加路由配置
{
  title: '用户管理',
  path: '/user',
  children: [
    { title: '用户列表', path: '/user/list' }
  ]
}

// 修改组件点击处理
methods: {
  navigate(item) {
    if (item.path) {
      this.$router.push(item.path)
    }
  }
}

状态管理方案

对于大型应用可考虑Vuex:

// store.js
export default new Vuex.Store({
  state: {
    menus: menuData,
    activeMenu: null
  },
  mutations: {
    setActiveMenu(state, menu) {
      state.activeMenu = menu
    }
  }
})

性能优化

对大型菜单数据使用虚拟滚动:

vue实现多级导航目录

<template>
  <RecycleScroller 
    :items="flattenedMenu"
    :item-size="50"
    key-field="id"
  >
    <template v-slot="{ item }">
      <div :style="{ paddingLeft: item.level * 20 + 'px' }">
        {{ item.title }}
      </div>
    </template>
  </RecycleScroller>
</template>

标签: 目录vue
分享给朋友:

相关文章

vue实现switch

vue实现switch

Vue 实现 Switch 开关组件 在 Vue 中实现 Switch 开关组件可以通过自定义组件或使用现有 UI 库完成。以下是几种常见实现方式: 自定义 Switch 组件 创建一个基础 Sw…

vue的实现

vue的实现

Vue 的实现原理 Vue 是一个渐进式 JavaScript 框架,其核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是 Vue 实现的主要技术细节。 响应式系统 Vue 的响…

vue observer实现

vue observer实现

Vue Observer 实现原理 Vue 的响应式系统核心是通过 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现的 Observer 模式。以下是关键实现细…

vue实现秒表

vue实现秒表

实现秒表功能 在Vue中实现秒表功能需要处理时间显示、开始、暂停和重置逻辑。以下是具体实现方式: 基础实现代码 <template> <div> <div&…

vue实现rgb调色

vue实现rgb调色

Vue实现RGB调色功能 实现思路 通过Vue的数据绑定和事件处理,动态调整RGB三个通道的值,实时更新显示颜色。 核心代码示例 <template> <div class=…

vscode实现vue高亮

vscode实现vue高亮

安装Vue官方扩展 在VSCode扩展商店中搜索并安装Volar,这是Vue团队推荐的官方插件,提供完整的Vue 3语言支持、语法高亮、智能提示等功能。安装后无需额外配置即可生效。 启用Volar的…