当前位置:首页 > 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-if/v-show) 使用 Vue 的指令根据条件显示不同内容…

简易实现vue

简易实现vue

简易 Vue 实现思路 核心是数据劫持结合发布-订阅模式,通过 Object.defineProperty 或 Proxy 监听数据变化,触发视图更新。 数据劫持实现 class Observer…

vue实现选择分类

vue实现选择分类

Vue 实现选择分类的方法 使用 v-model 绑定选择值 在 Vue 中可以通过 v-model 指令实现双向数据绑定,适用于下拉选择框(<select>)。以下是一个基本示例:…

vue单页面实现登录

vue单页面实现登录

实现登录功能的基本流程 在Vue单页面应用中实现登录功能,通常需要以下几个关键步骤: 创建登录表单组件 使用Vue的模板语法创建包含用户名和密码输入框的表单,并绑定数据到组件的data属性。 <…

vue实现安全免登录

vue实现安全免登录

Vue 实现安全免登录的方案 免登录功能通常通过持久化认证状态(如 Token)实现,但需兼顾安全性。以下是基于 Vue 的常见实现方案: 基于 Token 的免登录 登录成功后存储 Toke…

vue设计与实现 书

vue设计与实现 书

vue设计与实现 书 《Vue.js设计与实现》是一本深入探讨Vue.js框架内部原理和设计思想的书籍,适合希望深入理解Vue.js的开发者。以下是关于这本书的详细信息: 书籍内容 《Vue…