基于ElementUI封装省市区四级联动下拉选择

基于ElementUI封装的省市区下拉级联选择

效果

基于ElementUI封装省市区级联下拉选择

数据

最新省市区JSON数据获取:https://xiangyuecn.github.io/AreaCity-JsSpider-StatsGov/

基于ElementUI封装省市区级联下拉选择

参数说明

参数说明
inputNumShow下拉框的数量,最多4个
defaultAddress默认显示省市区 例:[‘安徽’, ‘阜阳’, ‘颍上’, ‘十八里铺’]
inputInterval选择框间的间距

组件代码

<template><div>所在地区:<el-select v-show="inputNumShow>=1" v-model="provinceData" clearable @change="provinceChange" filterable placeholder="请选择省"><el-option v-for="item in provinceDataOpt" :key="item.n" :label="item.n" :value="item.n"></el-option></el-select><el-select :style="{marginLeft:inputInterval+'px'}" v-show="inputNumShow>=2" clearable no-data-text="请选择上级" v-model="cityData" @change="cityChange"filterable placeholder="请选择市"><el-option v-for="item in cityDataOpt" :key="item.n" :label="item.n" :value="item.n"></el-option></el-select><el-select :style="{marginLeft:inputInterval+'px'}" v-show="inputNumShow>=3" clearable no-data-text="请选择上级" @change="areaChange" v-model="areaData"filterable placeholder="请选择区县"><el-option v-for="item in areaDataOpt" :key="item.n" :label="item.n" :value="item.n"></el-option></el-select><el-select :style="{marginLeft:inputInterval+'px'}"  @change="streetChange" v-show="inputNumShow>=4"  clearable no-data-text="请选择上级" v-model="streetData"filterable placeholder="请选择城镇村"><el-option v-for="item in streetDataOpt" :key="item.n" :label="item.n" :value="item.n"></el-option></el-select></div>
</template>
<script>
/*** addressData为省市区的数据,获取地址为:https://xiangyuecn.github.io/AreaCity-JsSpider-StatsGov/* addressData参数说明:*    n:名称*    y:名称前缀*    c:子集*/
import addressData from "./address.json"; //全国省市区街道数据
export default {name: "hsk-addressSel",props:{inputNumShow:{type:Number,default:4,},inputInterval:{type:Number,default:10},defaultAddress:{type:Array,default(){return []}}},data() {return {provinceData: undefined,cityData: undefined,areaData: undefined,streetData: undefined,provinceDataOpt: [],//  省,自治区,直辖市,特别行政区都在其中cityDataOpt: [], //  市数据areaDataOpt: [],// 区数据streetDataOpt: [], //城镇sourceData: null,}},created() {//省市区镇数据处理,将省市区镇数据分离出来this.dataProces()},mounted(){//可能是省市区,也可能是省市,也可能是省市县镇if(typeof(this.defaultAddress[0]) !== "undefined"){this.provinceData = this.defaultAddress[0]this.provinceChange( this.defaultAddress[0])}if(typeof(this.defaultAddress[1]) !== "undefined"){this.cityData = this.defaultAddress[1]this.cityChange(this.defaultAddress[1])}if(typeof(this.defaultAddress[2]) !== "undefined"){this.areaData = this.defaultAddress[2]this.areaChange(this.defaultAddress[2])}if(typeof(this.defaultAddress[3]) !== "undefined"){this.streetData = this.defaultAddress[3]this.streetChange(this.defaultAddress[3])}},methods: {//数据初始化处理dataProces() {//初始化this.provinceDataOpt = []this.cityDataOpt = []this.areaDataOpt = []this.streetDataOpt = []this.sourceData = undefinedthis.cityData = undefinedthis.areaData = undefinedthis.streetData = undefinedthis.sourceData = addressData//递归,为每层添加level,区分省,市,县,镇,并将数据放入指定变量中使用this.addLevel(this.sourceData)},/*** 递归为每个层级添加一个level* 0.(省,自治区,直辖市,特别行政区)、* 1.(市,直辖市,特别行政区)、* 2.(区,县,镇)、* 3. (城,镇,街道)、* 将省市区城镇放入到指定的provinceData,cityData,areaData,streetData*/addLevel(data, level = 0) {for (const key in data) {if (typeof data[key] === 'object' && !Array.isArray(data[key])) {data[key].level = level;if (level === 0) {this.provinceDataOpt.push(data[key])}if ('c' in data[key]) {this.addLevel(data[key].c, level + 1);}}}},/*** 当省份改变选中时触发,获取市,直辖市,行政区,自治区*/provinceChange(e) {this.cityDataOpt = []this.cityData = undefined      this.areaData = undefinedthis.areaDataOpt = []this.streetData = undefinedthis.streetDataOpt = []//根据选中项确定市,直辖市,或者特别行政区的数据for (let i = 0; i < this.provinceDataOpt.length; i++) {if (e === this.provinceDataOpt[i].n) {//获取市的内容放入市区数组for (let j in this.provinceDataOpt[i].c) {//获取市,直辖市,行政区,自治区        this.cityDataOpt.push(this.provinceDataOpt[i].c[j])}}}      this.$emit("addressChange",[this.provinceData])},/*** 当市区修改的时候触发,获取县,区*/cityChange(e) {this.areaData = undefinedthis.areaDataOpt = []this.streetData = undefinedthis.streetDataOpt = []// 拿到县区选项for (let i = 0; i < this.cityDataOpt.length; i++) {if (e === this.cityDataOpt[i].n) {for (let j in this.cityDataOpt[i].c) {this.areaDataOpt.push(this.cityDataOpt[i].c[j])}}}this.$emit("addressChange",[this.provinceData,this.cityData])},/*** 当前区县修改时触发,获取城镇选项列表*/areaChange(e) {this.streetData = undefinedthis.streetDataOpt = []// 拿到城镇庄村选项for (let i = 0; i < this.areaDataOpt.length; i++) {if (e === this.areaDataOpt[i].n) {for (let j in this.areaDataOpt[i].c) {this.streetDataOpt.push(this.areaDataOpt[i].c[j])}}}this.$emit("addressChange",[this.provinceData,this.cityData,this.areaData])},streetChange(e){this.$emit("addressChange",[this.provinceData,this.cityData,this.areaData,e])}}}
</script><style></style>

父组件使用

<template><div><el-button type="primary" size="mini" @click="xzjiajia">选择++</el-button><el-button type="primary" size="mini" @click="xzjianjian">选择--</el-button><el-button type="primary" size="mini" @click="jjjiajia">间距++</el-button><el-button type="primary" size="mini" @click="jjjianjian">间距--</el-button><div style="margin-top: 20px;"><hsk-address-sel :inputNumShow="inputNumShow" :inputInterval="inputInterval" @addressChange="addressChange":defaultAddress="['安徽', '阜阳', '颍上', '十八里铺']" /></div></div>
</template><script>
import HskAddressSel from '../package/hsk-addressSel/index.vue'
export default {name: "hskAddressSelPage",components: {HskAddressSel},data() {return {inputNumShow: 4,inputInterval: 10,}},methods: {xzjiajia() {this.inputNumShow++},xzjianjian() {this.inputNumShow--},jjjiajia() {this.inputInterval++},jjjianjian() {this.inputInterval--},addressChange(e){console.log("地址:",e)}}
}
</script>
<style></style>

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

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

相关文章

【C++初阶】--类和对象(下)

目录 一.const成员 1.权限放大问题 2.权限的缩小 二.再谈构造函数 1.构造函数体赋值 2.初始化列表 (1)概念 (2)使用 ①在对象实例化过程中&#xff0c;成员变量先依次进行初始化 ②再进行函数体内二次赋值 3.explicit关键字 (1)C为什么要存在自动隐式类型转换…

算法打卡day1|数组篇|Leetcode 704.二分查找、27.移除元素

数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合&#xff0c;可以方便的通过下标索引的方式获取到下标下对应的数据。 1.数组下标都是从0开始的。 2.数组内存空间的地址是连续的。 正是因为数组的在内存空间的地址是连续的&#xff0c;所以我们在删除或者增添…

【深度学习笔记】3_5 图像分类数据集fashion-mnist

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 3.5 图像分类数据集&#xff08;Fashion-MNIST&#xff09; 在介绍softmax回归的实现前我们先引入一个多类图像分类数据集。它将在后面的章节中被多次使用&#xff0c…

《Docker 简易速速上手小册》第1章 Docker 基础入门(2024 最新版)

文章目录 1.1 Docker 简介与历史1.1.1 Docker 基础知识1.1.2 重点案例&#xff1a;Python Web 应用的 Docker 化1.1.3 拓展案例 1&#xff1a;使用 Docker 进行 Python 数据分析1.1.4 拓展案例 2&#xff1a;Docker 中的 Python 机器学习环境 1.2 安装与配置 Docker1.2.1 重点基…

消息队列-RabbitMQ:发布确认—发布确认逻辑和发布确认的策略

九、发布确认 1、发布确认逻辑 生产者将信道设置成 confirm 模式&#xff0c;一旦信道进入 confirm 模式&#xff0c;所有在该信道上面发布的消息都将会被指派一个唯一的 ID (从 1 开始)&#xff0c;一旦消息被投递到所有匹配的队列之后&#xff0c;broker 就会发送一个确认给…

Python基础教程——17个工作必备的Python自动化代码

您是否厌倦了在日常工作中做那些重复性的任务&#xff1f;简单但多功能的Python脚本可以解决您的问题。 引言 Python是一种流行的编程语言&#xff0c;以其简单性和可读性而闻名。因其能够提供大量的库和模块&#xff0c;它成为了自动化各种任务的绝佳选择。让我们进入自动化…

K8s环境搭建

一、基础环境准备 VMware虚拟机&#xff0c;安装三台CentOS&#xff0c;网络环境选择NAT模式&#xff0c;推荐配置如下&#xff08;具体安装步骤省略&#xff0c;网上很多虚拟机安装CentOS7的教程&#xff09; 二、网络环境说明 使用NAT模式&#xff0c;我的IP分别是&#xf…

Promise相关理解记录

一、Promise基础定义相关 Promise是一个构造函数&#xff0c;调用时需要使用new关键字 Promise是解决回调地狱的一种异步解决方式 Promise有三个状态&#xff1a;pending(进行中)、fulfilled(成功)、rejected(失败) Promise的状态只会从 pending→fulfilled 或者 pending→…

300分钟吃透分布式缓存-13讲:如何完整学习MC协议及优化client访问?

协议分析 异常错误响应 接下来&#xff0c;我们来完整学习 Mc 协议。在学习 Mc 协议之前&#xff0c;首先来看看 Mc 处理协议指令&#xff0c;如果发现异常&#xff0c;如何进行异常错误响应的。Mc 在处理所有 client 端指令时&#xff0c;如果遇到错误&#xff0c;就会返回 …

信号系统之线性图像处理

1 卷积 图像卷积的工作原理与一维卷积相同。例如&#xff0c;图像可以被视为脉冲的总和&#xff0c;即缩放和移位的delta函数。同样&#xff0c;线性系统的特征在于它们如何响应脉冲。也就是说&#xff0c;通过它们的脉冲响应。系统的输出图像等于输入图像与系统脉冲响应的卷积…

pclpy 半径滤波实现

pclpy 半径滤波实现 一、算法原理背景 二、代码1.pclpy 官方给与RadiusOutlierRemoval2.手写的半径滤波&#xff08;速度太慢了&#xff0c;用官方的吧&#xff09; 三、结果1.左边为原始点云&#xff0c;右边为半径滤波后点云 四、相关数据 一、算法原理 背景 RadiusOutlier…

Linux——进程概念

目录 冯诺依曼体系结构 操作系统 管理 系统调用和库函数 进程的概念 进程控制块——PCB 查看进程 通过系统调用获取进程标示符 通过系统调用创建进程 进程状态 运行状态-R ​编辑 浅度睡眠状态-S 深度睡眠状态-D 暂停状态-T 死亡状态-X 僵尸状态-Z 僵尸进程…

AD24-PCB的DRC电气性能检查

1、 2、如果报错器件选中&#xff0c;不能跳转时&#xff0c;按下图设置 3、开始出现以下提示时处理 4、到后期&#xff0c;错误改得差不多的时候&#xff1b;出现以下的处理步骤 ①将顶层和底层铜皮选中&#xff0c;移动200mm ②执行以下操作 ③将铜皮在移动回来&#xff0c;进…

STM32_IIC_AT24C02_1_芯片简介即管脚配置

STM32的IIC总线是存在bug&#xff0c;感兴趣的可以上网搜一搜。我们可以使用两个I/O口和软件的方式来模拟stm32的iic总线的控制&#xff0c;所以就不需要使用stm32的硬件控制器了&#xff0c;同理数据手册中的I2C库函数也没有用了。 ROM&#xff08;只读存储器&#xff09;和…

黄仁勋最新专访:机器人基础模型可能即将出现,新一代GPU性能超乎想象

最近&#xff0c;《连线》的记者采访了英伟达CEO黄仁勋。 记者表示&#xff0c;与Jensen Huang交流应该带有警告标签&#xff0c;因为这位Nvidia首席执行官对人工智能的发展方向如此投入&#xff0c;以至于在经过近 90 分钟的热烈交谈后&#xff0c;我&#xff08;指代本采访的…

杰发科技AC7801——SRAM 错误检测纠正

0.概述 7801暂时无错误注入&#xff0c;无法直接进中断看错误情况&#xff0c;具体效果后续看7840的带错误注入的测试情况。 1.简介 2.特性 3.功能 4.调试 可以看到在库文件里面有ecc_sram的库。 在官方GPIO代码里面写了点测试代码 成功打开2bit中断 因为没有错误注入&#x…

Netdata:实时高分辨率监控工具 | 开源日报 No.173

netdata/netdata Stars: 63.9k License: GPL-3.0 Netdata 是一个监控工具&#xff0c;可以实时高分辨率地监视服务器、容器和应用程序。 以下是该项目的主要功能&#xff1a; 收集来自 800 多个整合方案的指标&#xff1a;操作系统指标、容器指标、虚拟机、硬件传感器等。实…

软件常见设计模式

设计模式 设计模式是为了解决在软件开发过程中遇到的某些问题而形成的思想。同一场景有多种设计模式可以应用&#xff0c;不同的模式有各自的优缺点&#xff0c;开发者可以基于自身需求选择合适的设计模式&#xff0c;去解决相应的工程难题。 良好的软件设计和架构&#xff0…

k8s的svc流量通过iptables和ipvs转发到pod的流程解析

文章目录 1. k8s的svc流量转发1.1 service 说明1.2 endpoints说明1.3 pod 说明1.4 svc流量转发的主要工作 2. iptables规则解析2.1 svc涉及的iptables链流程说明2.2 svc涉及的iptables规则实例2.2.1 KUBE-SERVICES规则链2.2.2 KUBE-SVC-EFPSQH5654KMWHJ5规则链2.2.3 KUBE-SEP-L…

css复习

盒模型相关&#xff1a; border&#xff1a;1px solid red (没有顺序) 单元格的border会发生重叠&#xff0c;如果不想要重叠设置 border-collapse:collapse (表示相邻边框合并在一起) padding padding影响盒子大小的好处使用 margin应用&#xff1a; 行内或行内块元素水…