当前位置:首页 > VUE

vue实现级联选择

2026-02-18 15:06:00VUE

Vue 实现级联选择的方法

使用 Element UI 的 Cascader 组件

Element UI 提供了一个现成的级联选择器组件,适用于大多数场景。安装 Element UI 后,可以直接使用 el-cascader 组件。

vue实现级联选择

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

<script>
export default {
  data() {
    return {
      selectedOptions: [],
      options: [
        {
          value: 'province1',
          label: 'Province 1',
          children: [
            {
              value: 'city1',
              label: 'City 1',
              children: [
                {
                  value: 'district1',
                  label: 'District 1'
                }
              ]
            }
          ]
        }
      ],
      props: {
        expandTrigger: 'hover'
      }
    };
  },
  methods: {
    handleChange(value) {
      console.log(value);
    }
  }
};
</script>

使用 Ant Design Vue 的 Cascader 组件

Ant Design Vue 也提供了级联选择器组件,功能与 Element UI 类似。

vue实现级联选择

<template>
  <a-cascader
    v-model:value="selectedOptions"
    :options="options"
    placeholder="Please select"
    @change="handleChange"
  />
</template>

<script>
export default {
  data() {
    return {
      selectedOptions: [],
      options: [
        {
          value: 'province1',
          label: 'Province 1',
          children: [
            {
              value: 'city1',
              label: 'City 1',
              children: [
                {
                  value: 'district1',
                  label: 'District 1'
                }
              ]
            }
          ]
        }
      ]
    };
  },
  methods: {
    handleChange(value) {
      console.log(value);
    }
  }
};
</script>

自定义级联选择器

如果需要更灵活的级联选择器,可以手动实现。以下是一个简单的自定义级联选择器示例。

<template>
  <div>
    <select v-model="selectedProvince" @change="loadCities">
      <option v-for="province in provinces" :value="province.value">
        {{ province.label }}
      </option>
    </select>
    <select v-model="selectedCity" @change="loadDistricts" v-if="cities.length">
      <option v-for="city in cities" :value="city.value">
        {{ city.label }}
      </option>
    </select>
    <select v-model="selectedDistrict" v-if="districts.length">
      <option v-for="district in districts" :value="district.value">
        {{ district.label }}
      </option>
    </select>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedProvince: '',
      selectedCity: '',
      selectedDistrict: '',
      provinces: [
        { value: 'province1', label: 'Province 1' }
      ],
      cities: [],
      districts: []
    };
  },
  methods: {
    loadCities() {
      this.cities = [
        { value: 'city1', label: 'City 1' }
      ];
      this.selectedCity = '';
      this.selectedDistrict = '';
      this.districts = [];
    },
    loadDistricts() {
      this.districts = [
        { value: 'district1', label: 'District 1' }
      ];
      this.selectedDistrict = '';
    }
  }
};
</script>

动态加载数据

对于数据量较大的场景,可以使用动态加载数据的方式,避免一次性加载所有数据。

<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((_, i) => ({
                value: `${level}-${i}`,
                label: `Option ${level}-${i}`,
                leaf: level >= 2
              }));
            resolve(nodes);
          }, 1000);
        }
      }
    };
  }
};
</script>

注意事项

  • 数据格式必须符合组件要求,通常是一个嵌套的数组结构。
  • 动态加载数据时,注意处理加载状态和错误情况。
  • 如果需要更复杂的功能,可以结合后端 API 动态获取数据。

标签: 级联vue
分享给朋友:

相关文章

vue广告实现

vue广告实现

Vue 广告实现方法 在 Vue 项目中实现广告功能可以通过多种方式完成,具体取决于广告类型和需求。以下是几种常见的实现方法: 使用第三方广告平台 许多广告平台如 Google AdSense、百…

vue实现队列

vue实现队列

Vue 实现队列功能 在 Vue 中实现队列功能可以通过多种方式完成,以下是几种常见的方法: 使用数组模拟队列 队列遵循先进先出(FIFO)原则,可以用数组的 push 和 shift 方法模拟入队…

vue实现翻页

vue实现翻页

Vue实现翻页功能 在Vue中实现翻页功能通常需要结合分页组件和数据请求逻辑。以下是常见的实现方法: 使用Element UI分页组件 安装Element UI后,可以直接使用其分页组件: <…

vue实现微云

vue实现微云

Vue 实现微云功能 使用 Vue 实现类似微云的网盘功能需要结合前端框架、后端存储及文件处理技术。以下是关键实现步骤和代码示例: 前端框架搭建 使用 Vue CLI 创建项目基础结构,安装必要依赖…

vue中实现轮播

vue中实现轮播

Vue中实现轮播的方法 使用第三方库(如Swiper) 安装Swiper库: npm install swiper 在Vue组件中引入并使用: <template> <div…

vue实现的聊天

vue实现的聊天

Vue 实现的聊天应用 使用 Vue 实现聊天应用可以通过 Vue 的响应式特性和组件化开发来构建高效、可维护的前端界面。以下是一个基于 Vue 3 的聊天应用实现方案。 项目初始化 创建 Vue…