当前位置:首页 > 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 动态加载示例:

vue 实现级联

<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 中实现网页切换通常可以通过以下几种方式完成,具体取决于项目需求和路由管理方式。 使用 Vue Router Vue Router 是 Vue.js 官方提供的…

vue实现试卷

vue实现试卷

Vue实现试卷系统的基本思路 使用Vue.js构建试卷系统需要结合组件化开发、状态管理和后端数据交互。核心功能包括题目展示、答题逻辑、计时器和提交答案。 核心功能模块划分 试卷组件结构 试卷容器组…

vue 实现工具

vue 实现工具

Vue 实现工具的方法 使用 Vue 实现工具功能可以通过多种方式完成,具体取决于工具的类型和需求。以下是几种常见的方法: 组件化实现 创建一个独立的 Vue 组件来封装工具功能。例如,实现一个计…

利用vue 实现

利用vue 实现

以下是利用 Vue 实现常见功能的几种方法,分为不同场景和技术要点: 数据绑定与响应式更新 Vue 的核心特性是数据绑定,通过 v-model 实现双向绑定: <template>…

vue nexttrick实现

vue nexttrick实现

Vue 中 nextTick 的实现原理 nextTick 是 Vue 提供的一个异步方法,用于在下次 DOM 更新循环结束之后执行延迟回调。它利用了 JavaScript 的事件循环机制,确保回调在…

vue前端实现

vue前端实现

Vue 前端实现基础步骤 安装 Vue.js 和相关依赖 通过 npm 或 yarn 安装 Vue.js,建议使用 Vue CLI 快速搭建项目。运行命令 npm install -g @vue/cl…