当前位置:首页 > VUE

vue实现级联菜单

2026-02-17 15:40:46VUE

Vue 实现级联菜单的方法

使用 Element UI 的 Cascader 组件

安装 Element UI:

npm install element-ui

在 Vue 项目中引入 Cascader 组件:

vue实现级联菜单

import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';

Vue.use(ElementUI);

使用 Cascader 组件:

vue实现级联菜单

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

<script>
export default {
  data() {
    return {
      selectedOptions: [],
      options: [
        {
          value: 'zhejiang',
          label: '浙江省',
          children: [
            {
              value: 'hangzhou',
              label: '杭州市',
              children: [
                { value: 'xihu', label: '西湖区' },
                { value: 'xiasha', label: '下沙区' }
              ]
            }
          ]
        }
      ]
    };
  },
  methods: {
    handleChange(value) {
      console.log(value);
    }
  }
};
</script>

自定义级联菜单

通过递归组件实现自定义级联菜单:

<template>
  <div>
    <select v-model="selectedProvince" @change="handleProvinceChange">
      <option value="">请选择省份</option>
      <option v-for="province in provinces" :value="province.id">
        {{ province.name }}
      </option>
    </select>
    <select v-model="selectedCity" @change="handleCityChange" v-if="cities.length">
      <option value="">请选择城市</option>
      <option v-for="city in cities" :value="city.id">
        {{ city.name }}
      </option>
    </select>
    <select v-model="selectedDistrict" v-if="districts.length">
      <option value="">请选择区县</option>
      <option v-for="district in districts" :value="district.id">
        {{ district.name }}
      </option>
    </select>
  </div>
</template>

<script>
export default {
  data() {
    return {
      provinces: [
        { id: 1, name: '浙江省' },
        { id: 2, name: '江苏省' }
      ],
      cities: [],
      districts: [],
      selectedProvince: '',
      selectedCity: '',
      selectedDistrict: ''
    };
  },
  methods: {
    handleProvinceChange() {
      this.cities = this.getCitiesByProvince(this.selectedProvince);
      this.selectedCity = '';
      this.districts = [];
    },
    handleCityChange() {
      this.districts = this.getDistrictsByCity(this.selectedCity);
      this.selectedDistrict = '';
    },
    getCitiesByProvince(provinceId) {
      // 模拟API请求
      const data = {
        1: [
          { id: 101, name: '杭州市' },
          { id: 102, name: '宁波市' }
        ],
        2: [
          { id: 201, name: '南京市' },
          { id: 202, name: '苏州市' }
        ]
      };
      return data[provinceId] || [];
    },
    getDistrictsByCity(cityId) {
      // 模拟API请求
      const data = {
        101: [
          { id: 10101, name: '西湖区' },
          { id: 10102, name: '余杭区' }
        ],
        102: [
          { id: 10201, name: '海曙区' },
          { id: 10202, name: '鄞州区' }
        ]
      };
      return data[cityId] || [];
    }
  }
};
</script>

使用 Vue 动态加载数据

实现异步加载级联数据:

<template>
  <el-cascader
    v-model="selectedOptions"
    :props="props"
  ></el-cascader>
</template>

<script>
export default {
  data() {
    return {
      selectedOptions: [],
      props: {
        lazy: true,
        lazyLoad(node, resolve) {
          const { level } = node;
          setTimeout(() => {
            const nodes = Array.from({ length: level + 1 })
              .map(item => ({
                value: Math.random(),
                label: `选项${Math.random().toString(36).substr(2, 5)}`,
                leaf: level >= 2
              }));
            resolve(nodes);
          }, 1000);
        }
      }
    };
  }
};
</script>

注意事项

  1. 数据格式要符合组件要求,通常需要包含 value、label 和 children 字段
  2. 对于大数据量考虑使用懒加载方式
  3. 多级联动时要注意数据清理,切换上级选项时应清空下级选项
  4. 移动端使用时要注意交互体验,可以考虑使用弹窗式选择器

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

相关文章

css制作菜单

css制作菜单

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

vue实现左右菜单联动实现

vue实现左右菜单联动实现

Vue 实现左右菜单联动 数据绑定与状态管理 在 Vue 中实现左右菜单联动,核心是通过共享状态或事件通信实现数据同步。可以通过 Vuex 或组件间的 props/emit 机制管理联动状态。 //…

vue实现联动菜单

vue实现联动菜单

实现联动菜单的基本思路 在Vue中实现联动菜单的核心在于数据绑定和事件监听。通过v-model绑定下拉菜单的值,利用watch或computed监听变化,动态更新下一级菜单的选项。 基础实现方法 创…

vue 实现菜单下拉

vue 实现菜单下拉

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

vue实现抽屉菜单

vue实现抽屉菜单

Vue 实现抽屉菜单 使用 Vue 过渡和 CSS 实现 通过 Vue 的过渡组件和 CSS 实现抽屉菜单的动画效果。定义一个布尔值控制抽屉的显示和隐藏,利用 CSS 过渡效果实现平滑的滑动。 &l…

vue实现菜单关闭

vue实现菜单关闭

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