当前位置:首页 > 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 组件同样支持级联选择。

vue 实现级联

安装 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>

手动封装级联选择器

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

vue 实现级联

定义递归组件:

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

vue按钮实现截屏

vue按钮实现截屏

Vue 按钮实现截屏的方法 在 Vue 项目中实现截屏功能可以通过多种方式完成,以下是几种常见的方法: 使用 html2canvas 库 安装 html2canvas 库: npm insta…

vue实现全局遮罩层

vue实现全局遮罩层

实现全局遮罩层的方法 在Vue中实现全局遮罩层可以通过多种方式完成,以下是几种常见的实现方法: 使用Vue组件创建遮罩层 创建一个遮罩层组件,通过全局注册或动态挂载的方式实现全局调用。以下是一个简单…

vue自己实现下拉导航

vue自己实现下拉导航

实现下拉导航的基本思路 在Vue中实现下拉导航,可以通过结合Vue的响应式数据和事件绑定特性来完成。主要思路是利用v-show或v-if控制下拉菜单的显示与隐藏,并通过鼠标事件或点击事件触发状态变化。…

vue实现点击旋转轮盘

vue实现点击旋转轮盘

实现点击旋转轮盘效果 在Vue中实现点击旋转轮盘效果,可以通过CSS动画和Vue的数据绑定结合完成。以下是一个完整的实现方案: 准备工作 需要安装Vue.js环境,可以通过CDN引入或使用Vue…

vue实现字母添加排序

vue实现字母添加排序

实现字母添加排序的方法 在Vue中实现字母添加排序功能,可以通过以下步骤完成: 创建Vue实例并定义数据 new Vue({ el: '#app', data: { lette…