当前位置:首页 > VUE

vue实现级联菜单

2026-03-29 15:42:04VUE

实现级联菜单的基本思路

级联菜单通常指多级联动的下拉选择器,例如省市区选择。Vue 中可通过组件递归或动态数据绑定实现。

使用递归组件实现

递归组件适合处理不确定层级的级联数据。定义一个子组件,内部调用自身渲染下一级菜单。

<template>
  <div>
    <select v-model="selectedValue" @change="handleChange">
      <option value="">请选择</option>
      <option v-for="item in options" :key="item.value" :value="item.value">
        {{ item.label }}
      </option>
    </select>
    <Cascader 
      v-if="selectedValue && children" 
      :options="children" 
      @change="emitChange"
    />
  </div>
</template>

<script>
export default {
  name: 'Cascader',
  props: {
    options: Array
  },
  data() {
    return {
      selectedValue: '',
      children: []
    }
  },
  methods: {
    handleChange() {
      const selected = this.options.find(item => item.value === this.selectedValue)
      this.children = selected?.children || []
      this.emitChange()
    },
    emitChange() {
      this.$emit('change', this.selectedValue)
    }
  }
}
</script>

使用动态数据绑定实现

通过监听选择变化动态加载下一级数据,适合层级固定的场景。

<template>
  <div>
    <select v-model="level1" @change="loadLevel2">
      <option value="">请选择省份</option>
      <option v-for="province in provinces" :key="province.id" :value="province.id">
        {{ province.name }}
      </option>
    </select>

    <select v-model="level2" @change="loadLevel3" :disabled="!level1">
      <option value="">请选择城市</option>
      <option v-for="city in cities" :key="city.id" :value="city.id">
        {{ city.name }}
      </option>
    </select>

    <select v-model="level3" :disabled="!level2">
      <option value="">请选择区县</option>
      <option v-for="district in districts" :key="district.id" :value="district.id">
        {{ district.name }}
      </option>
    </select>
  </div>
</template>

<script>
export default {
  data() {
    return {
      level1: '',
      level2: '',
      level3: '',
      provinces: [],
      cities: [],
      districts: []
    }
  },
  methods: {
    loadLevel2() {
      this.cities = this.getCitiesByProvince(this.level1)
      this.level2 = ''
      this.level3 = ''
    },
    loadLevel3() {
      this.districts = this.getDistrictsByCity(this.level2)
      this.level3 = ''
    }
  }
}
</script>

使用第三方组件库

Element UI 和 Ant Design Vue 等库提供现成的级联选择器组件。

Element UI 示例

<template>
  <el-cascader
    v-model="selectedOptions"
    :options="options"
    @change="handleChange"
  />
</template>

<script>
export default {
  data() {
    return {
      selectedOptions: [],
      options: [
        {
          value: 'zhejiang',
          label: '浙江',
          children: [
            {
              value: 'hangzhou',
              label: '杭州'
            }
          ]
        }
      ]
    }
  }
}
</script>

Ant Design Vue 示例

<template>
  <a-cascader
    v-model="value"
    :options="options"
    placeholder="请选择"
    @change="onChange"
  />
</template>

关键注意事项

数据格式需保持一致,通常采用树形结构:

[
  {
    value: 'parent1',
    label: 'Parent 1',
    children: [
      { value: 'child1', label: 'Child 1' }
    ]
  }
]

异步加载数据时需处理加载状态:

vue实现级联菜单

methods: {
  loadData(selectedOptions) {
    const targetOption = selectedOptions[selectedOptions.length - 1]
    targetOption.loading = true
    fetchData(targetOption.value).then(data => {
      targetOption.loading = false
      targetOption.children = data
    })
  }
}

通过以上方法可实现不同复杂度的级联菜单,根据项目需求选择合适方案。

标签: 菜单级联
分享给朋友:

相关文章

css制作菜单

css制作菜单

水平菜单制作 使用display: inline-block或flexbox布局创建水平菜单。设置list-style: none移除默认列表样式,添加padding和margin调整间距。 <…

vue 实现菜单下拉

vue 实现菜单下拉

Vue 实现菜单下拉的方法 使用 v-show 或 v-if 控制显示 通过 Vue 的指令 v-show 或 v-if 可以轻松控制下拉菜单的显示与隐藏。v-show 通过 CSS 的 displa…

vue实现菜单关闭

vue实现菜单关闭

Vue 实现菜单关闭功能 在 Vue 中实现菜单关闭功能可以通过多种方式完成,以下是几种常见的方法: 使用 v-if 或 v-show 控制显示 通过数据绑定控制菜单的显示与隐藏。v-if 会完全移…

vue级联选择怎么实现

vue级联选择怎么实现

实现Vue级联选择的方法 使用Element UI的Cascader组件 安装Element UI库后,可以直接使用el-cascader组件实现级联选择功能。需要准备嵌套结构的数据源,并通过prop…

vue实现左右菜单联动

vue实现左右菜单联动

实现思路 通过监听左侧菜单的点击事件,动态更新右侧菜单的内容。可以使用Vue的响应式数据绑定和事件机制来实现联动效果。 基础结构设计 在Vue组件中定义两个数据属性分别存储左右菜单的内容: dat…

Vue实现地址级联

Vue实现地址级联

Vue实现地址级联的方法 地址级联通常指省、市、区三级联动选择,以下是几种常见的实现方式: 使用Element UI的Cascader组件 安装Element UI后,直接使用el-cascader…