当前位置:首页 > VUE

vue 实现级联

2026-01-12 18:02:45VUE

Vue 实现级联选择

级联选择(Cascader)是一种常见的前端交互组件,通常用于多层级数据的选择(如省市区选择)。以下是基于 Vue 2 和 Vue 3 的实现方法。

使用 Element UI(Vue 2)

Element UI 提供了成熟的 el-cascader 组件,适合快速实现级联选择。

安装 Element UI:

npm install element-ui

示例代码:

<template>
  <el-cascader
    v-model="selectedOptions"
    :options="options"
    :props="{ expandTrigger: 'hover' }"
    @change="handleChange"
  ></el-cascader>
</template>

<script>
export default {
  data() {
    return {
      selectedOptions: [],
      options: [
        {
          value: 'jiangsu',
          label: '江苏',
          children: [
            { value: 'nanjing', label: '南京' },
            { value: 'suzhou', label: '苏州' }
          ]
        },
        {
          value: 'zhejiang',
          label: '浙江',
          children: [
            { value: 'hangzhou', label: '杭州' },
            { value: 'ningbo', label: '宁波' }
          ]
        }
      ]
    };
  },
  methods: {
    handleChange(value) {
      console.log(value);
    }
  }
};
</script>

使用 Ant Design Vue(Vue 3)

Ant Design Vue 的 a-cascader 组件支持 Vue 3,功能类似。

vue 实现级联

安装 Ant Design Vue:

npm install ant-design-vue@next

示例代码:

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

<script>
import { ref } from 'vue';
export default {
  setup() {
    const selectedOptions = ref([]);
    const options = [
      {
        value: 'guangdong',
        label: '广东',
        children: [
          { value: 'guangzhou', label: '广州' },
          { value: 'shenzhen', label: '深圳' }
        ]
      }
    ];

    const handleChange = (value) => {
      console.log(value);
    };

    return { selectedOptions, options, handleChange };
  }
};
</script>

自定义实现级联选择

如果需要完全自定义逻辑,可以通过递归组件实现。

vue 实现级联

  1. 定义数据格式:

    const treeData = [
    {
     id: 1,
     name: '一级',
     children: [
       { id: 2, name: '二级', children: [{ id: 3, name: '三级' }] }
     ]
    }
    ];
  2. 创建递归组件:

    
    <template>
    <div>
     <select v-model="selectedLevel1" @change="loadLevel2">
       <option v-for="item in level1" :key="item.id" :value="item.id">
         {{ item.name }}
       </option>
     </select>
     <select v-model="selectedLevel2" @change="loadLevel3" v-if="level2.length">
       <option v-for="item in level2" :key="item.id" :value="item.id">
         {{ item.name }}
       </option>
     </select>
     <select v-model="selectedLevel3" v-if="level3.length">
       <option v-for="item in level3" :key="item.id" :value="item.id">
         {{ item.name }}
       </option>
     </select>
    </div>
    </template>
export default { data() { return { level1: treeData, level2: [], level3: [], selectedLevel1: null, selectedLevel2: null, selectedLevel3: null }; }, methods: { loadLevel2() { this.level2 = this.level1.find(item => item.id === this.selectedLevel1)?.children || []; this.level3 = []; }, loadLevel3() { this.level3 = this.level2.find(item => item.id === this.selectedLevel2)?.children || []; } } }; ```

动态加载数据

对于大数据量场景,可以通过接口动态加载子级数据(以 Element UI 为例):

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

<script>
export default {
  data() {
    return {
      selectedOptions: [],
      props: {
        lazy: true,
        async lazyLoad(node, resolve) {
          const { level } = node;
          const result = await fetch(`/api/regions?parentId=${node.value || ''}`);
          resolve(result.data.map(item => ({
            value: item.id,
            label: item.name,
            leaf: level >= 2
          })));
        }
      }
    };
  }
};
</script>

注意事项

  • 数据格式需保持一致,通常为 valuelabelchildren 结构。
  • 动态加载时注意接口性能,建议添加防抖。
  • 移动端场景可考虑使用 van-cascader(Vant 组件库)。

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

相关文章

vue组件的实现

vue组件的实现

Vue 组件的实现方式 Vue 组件可以通过多种方式实现,以下是常见的几种方法: 单文件组件 (SFC) 使用 .vue 文件,包含模板、脚本和样式三部分: <template>…

vue表格实现教学

vue表格实现教学

Vue 表格实现方法 使用原生HTML表格 在Vue模板中直接使用HTML的<table>标签,结合v-for动态渲染数据: <template> <table&g…

vue表单实现搜索

vue表单实现搜索

实现Vue表单搜索功能 在Vue中实现表单搜索功能通常涉及表单绑定、事件处理和搜索逻辑。以下是具体实现方法: 数据绑定与表单结构 使用v-model实现表单与Vue数据的双向绑定: <t…

课程表vue实现

课程表vue实现

实现课程表的Vue组件 创建课程表需要设计数据结构、布局和交互逻辑。以下是一个基于Vue 3的实现方案: 数据结构设计 const timetableData = ref([ { ti…

vue实现点击页面切换

vue实现点击页面切换

实现点击页面切换功能 在Vue中实现点击页面切换功能,可以通过路由跳转或组件动态渲染两种方式完成。以下是具体实现方法: 使用Vue Router实现页面跳转 安装Vue Router后,在项目中…

vue实现页面截屏

vue实现页面截屏

使用html2canvas库实现截屏 html2canvas是一个流行的JavaScript库,可以将DOM元素转换为Canvas图像。在Vue项目中安装html2canvas: npm inst…