element级联地址选择器

一、实现过程总览

  1. 组件替换:将原有的输入框(el-input)替换为级联选择器(el-cascader),并配置基础属性。
  2. 数据适配:引入 JSON 地址数据,通过cascaderProps映射数据字段(如codelabelchildren)。
  3. 值转换逻辑:处理选中值(code数组)与显示值(地址字符串)的双向转换。
  4. 回显功能:编辑时将存储的地址字符串解析为级联选择器的选中状态。
  5. 表单集成:确保级联选择器与表单验证、提交逻辑无缝结合。

二、核心步骤与逻辑详解

1. 组件替换与基础配置
  • 模板修改
    将原el-input替换为el-cascader,绑定选中值cascaderValue和数据源areaList,并通过props配置数据映射
<el-form-item label="出差地址" prop="destination"><el-cascaderv-model="cascaderValue":options="areaList":props="cascaderProps"@change="handleCascaderChange"placeholder="请选择省/市/区"></el-cascader>
</el-form-item>
  • 数据映射配置
    data() {return {cascaderProps: {value: 'code',   // 唯一标识字段(对应JSON中的code)label: 'label',  // 显示名称字段(对应JSON中的label)children: 'children' // 子级字段(对应JSON中的children)},areaList: areaList // 引入的JSON地址数据};
    }
    
2. 数据引入与初始化
  • 静态数据引入

  • 将 JSON 地址数据保存为独立文件(如@/utils/area-data.js),并在组件中引入:
    import { areaList } from '@/utils/area-data';
    
  • 组件初始化
    created钩子中加载数据(若为动态接口需调用 API):
    created() {this.userId = this.$store.state.user.id;this.getList(); // 原有数据加载// 无需额外加载areaList,已作为静态数据引入
    }
    
3. 选中值与地址字符串的双向转换
  • 选中值转字符串(级联选择变化时)
    当用户选择地区时,将选中的code数组转换为label拼接的字符串(如 “河北 石家庄”):

    methods: {handleCascaderChange(values) {const selectedLabels = this.getCascaderLabels(values); // 根据code找labelthis.form.destination = selectedLabels.join(' '); // 用空格拼接,可自定义分隔符},// 递归查找code对应的labelgetCascaderLabels(codes) {return codes.map(code => this.findAreaLabel(code, this.areaList));},findAreaLabel(code, areas) {for (const area of areas) {if (area.code === code) return area.label;if (area.children) return this.findAreaLabel(code, area.children);}return '';}
    }
    
  • 字符串转回选中值(编辑回显时)
    从接口获取已有地址字符串(如 “河北 石家庄”),拆分为名称数组后递归查找对应的code数组:

    handleUpdate(row) {// 原有逻辑...if (row.destination) {const names = row.destination.split(' '); // 按分隔符拆分成数组this.cascaderValue = this.findCodesByNames(names, this.areaList); // 名称转code}
    },
    findCodesByNames(names, areas, index = 0) {if (index >= names.length) return [];for (const area of areas) {if (area.label === names[index]) {const code = [area.code];if (index < names.length - 1 && area.children) {return code.concat(this.findCodesByNames(names, area.children, index + 1));}return code;}}return [];
    }
    
4. 表单验证与提交
  • 验证规则
    确保destination字段在表单验证中必填,并依赖级联选择器的转换逻辑:
    rules: {destination: [{ required: true, message: "出差目的地不能为空", trigger: "blur" }]
    }
    
  • 提交逻辑
    在表单提交前,确保destination已正确赋值(避免级联选择器未触发change事件):
    submitForm() {this.$refs.form.validate(valid => {if (valid) {// 手动触发转换(如有必要)if (this.cascaderValue.length > 0 && !this.form.destination) {this.handleCascaderChange(this.cascaderValue);}// 调用接口提交数据(包含destination)}});
    }
    
5. 特殊情况处理
  • 直辖市 / 特别行政区
    如北京、上海等地区的children中存在同名label(如 “北京”),递归查找时会自动匹配二级数据,无需额外处理。
  • 层级深度
    数据结构为三级(省→市→区),级联选择器自动支持,无需配置层级深度。

三、关键逻辑总结

  1. 数据驱动:通过cascaderProps将 JSON 数据字段映射到级联选择器的标准接口,实现数据展示。
  2. 双向绑定
    • cascaderValue存储选中的code数组(模型层)。
    • form.destination存储展示用的地址字符串(视图层),通过handleCascaderChange实现双向同步。
  3. 递归解析:利用递归函数实现codelabel、字符串与数组的相互转换,适配三级地址结构。
  4. 无缝集成:级联选择器与若依项目的表单验证、模态框、数据提交等功能完全集成,无需修改原有业务逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/83462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【leetcode-两数之和】

一、题目 二、题解 &#xff08;1&#xff09;双指针 这里要注意j<length的 //声明两个指针int length nums.length;for (int i 0; i < length; i) {for (int j i 1; j<length;j){if (j<length && nums[i]nums[j]target){return new int[]{i,j};}}}r…

CLion社区免费后,使用CLion开发STM32相关工具资源汇总与入门教程

Clion下载与配置 Clion推出社区免费&#xff0c;就是需要注册一个账号使用&#xff0c;大家就不用去找破解版版本了&#xff0c;jetbrains家的IDEA用过的都说好&#xff0c;这里嵌入式领域也推荐使用。 CLion官网下载地址 安装没有什么特别&#xff0c;下一步就好。 启动登录…

Rust 学习笔记:关于 Cargo 的练习题

Rust 学习笔记&#xff1a;关于 Cargo 的练习题 Rust 学习笔记&#xff1a;关于 Cargo 的练习题问题一问题二问题三问题四问题五问题六问题七 Rust 学习笔记&#xff1a;关于 Cargo 的练习题 参考视频&#xff1a; https://www.bilibili.com/video/BV1xjAaeAEUzhttps://www.b…

高速收发器

一、高速收发器 1.FPGA高速收发器&#xff1a;GTP,GTX,GTH,GTZ 2.每个Quad有4对高速收发器GT(4个TX和4个RX)和一个COmmon 3.走差分&#xff0c;提高抗干扰性 4.CPLL是每个lane私有的&#xff0c;QPLL是整个Quad的所有通道共享的 5.每个MGT的bank有两对差分参考时钟 6.CPLL的时钟…

Rust 变量与可变性

文章目录 变量与可变性常量遮蔽&#xff08;Shadowing&#xff09; 变量与可变性 Rust中变量默认是不可变的&#xff0c;这是 Rust 鼓励你编写更安全、易于并发代码的众多方式之一。不过&#xff0c;你仍然可以选择让变量可变。让我们来探讨 Rust 为什么鼓励你优先使用不可变性…

sourcetree无法获取远程所有的tag

2025年5月29日11:30:17 sourcetree widnwos v3.4.23版本 突然发现线上的代码库里有很多新打的tag&#xff0c;但是sourcetree死活无法拉去所有的tag&#xff0c;尝试卸载重新安装也不行&#xff0c;全网也找了还是不知道&#xff0c;但是mac版本好像没有这个问题 方法1&…

《深度探索C++对象模型》阅读笔记(完整版)

《深度探索C对象模型》阅读笔记&#xff08;完整版&#xff09; 文章目录 《深度探索C对象模型》阅读笔记&#xff08;完整版&#xff09;1. 关于对象&#xff08;Object Lessons&#xff09;1.1 C对象模型&#xff08;The C Object Model&#xff09;1.1.1 语言中的对象模型1.…

从Docker拉取镜像一直失败超时解决办法

项目场景&#xff1a; 在ubuntu中&#xff0c;使用docker拉去镜像时&#xff0c;一直超时&#xff0c;拉去失败。 问题描述 原因分析&#xff1a; 国外服务器网络不好导致。 解决方案&#xff1a; 解决方案1 设置国内源 我这边测试&#xff0c;更改以后仍然失败 阿里云提供…

KONG根据请求参数限流

背景 价格接口 /search 同时支持缓存查价和实时查价&#xff0c;主要通过searchType字段区分这两种请求。 searchType 为空时为缓存查价&#xff0c;QPS很高。searchType 不为空时为实时查价&#xff0c;但QPS远低于普通查价。 如果直接对该接口限流&#xff0c;当流量波动超…

通俗易懂解析:@ComponentScan 与 @MapperScan 的异同与用法

在 Spring 和 MyBatis 集成开发中&#xff0c;ComponentScan 和 MapperScan 是两个核心注解&#xff0c;但它们的用途和工作机制截然不同。本文将通过通俗的语言和示例代码&#xff0c;带您轻松掌握它们的区别和使用方法。 一、基础概念 ComponentScan&#xff1a;Spring 的“通…

39. 自动化异步测试开发之编写异步业务函数、测试函数和测试类(函数写法)

39. 自动化异步测试开发之编写异步业务函数、测试函数和测试类&#xff08;函数写法&#xff09; 一、异步业务函数解析 1.1 页面导航函数 async def get(async_driver, url: str http://secure.smartbearsoftware.com/samples/testcomplete12/WebOrders/Login.aspx):await…

Qt 无边框窗口实现拖动与窗口控制(最小化/最大化/关闭)

在 Qt 中&#xff0c;使用 Qt::FramelessWindowHint 可以创建无边框窗口&#xff0c;但这样会导致窗口无法拖动&#xff0c;并且系统默认的标题栏按钮&#xff08;最小化、最大化、关闭&#xff09;也会消失。本文将介绍如何实现无边框窗口的鼠标拖动功能&#xff0c;并添加自定…

Linux中的System V通信标准-共享内存、消息队列以及信号量

在Linux系统中&#xff0c;System V IPC&#xff08;Inter-Process Communication&#xff09;提供了一系列进程间通信的机制&#xff0c;包括共享内存、消息队列和信号量。这些机制在系统中发挥了重要作用&#xff0c;帮助进程之间进行数据交换和同步。本文将详细介绍这些机制…

postman工具使用

基本功能操作 常用断言 定义&#xff1a;postman 断言借助 JavaScript - js 语言编写代码&#xff0c;自动判断预期结果与实际结果是否一致。&#xff08; 注意断言 代码写在 Tests 的标签中&#xff09; 断言响应状态码 断言响应体是否包含某个字符串&#xff08;Response bo…

VBA数据库解决方案二十:Select表达式From区域Where条件Order by

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

算法-集合的使用

1、set常用操作 set<int> q; //以int型为例 默认按键值升序 set<int,greater<int>> p; //降序排列 int x; q.insert(x); //将x插入q中 q.erase(x); //删除q中的x元素,返回0或1,0表示set中不存在x q.clear(); //清空q q.empty(); //判断q是否为空&a…

C++文件和流基础

C文件和流基础 1. C文件和流基础1.1 文件和流的概念1.2 标准库支持1.3 常用文件流类ifstream 类ofstream 类fstream 类 2.1 打开文件使用构造函数打开文件使用 open() 成员函数打开文件打开文件的模式标志 2.2 关闭文件使用 close() 成员函数关闭文件关闭文件的重要性 3.1 写入…

Maven---配置本地仓库

目录 5. 5.1在Maven路径下新建文件夹用于本地仓库存储 5.2 复制本地仓库路径 5.3 找到配置文件路径&#xff0c;使用VSCode方式打开 5.4 新增一行代码 5.5 复制本地仓库路径&#xff0c;设置存储路径 5.1在Maven路径下新建文件夹用于本地仓库存储 5.2 复制本地仓库路径 5…

Vue3 + Element Plus + TypeScript 中 el-cascader 实现模拟用户点击功能

模拟点击&#xff0c;调用 el-cascader 的公开方法 togglePopperVisible 来展开下拉框 MaterialOut.vue <script setup lang"ts" name"MaterialOut"> ...... import { ElMessage, type ElCascader } from "element-plus";// 级联组件实例…

新能源汽车与油车销量

中国油车与新能源车销量对比&#xff08;2022-2025年&#xff09; ‌1. 市场份额演化&#xff08;2022-2025年&#xff09;‌ ‌年份‌ ‌新能源车销量 &#xff08;渗透率&#xff09;‌ ‌燃油车销量 &#xff08;渗透率&#xff09;‌ ‌关键事件‌ ‌2022‌ 688.7万辆…