当前位置:首页 > 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实现登录功能需要结合前端框架和后端API交互。以下是一个典型的实现方案: 安装必要依赖 确保项目已安装axios用于HTTP请求: npm install a…

vue实现文字播放栏

vue实现文字播放栏

Vue 实现文字播放栏(跑马灯效果) 方法一:使用 CSS 动画 + Vue 数据绑定 通过 CSS 的 @keyframes 实现动画效果,结合 Vue 的动态数据绑定控制内容。 <tem…

vue前端实现打印功能

vue前端实现打印功能

使用Vue实现前端打印功能 在Vue项目中实现打印功能可以通过多种方式完成,以下是几种常见的方法: 使用window.print()方法 这是最简单的打印方式,直接调用浏览器的打印功能。 meth…

vue实现下拉层级

vue实现下拉层级

Vue实现下拉层级菜单 使用Vue实现下拉层级菜单可以通过递归组件或动态渲染的方式完成。以下是两种常见实现方法: 递归组件实现 创建一个递归组件处理多级菜单结构: <template…

vue实现视频会议

vue实现视频会议

使用 Vue 实现视频会议 技术选型 Vue.js 作为前端框架,结合 WebRTC 技术实现实时音视频通信。常用的库包括: peerjs:简化 WebRTC 的点对点连接。 socket.io:…

vue 实现在线预览

vue 实现在线预览

Vue 实现在线预览的常见方法 使用 iframe 嵌入 通过 iframe 标签可以嵌入多种类型的文件,如 PDF、图片、网页等。需要确保文件地址可访问。 <template> &…