当前位置:首页 > 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. 移动端使用时要注意交互体验,可以考虑使用弹窗式选择器

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

相关文章

vue实现左右菜单联动实现

vue实现左右菜单联动实现

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

vue实现折叠菜单

vue实现折叠菜单

实现折叠菜单的基本思路 在Vue中实现折叠菜单通常涉及使用组件化开发,结合状态管理控制菜单的展开与折叠。核心是通过v-show或v-if动态切换子菜单的显示状态,并通过事件触发(如点击)改变状态。…

uniapp 长按菜单

uniapp 长按菜单

实现长按菜单的方法 在UniApp中实现长按菜单功能,可以通过以下几种方式完成,具体取决于平台和需求。 使用@longpress事件绑定 在模板中为元素添加@longpress事件监听,触发后显示自…

vue实现菜单缩放

vue实现菜单缩放

实现思路 通过 Vue 的响应式数据和 CSS 过渡效果,结合动态绑定 class 或 style 来实现菜单的缩放功能。核心是利用 v-bind:class 或 v-bind:style 控制菜单宽…

vue实现菜单效果

vue实现菜单效果

Vue实现菜单效果的方法 基础菜单实现 使用Vue的v-for指令和v-show/v-if可以快速实现基础菜单。通过数据驱动的方式渲染菜单项,结合事件处理实现交互。 <template>…

vue实现树形菜单

vue实现树形菜单

Vue 实现树形菜单的方法 递归组件实现 使用 Vue 的递归组件特性可以轻松实现树形菜单。定义一个组件,该组件在其模板中调用自身,适用于嵌套数据。 <template> <u…