Vue 3 中应封装基于 Element Plus el-cascader 的省市区级联组件,配合 element-china-area-data 数据及格式转换,支持 code/name 双值类型、多格式数据解析、异步加载及双向绑定回显。

在 Vue 3 中封装省市区级联选择组件,核心是用好 Element Plus 的 el-cascader(或 Vant/Ant Design 等对应组件),再配合标准化数据结构和响应式绑定逻辑。不建议手动写三层 el-select 堆叠——维护成本高、联动易出错、回显难处理。
用 el-cascader 封装最简可行方案
直接基于 Element Plus 提供的级联选择器封装,能复用其展开逻辑、键盘导航、搜索过滤等能力:
- 安装依赖:
npm install element-plus element-china-area-data - 引入中国行政区划数据(如
regionData或regionDataPlus),并做一次格式转换,适配el-cascader要求的{ value, label, children }结构 - 组件内用
v-model绑定一个数组(如['110000', '110100', '110101']),值类型可配置为 code 或 name - 通过
props暴露disabled、clearable、placeholder等常用配置项,避免重复透传
支持双向绑定与编辑回显的关键点
表单场景下,必须支持初始化时“回显”已保存的地址(比如编辑用户资料):
- 接收外部传入的
v-model:value,类型可以是字符串(如"北京市/朝阳区/建国路")、数组(如['北京', '朝阳区', '建国路'])或编码数组(如['110000', '110105', '110105001']) - 内部统一转为标准路径数组,用于
el-cascader的v-model - 监听
@change和@blur,通过emit('update:value')向外同步最新值;同时提供@finish事件返回完整对象(含省市区名称、编码等) - 注意:若后端返回的是扁平字段(如
provinceName,cityName,districtName),可在父组件组装后再传入
数据格式灵活适配的处理方式
不同项目数据源不一致,不能硬编码一种结构:
创建 Flask + Vue.js 全栈项目,采用单端口架构、uv 依赖管理、结构化日志和生产级前端设计。当用户要求以下操作时触发:创建新的 Flask+Vue 项目、搭建 Web 应用、构建全栈 Python+Vue 应用、初始化 Flask Web 项目、设置单端口 Flask 前后端项目。触发词:新建项目、创建项目、搭建项目、Flask项目、Vue项目。
立即学习“前端免费学习笔记(深入)”;
- 内置多种解析函数:支持
element-china-area-data的四种格式(regionData/regionDataPlus/regionDataSimple/regionDataTree) - 允许传入自定义
dataHandler函数,把任意原始数据(如后端接口返回的树形 JSON、扁平列表带 parent_id 字段)转为目标结构 - 对异步加载场景(如按需请求市/区),保留
lazy+load属性支持,不强制要求一次性加载全部数据
封装后组件的典型调用方式
使用非常轻量,符合 Vue 表单组件直觉:
<RegionSelector v-model="form.addressCode" value-type="code" placeholder="请选择收货地址" clearable />
父组件只需声明 form.addressCode = ['110000', '110100', '110101'],组件自动展开到对应层级并显示文字;修改后也自动同步该数组。

















