当前位置:首页 > 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' }
        ]
      }
    ]
  }
]

递归组件实现

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

vue实现多级导航目录

<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结合使用:

vue实现多级导航目录

// 在导航数据中添加路由配置
{
  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
    }
  }
})

性能优化

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

<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实现好评弹框

vue实现好评弹框

Vue 实现好评弹框的方法 使用 Vue 实现好评弹框可以通过组件化方式完成,结合动态数据绑定和事件处理。以下是具体实现步骤: 1. 创建弹框组件 新建一个 RatingDialog.vue 组件…

vue实现关键词轮播

vue实现关键词轮播

Vue 实现关键词轮播 基础实现方案 使用 Vue 的 v-for 和 setInterval 实现基础轮播效果: <template> <div class="keywor…

vue中登陆实现逻辑

vue中登陆实现逻辑

Vue 中登录实现逻辑 前端实现逻辑 表单验证 使用 Vue 的表单验证库(如 VeeValidate)或自定义验证规则,确保用户输入的账号和密码符合要求。例如,检查邮箱格式、密码长度等。 发送登录…

vue实现上移下移插件

vue实现上移下移插件

实现上移下移功能的 Vue 插件 在 Vue 中实现列表项的上移和下移功能,可以通过自定义指令或组件封装的方式完成。以下是两种常见实现方式: 基于数组操作的通用方法 通过操作数组索引实现元素位置交…

vue实现a4打印模板

vue实现a4打印模板

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

vue优秀实现

vue优秀实现

Vue.js 优秀实现方法 响应式数据管理 使用 Vue 的 ref 和 reactive 处理基础类型和对象类型数据,结合 computed 计算属性优化渲染性能。对于复杂状态,推荐 Pinia 替…