当前位置:首页 > VUE

vue 实现级联

2026-01-07 17:40:45VUE

Vue 实现级联选择器

级联选择器(Cascader)常用于省市区选择、分类选择等场景。Vue 中可以通过 Element UI、Ant Design Vue 等 UI 库实现,也可以手动封装。

使用 Element UI 实现

Element UI 提供了 el-cascader 组件,支持动态加载、多选等功能。

安装 Element UI:

npm install element-ui

基础用法:

<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: '西湖区' }
              ]
            }
          ]
        }
      ]
    }
  },
  methods: {
    handleChange(value) {
      console.log(value)
    }
  }
}
</script>

使用 Ant Design Vue 实现

Ant Design Vue 的 a-cascader 组件同样支持级联选择。

安装 Ant Design Vue:

npm install ant-design-vue

基础用法:

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

<script>
export default {
  data() {
    return {
      selectedOptions: [],
      options: [
        {
          value: 'zhejiang',
          label: '浙江省',
          children: [
            {
              value: 'hangzhou',
              label: '杭州市',
              children: [
                { value: 'xihu', label: '西湖区' }
              ]
            }
          ]
        }
      ]
    }
  },
  methods: {
    handleChange(value) {
      console.log(value)
    }
  }
}
</script>

手动封装级联选择器

如果需要自定义级联选择器,可以通过递归组件实现。

定义递归组件:

<template>
  <div>
    <select v-model="selectedValue" @change="handleSelectChange">
      <option v-for="item in options" :key="item.value" :value="item.value">
        {{ item.label }}
      </option>
    </select>
    <Cascader
      v-if="selectedValue && hasChildren"
      :options="childrenOptions"
      @change="handleChildChange"
    />
  </div>
</template>

<script>
export default {
  name: 'Cascader',
  props: {
    options: Array
  },
  data() {
    return {
      selectedValue: ''
    }
  },
  computed: {
    hasChildren() {
      const selected = this.options.find(item => item.value === this.selectedValue)
      return selected && selected.children
    },
    childrenOptions() {
      const selected = this.options.find(item => item.value === this.selectedValue)
      return selected ? selected.children : []
    }
  },
  methods: {
    handleSelectChange() {
      this.$emit('change', [this.selectedValue])
    },
    handleChildChange(childValues) {
      this.$emit('change', [this.selectedValue, ...childValues])
    }
  }
}
</script>

调用自定义组件:

<template>
  <Cascader :options="options" @change="handleChange" />
</template>

<script>
import Cascader from './Cascader.vue'

export default {
  components: { Cascader },
  data() {
    return {
      options: [
        {
          value: 'zhejiang',
          label: '浙江省',
          children: [
            {
              value: 'hangzhou',
              label: '杭州市',
              children: [
                { value: 'xihu', label: '西湖区' }
              ]
            }
          ]
        }
      ]
    }
  },
  methods: {
    handleChange(values) {
      console.log(values)
    }
  }
}
</script>

动态加载数据

对于数据量大的场景,可以动态加载子选项。

Element UI 动态加载示例:

<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(() => ({
              value: Math.random(),
              label: `选项 ${level + 1}`,
              leaf: level >= 2
            }))
            resolve(nodes)
          }, 1000)
        }
      }
    }
  }
}
</script>

注意事项

  • 数据结构需要包含 valuelabel 字段,子选项放在 children
  • 动态加载时注意性能优化,避免频繁请求
  • 多选场景需要特殊处理选中状态
  • 移动端适配可能需要额外样式调整

vue 实现级联

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

相关文章

vue实现弹窗

vue实现弹窗

Vue 实现弹窗的常见方法 使用组件化方式封装弹窗 创建一个独立的弹窗组件(如 Modal.vue),通过 v-if 或 v-show 控制显示隐藏: <template> <…

vue 实现pdf

vue 实现pdf

在Vue中实现PDF功能 在Vue项目中实现PDF功能通常涉及PDF生成、预览或下载。以下是几种常见实现方式: 使用vue-pdf库预览PDF 安装依赖: npm install vue-pdf…

vue实现input

vue实现input

Vue 实现 Input 输入框的方法 基本双向绑定 使用 v-model 指令实现双向数据绑定,适用于大多数表单场景: <template> <input v-model="…

vue页面实现

vue页面实现

Vue 页面实现方法 创建 Vue 组件 使用 Vue 单文件组件(SFC)方式创建页面,文件扩展名为 .vue。一个基本的 Vue 组件包含三个部分:模板(template)、脚本(script)和…

vue jwt实现

vue jwt实现

Vue JWT 实现方法 安装依赖 确保项目中安装了 jsonwebtoken(后端)和 axios(前端)。若使用 Vue 3,可搭配 vue-router 和 pinia(或 vuex)管理状态。…

vue实现增加

vue实现增加

实现 Vue 中的新增功能 在 Vue 中实现新增功能通常涉及数据绑定、表单处理和状态管理。以下是几种常见的实现方式: 数据绑定与列表渲染 通过 v-model 绑定表单输入,使用数组的 pu…