当前位置:首页 > 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实现xss

vue实现xss

XSS 攻击简介 XSS(跨站脚本攻击)是一种常见的安全漏洞,攻击者通过注入恶意脚本到网页中,当其他用户访问该页面时,脚本会在其浏览器中执行,可能导致数据泄露或会话劫持。 Vue 中的 XSS…

vue 实现过滤

vue 实现过滤

Vue 实现过滤的方法 在 Vue 中实现过滤功能可以通过多种方式完成,包括使用计算属性、自定义过滤器、第三方库等。以下是几种常见的实现方法: 使用计算属性进行过滤 计算属性是 Vue 中最常用的过…

vue实现erp

vue实现erp

Vue实现ERP系统的关键步骤 技术选型与架构设计 采用Vue 3 + TypeScript构建前端,搭配Pinia状态管理,Element Plus或Ant Design Vue作为UI框架。后端可…

vue实现日历

vue实现日历

Vue 实现日历的基本方法 使用 Vue 实现日历可以通过自定义组件或借助第三方库完成。以下是两种常见实现方式: 自定义日历组件 创建基于 Vue 的日历组件需要处理日期计算和渲染逻辑。核心是生成当…

vue实现通讯

vue实现通讯

Vue 组件通讯方法 父子组件通讯 父组件向子组件传递数据通过 props,子组件向父组件传递数据通过 $emit 事件。 父组件模板: <child-component :message=…

vue实现刷卡

vue实现刷卡

Vue 实现刷卡效果 在 Vue 中实现刷卡效果可以通过 CSS 动画和 Vue 的过渡系统结合完成。以下是一种常见的实现方式: 基础实现方法 安装 Vue 过渡依赖(如果尚未安装): npm i…