基于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://xiahunao.cn/news/2806393.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

音视频剪辑|Windows|抽帧和合帧

什么是抽帧&#xff1f; FFmpeg 抽帧&#xff08;Extracting frames&#xff09;的作用是从视频文件中按需提取单张或多张静止图像&#xff08;帧&#xff09;&#xff0c;并将它们保存为图片文件&#xff08;如 JPEG、PNG 等格式&#xff09;。这一功能在以下场合十分有用&am…

一元函数微分学——刷题(18

目录 1.题目&#xff1a;2.解题思路和步骤&#xff1a;3.总结&#xff1a;小结&#xff1a; 1.题目&#xff1a; 2.解题思路和步骤&#xff1a; 遇到绝对值函数&#xff0c;需要把它转化为分段函数&#xff0c;从而更加方便求导数&#xff1a; 3.总结&#xff1a; 遇到绝对…

Docker容器实战

"爱在&#xff0c;地图上&#xff0c;剥落~" Mysql 容器化安装 我们可以在 docker hub上&#xff0c;进入mysql的镜像仓库&#xff0c;找到适合的版本。 直接拉取镜像: docker pull mysql:latest 我们知道 msyql 的默认端口是 3306 &#xff0c;而且有密码&#x…

计算机网络实验四VLAN与三层交换机

一、实验目的和要求 1&#xff09;掌握VLAN的基本配置方法&#xff0c;理解VLAN的功能和作用&#xff1b; 2&#xff09;掌握三层交换机的基本配置方法。 二、实验环境 1&#xff09;运行Windows 2008 Server/XP/7操作系统的PC一台。 2&#xff09;PacketTracer。 实验内…

电子器件系列63:肖特基二极管NSQ03A04\SS34C

以下是肖特基二极管_SS34C_规格书_SLKOR(萨科微),立创编号C880740 以下是肖特基二极管NSQ03A04的规格书&#xff1a; 稍微比较下参数&#xff0c;发现两者参数接近&#xff0c;ss34的几个参数还要略微好一些&#xff0c;可以用ss34来作替换。 在电源电路中的应用&#xff1a; …

python实现贝尔曼福德算法

对于求图的最短路径问题,如果使用迪杰斯特拉算法,也可以算是一个较为常见的方法,但是对于迪杰斯特拉算法解决最短路径问题的时候,会存在一个问题,那就是所有边所对应的距离都必须是正数,而如果在存在负数的边的时候,迪杰斯特拉算法就会存在问题,而对于存在负数的这种情…

Bean的声明周期

1.创建Bean对象&#xff08;调用无参数构造&#xff09; 2.给bean对象设置相关属性&#xff08;依赖注入&#xff09; 3.bean后置处理器&#xff08;初始化前执行&#xff0c;类似于过滤器和拦截器&#xff09; 首先要定义一个类MyBeanPost&#xff0c;实现BeanPostProcessor…

Freertos实时操作系统---基于STM32

一、Freertos简介 1.Freertos介绍 1&#xff09;RTOS指的是一类的实时操作系统 2&#xff09;rtos的使用&#xff1a;用户根据对任务来设置其优先级然后来使用调度器来决定哪一个任务来先执行。 3&#xff09;Freertos的文件数量远低于其他操作系统 4&#xff09;主要特点&…

[rust] 10 project, crate, mod, pub, use: 项目目录层级组织, 概念和实战

文章目录 一 项目目录层级组织概念1.1 cargo new 创建同名 的 Project 和 crate1.2 多 crate 的 package1.3 mod 模块1.3.1 创建嵌套 mod1.3.2 mod 树1.3.3 用路径引用 mod1.3.3.1 使用绝对还是相对? 1.3.4 代码可见性1.3.4.1 pub 关键字1.3.4.2 用 super 引用 mod1.3.4.3 用 …

Win11网络连接选项和蓝牙选项突然消失的解决办法

在设置或者开始栏里搜索“网络重置” 打开网络重置&#xff1a; 然后点击立即重置&#xff0c;之后按照系统提示操作即可

51单片机学习(4)-----独立按键进一步控制LED灯

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 目录 一. 独立按键灵活控制LED 程序一&#xff1a;单个独立按键控制多个…

C++ 二分法

目录 1、704. 二分查找 2、34. 在排序数组中查找元素的第一个和最后一个位置 3、69. x的平方根 4、35. 搜索插入位置 5、852. 山脉数组的峰顶索引 6、162. 寻找峰值 7、153. 寻找旋转排序数组中的最小值 8、LCR 173. 点名 1、704. 二分查找 ​ class Solution {…

2024 windows环境下安装RabbitMQ(亲测超详细)

一、RabbitMQ是什么&#xff1f;   RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。 ​ AMQP &#xff1a;Advanced Message Queue&#xff0c;高级消息队列协议。它是应用层协议的一个开放标准&#xff0c;为面向消息的中间件设计&#xff0c;基于此协议的客户端与消…

[C++] 如何操作ini文件

什么是ini文件&#xff1f; INI文件&#xff08;.ini&#xff09;是一种常见的配置文件格式&#xff0c;用于存储程序、操作系统或设备驱动程序的配置信息。INI是"Initialization"的缩写&#xff0c;指的是初始化。INI文件通常是纯文本文件&#xff0c;在Windows操作…

【c++】模板初阶(泛型编程与模板)

1.泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left right;right temp; } void Swap(char& left, …

论文精读--GPT1

把transformer的解码器拿出来&#xff0c;在没有标号的大量文本数据上训练一个语言模型&#xff0c;来获得预训练模型&#xff0c;然后到子任务上微调&#xff0c;得到每个任务所需的分类器 Abstract Natural language understanding comprises a wide range of diverse tasks…

RabbitMq:什么是RabbitMq? ①

一、RabbitMq定位 RabbitMq是一个基于消息订阅发布的一款消息中间件。 二、技术原理 核心概念 server&#xff1a;又称broker&#xff0c;接受客户端连接&#xff0c;实现AMQP实体服务。缓存代理&#xff0c;Kafka集群中的一台或多台服务器统称broker.connection&#xff1a;…

C++初阶:容器适配器priority_queue常用接口详解及模拟实现、仿函数介绍

介绍完了stack和queue的介绍以及模拟的相关内容后&#xff1a;C初阶&#xff1a;容器适配器介绍、stack和queue常用接口详解及模拟实现 接下来进行priority_queue的介绍以及模拟&#xff1a; 文章目录 1.priority_queue的介绍和使用1.1priority_queue的初步介绍1.2priority_que…

模型 3C(顾客、公司、竞争)战略

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_总纲目录。洞悉自身&#xff0c;把握顾客&#xff0c;超越竞争。 1 3C(顾客、公司、竞争)战略模型的应用 1.1 3C战略模型在麦当劳公司中的应用 麦当劳在扩张国际市场时采用3C战略模型&#xff0c;具体如下&#xf…

Covalent Network(CQT)发展新里程碑:SOC 2 数据安全认证通过,进一步加强了其人工智能支持

Covalent Network&#xff08;CQT&#xff09;现已完成并通过了严格的 Service Organization Control&#xff08;SOC) 2 Type II 的合规性审计&#xff0c;通过由备受行业认可的机构执行&#xff0c;进一步证明了 Covalent Network&#xff08;CQT&#xff09;团队坚定不移地致…