vue+mint-ui 组件实现省市县三级联动功能

前端Vue自定义简单实用中国省市区三级联动选择器 下一步 阅读详情

工作中经常会遇到需要前端实现省、市、区(县)的三级选择的场景,今天要介绍的是Vue和mint-ui结合实现的三级联动效果。

三级联动

我认为实现的难点在于mint-ui,Picker组件展示省市区三级联动数据上,建议先熟悉下mintUI的组件。

官方的解释:

 个人理解:

  • defaultIndex -> 默认展示数据的下标,默认序号为0
  • values -> 该数据选项的数据
  • className -> 数据展示的位置(数据本身的显示顺序)
  • textAlign ->  对齐方式
  • flex -> 将整个picker分成几份,他自己所占位置

附上官方文档地址picker组件 

[{
	flex: 1,
	defaultIndex: this.provinceIndex, //对应 slot 初始选中值
	values: Object.values(this.myaddress)[0],//对应 slot 的备选值数组
	className: 'slot1', //对应 slot 的类名
	textAlign: 'center' //数据对齐格式
},
{
	flex: 1,
	defaultIndex: this.cictyIndex,
	values: (Object.values(this.myaddress)[0])[this.provinceIndex].c,
	className: 'slot2',
	textAlign: 'center'
},
{
	flex: 1,
	defaultIndex: this.regionIndex,
	values: ((Object.values(this.myaddress)[0])[this.provinceIndex].c)[this.cictyIndex].a,
	className: 'slot3',
	textAlign: 'center'
}]

话不多说,直接上代码

1、准备省市区三级联动的数据

附上一部分省市区的json代码,有需要的可以和我联系

{
  "citylist": [{
    "p": "北京市",
    "c": [{
      "n": "市辖区",
      "a": [{
        "s": "东城区"
      }, {
        "s": "西城区"
      }, {
        "s": "朝阳区"
      }, {
        "s": "丰台区"
      }, {
        "s": "石景山区"
      }, {
        "s": "海淀区"
      }, {
        "s": "门头沟区"
      }, {
        "s": "房山区"
      }, {
        "s": "通州区"
      }, {
        "s": "顺义区"
      }, {
        "s": "昌平区"
      }, {
        "s": "大兴区"
      }, {
        "s": "怀柔区"
      }, {
        "s": "平谷区"
      }, {
        "s": "密云区"
      }, {
        "s": "延庆区"
      }]
    }]
  }, {
    "p": "天津市",
    "c": [{
      "n": "市辖区",
      "a": [{
        "s": "和平区"
      }, {
        "s": "河东区"
      }, {
        "s": "河西区"
      }, {
        "s": "南开区"
      }, {
        "s": "河北区"
      }, {
        "s": "红桥区"
      }, {
        "s": "东丽区"
      }, {
        "s": "西青区"
      }, {
        "s": "津南区"
      }, {
        "s": "北辰区"
      }, {
        "s": "武清区"
      }, {
        "s": "宝坻区"
      }, {
        "s": "滨海新区"
      }, {
        "s": "宁河区"
      }, {
        "s": "静海区"
      }, {
        "s": "蓟州区"
      }]
    }]
  }]
}

 2、在index.vue中引入省市区三级联动的子组件

//引入子组件
import selectArea from '@/areaselect/index.vue'

<select-area filed-label-text="幼儿园所在地区" :cictyArea.sync="userFormData.base.cictyArea"></select-area>

export default {
    components: {
        selectArea
    },
    data() {
        return {
            userFormData: {
                base: {
					cictyArea: '',
					detailAddress: '',
					insuredAdress: '',
				}
            }
        }
    }
}

3、实现省、市、区 三级联动的子组件

//省市区三级联动
<template>
	<div class="area-select">
		<div @click="getInsuredArea">
			<mt-field :label="filedText" :placeholder="'请选择' + filedText" v-model="basearea" disabled>
				<span>
					<img width="20px" :src="areaIcon" />
				</span>
			</mt-field>
		</div>
		<!-- 地区 -->
		<mt-popup v-model="insuredAreaVisiable" position="bottom" style="width:100%">
			<mt-picker :slots="insuredArea" value-key="p" @change="onAddressChange" ref="pickerArea" show-toolbar>
				<div class="picker-toolbar-box">
					<span class="picker-toolbar-ok" @click="confirmArea">确认</span>
				</div>
			</mt-picker>
		</mt-popup>
	</div>
</template>

划重点来了 

import myAddress from './tabs/cicty.json'
export default {
		data() {
			return {
				filedText: this.filedLabelText || '投保地区', //页面显示label
				insuredArea: [], //弹框显示数据
				basearea: this.cictyArea, //页面显示 省市区 例   河北省/石家庄市/市辖区
				chooseObj: { //选中的省市区
					province: '',
					cicty: '',
					region: ''
				},
				province: '', //省
				cicty: '', //市
				region: '', //区
				defaultIndex: false,
				provinceIndex: 0, //所选省下标
				cictyIndex: 0, //所选市下标
				regionIndex: 0, //所选区下标
				insuredAreaVisiable: false, //弹框显隐控制
				areaIcon: require('@/assets/svg/location.svg'),
				handler: function(e) {e.preventDefault()} //阻止默认操作
			}
		},
        props: {
			cictyArea: {
				type: String,
				default: ''
			},
			filedLabelText: {
				type: String,
				default: ''
			}
		},
        mounted() {
			let address = JSON.stringify(myAddress).replace(/n/g, 'p')
			address = address.replace(/s/g, 'p')
			address = address.replace(/市辖区/, '市辖区')
			this.myaddress = JSON.parse(address)
			this.insuredArea = [{
					flex: 1,
					defaultIndex: this.provinceIndex,
					values: Object.values(this.myaddress)[0],
					className: 'slot1',
					textAlign: 'center'
				},
				{
					flex: 1,
					defaultIndex: this.cictyIndex,
					values: (Object.values(this.myaddress)[0])[this.provinceIndex].c,
					className: 'slot2',
					textAlign: 'center'
				},
				{
					flex: 1,
					defaultIndex: this.regionIndex,
					values: ((Object.values(this.myaddress)[0])[this.provinceIndex].c)[this.cictyIndex].a,
					className: 'slot3',
					textAlign: 'center'
				}
			]

		},
		methods: {
			// 弹层出现
			closeTouch() {
				document.getElementsByTagName("body")[0].addEventListener('touchmove', this.handler,{passive:false});
			},

			// 弹层关闭
			openTouch() {
				document.getElementsByTagName("body")[0].removeEventListener('touchmove',this.handler,{passive:false});
			},

			onAddressChange(picker, values) {
				if (values[0]) {
					picker.setSlotValues(1, values[0].c)
					picker.setSlotValues(2, values[1].a)
				}

				if (values && values.length > 0) {
					this.province = values[0].p
					this.cicty = values[1].p
					this.region = values[2].p
				}
			},

			remeberIndex(province, cicty, region) {
				for (let i = 0; i < (Object.values(this.myaddress)[0]).length; i++) {
					if (province === (Object.values(this.myaddress)[0])[i].p) {
						this.provinceIndex = i
					}
				}

				for (let i = 0; i < ((Object.values(this.myaddress)[0])[this.provinceIndex].c).length; i++) {
					if (cicty === ((Object.values(this.myaddress)[0])[this.provinceIndex].c)[i].p) {
						this.cictyIndex = i
					}
				}

				for (let i = 0; i < (((Object.values(this.myaddress)[0])[this.provinceIndex].c)[this.cictyIndex].a)
					.length; i++) {
					if (region === (((Object.values(this.myaddress)[0])[this.provinceIndex].c)[this.cictyIndex].a)[i].p) {
						this.regionIndex = i
					}
				}
			},

			getInsuredArea() {
				this.closeTouch()
				this.insuredAreaVisiable = true
				this.defaultIndex = false
			},
			// 地区
			confirmArea() {
				if(!this.province) {
					this.province = (Object.values(this.myaddress)[0])[0].p
					this.cicty = ((Object.values(this.myaddress)[0])[this.provinceIndex].c)[0].p
					this.region = (((Object.values(this.myaddress)[0])[this.provinceIndex].c)[this.cictyIndex].a)[0].p
				}
				this.chooseObj.province = this.province
				this.chooseObj.cicty = this.cicty
				this.chooseObj.region = this.region
				this.basearea = this.chooseObj.province + '/' + this.chooseObj.cicty.trim() + '/' + this.chooseObj.region
				this.insuredAreaVisiable = false
				this.openTouch()
				this.defaultIndex = true
				this.$emit('update:cictyArea', this.basearea)
			}
		}
}

完整代码上传到资源了,有需要的自行下载

vue.js+mint-ui的Popup组件和Picker组件实现省市县三级联动功能 前言      在工作中遇到省市县三级联动的需求,传统的pc端大部分是用3个HTML &lt;select&gt;标签根据选中的一级地址去获取二级地址,然后根据二级地址去获取三级地址。实现省市县三级地址选择,需要2次服务端请求。这里使用mint--ui的Popup弹出框组件和picker选择器组件,无需请求服务端,通过遍历本地的json文件,实现本地输出三级地址,同时给每级地址绑定一个code,从... 阅读详情

相关推荐

vue+mint-ui 移动端框架Picker 组件实现 省市区 三级联动

移动端实现三级联动 mint-ui api传送门 官网链接 npm 安装 npm i mint-ui -S 引入 Mint UI 分两种形式: 一是完全引入,具体实现方式 在 main.js 写入以下代码: 重要:样式文件需要单独引入 import Vue from 'vue' import MintUI from 'mint-ui' import 'mint-ui/lib/style.css' import App from './App.vue' Vue.use(MintUI) new Vue

巫小婆的博客园~ 1430

vue实现省市区三级联动地址选择组件(附address文件)

昨天收到一个新的需求,需要选择地址,因此就要做一个省市区三级联动的组件来使用,在网上找了一些资源,然后进行了尝试,没想到就这么成功了!要记录一下方便后续使用。效果如下:下面就记录一下代码叭!

Vivien_CC的博客 1万+

vue实现省市区三级联动

js部分代码 ,该部分需要导入一个city.json 我放到后面或者找我要一下,里面包含省市区的数据。

liu3325262991的博客 1706

vue 省市县三级联动

/arr.default[0].code 北京市一个对象,其他省可有多个市。2、distpicker插件编写。1、这个文件可以下载。

Ann_52547的博客 2726

Vue省市区选择器组件:Mint-UI封装实践

Vue.js 作为一个轻量级的前端框架,因其易用性和灵活性被广泛应用在现代Web开发中。它采用组件化的方式,允许开发者构建大型应用,并通过虚拟DOM机制高效地处理数据变化与界面更新。Mint-UI是为Vue.js量身打造的移动端组件库,它提供了丰富的UI元素,使得开发者能够快速搭建出美观且响应式的用户界面。Mint-UI的组件经过优化,适合移动端用户操作习惯,并且拥有良好的文档支持,可以大大提高开发效率。

weixin_42584758的博客 1103

晶体管的 栅极gate 材料选用 多晶硅polysilicon,并采用 自对准工艺 self-aligned IC后端版图 【VLSI】

本文为了解决为什么要使用多晶硅作栅极触点的问题,先介绍了MOS管的工作原理是通过栅极上所加的电压控制漏极与源极之间电流,然后解释了栅极的材料为什么选用多晶硅,然后介绍了晶体管里栅极的自对准工艺(Self-Aligned Gate )。

Jie_MSD的博客 1万+

懒人福音!Vue+element-china-area-data实现省市区三级联动只需几步操作

懒人福音!Vue+element-china-area-data实现省市区三级联动只需几步操作

希望看完文章的你能够带着答案离开。 1万+

避坑指南:STM32定时器测PWM频率占空比时,那些CubeMX没告诉你的细节(蓝桥杯真题衍生)

本文深入解析STM32定时器测量PWM频率和占空比时的关键细节,揭示CubeMX配置中未明确的时钟树原理和输入捕获机制。针对蓝桥杯嵌入式赛题中的常见问题,提供动态调整预分频器、多采样数字滤波等实战解决方案,帮助开发者避免测量误差,提升PWM测量精度和稳定性。

weixin_28692153的博客 339

vue+mint-ui 实现省市区三联动效果

最近做项目,需要实现一个省市县三级联动的效果 下载一个json数据文件,百度有很多,这里就不仔细说了 先来张效果图 接下来我们开始写代码吧 1: 在项目中安装Mint-UI npm i mint-ui --save 2: 在mian.js配置mint-ui // 地区省市区三联动引入 import MintUI from 'mint-ui' import 'mint-ui/...

青衫折扇的博客 845

别再傻傻分不清!Synopsys DC综合中link/target/symbol/synthetic四大库的保姆级配置指南

本文详细解析了Synopsys DC综合中link_library、target_library、symbol_library和synthetic_library四大库的配置方法,帮助工程师避免常见错误。通过实战示例和调试技巧,指导如何正确设置工艺库与IP库,提升数字芯片设计效率。

weixin_42562079的博客 422

2022 七校联合NewStarCTF 公开赛赛道 WEEK5|MISC

2022 七校联合NewStarCTF 公开赛赛道 WEEK5|MISC

zerorzeror的博客 3110

mint-ui picker 实现省市区县三级联动

实现效果: 首先说一下实现思路: 1.采用单独的js文件存储省市区数据,可以是json或者js文件,数据可参考我的上一篇博客。 2.使用mt-picker进行赋值,(需要提前引入mint-ui)根据省的数据的改变,动态的改变市和区的显示数据。 3.最好采用单独的组件实现,方便修改和复用。 代码: &lt;template&gt; &lt;div class="location...

心若向阳,无谓悲伤的博客 2754

格(Lattice)基础(一)

有关格的基础概念,和相关的格难题

Amire0x的小乐园 5698

vue省市区三级联动-封装集成

前言 最近在学习开发一个新的H5产品,想用【mint-ui】的Picker组件区创建一个地址选择器。发现mint-ui官网只有一个简单的示例,满足不了省市区三级联动的需求,找了很多相关文档也没有一个比较系统的说明或demo。为此,想自己做一个总结并写一个自己的demo,方便以后使用。 一、创建一个空项目 在写这个demo前,需要先构建一个空项目,并做好局域网配置,还不懂的可以先看【最近写的一篇博客...

chenzimin_blog 2万+

KiCad自动布线实战:FreeRouting插件安装与使用指南

在PCB设计流程中,布线环节往往占据大量重复性工作,尤其对于中小型双面板,成百上千条飞线的手动连接既繁琐又易出错。自动布线技术通过算法在给定设计规则和元件布局的基础上自动规划走线路径,能显著提升布线效率。FreeRouting作为一款开源自动布线器,与KiCad通过DSN/SES标准中间格式无缝配合,让工程师将精力集中于关键信号和布局优化,而将常规网络交给工具处理。本文从自动布线的原理与边界出发,讲解了FreeRouting的安装、DSN导出、参数设置、自动布线及结果回传的完整流程,并结合实际案例展示了在S

weixin_32025789的博客 277

【LSTM回归预测】attention机制LSTM时间序列回归预测【含Matlab源码 1992期】

attention机制LSTM时间序列回归预测 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2591

使用mint-ui实现省市区三级联动效果

引用插件:饿了么的mint-ui组件中的picker功能,具体API可参照官网说明:http://mint-ui.github.io/docs/#/zh-cn2/picker 背景:项目需要做一个省份-城市-地区的选择级联效果,我从gayhub上找了一下,决定使用mint-ui的组件,因为各个功能都很全而且设计跟我们的项目风格类似。 具体实现: 通过阅读官网的实例,大概就能知道这

chaiyanchen的博客 1万+

[QMT量化交易小白入门]-九十五、多因子选股和趋势择时股票量化交易策略,年化收益率40.61%

本策略采用“双层过滤”机制:第一层基于多维度财务指标进行股票池筛选(多因子选股),第二层运用均线系统和MACD指标实施动态择时(趋势跟踪)。这种设计既保证了组合的质量下限,又能灵活应对市场波动。因子配置科学性:涵盖估值、成长、盈利、动量四大类因子风险控制精细化:设置动态止损与仓位管理机制信号验证严格性:多重条件交叉验证提升胜率。

木头大左的博客 798

基于VUE+Mint UI里mt-picker的省市区三级联动

基于VUE+Mint UI里mt-picker的省市区三级联动 做省市区三级联动时对后端数据要求比较高,最为前端小白的我也是参考了很多片文章,具体那篇忘了,实在找不到原版了,如有侵权立删。 1.在main.js 里全局引入mint ui ,因为用的比较多,所以全局引入了,如果需要一部分可局部引入。 //引入mint-ui import MintUI from "mint-ui" import 'm...

qq_40571755的博客 1324

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

vue+mint-ui的picker组件封装一个省市区三级联动组件

最近在用vue做项目,然后需要做一个省市区的三级联动的功能,于是研究了一下mint-ui,写了效果如下的一个组件 我们的数据文件如下形式,将他分开成一个js文件并将数据暴露出来: cityData.js export const CITY_DATA= [ { "id": "110000", "name": "北京市", "city": [ { ...

weixin_44105171的博客 386

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

vue用mint-ui的picker组件封装一个省市区三级联动组件

最近公司在用vue做项目,然后需要做一个省市区的三级联动的功能,于是研究了一下mint-ui,写了效果如下的一个组件 首先我们的数据文件如下形式,将他分开成一个js文件并将数据暴露出来: cityData.js export const CITY_DATA= [ { ...

chuoqinnong5933的博客 408

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

vue项目中,使用mint-ui的picker实现省市区三级联动,并且编辑时选中默认值(封装成独立的组件)

具体代码如下: 1.首先创建一个provinceData.js文件,用于存储省市区的数据,provinceData.js内容如下; // 所有省市区数据 const listAddress = [ { 'city': [{ 'area': ['东城区', '西城区', '崇文区', '宣武区', '朝阳区', '丰台区', '石景山区', '海淀...

summer_my_sunshine的博客 1290

vue + mint-ui 的 picker 省市区三级联动,以及编辑回显,可直接复制封为组件

最近用vue做一个公众号用到了mint-ui的picker,选择地区的三级联动,由于picker无法加载动态数据,经过各种百度,最后使用promise对象,将异步转换为同步。完美解决三级联动效果,文章借助于:https://blog.csdn.net/NAMECZ/article/details/85286095 <template> <div> &...

u014206461的博客 1263

vue 省市区三级联动选择 基于mint

一、通过vue mint-ui 最终实现的效果 二、省市区对应的数据格式 1 const address = [{ 2 "code": "11", 3 "name": "北京市", 4 "children": [{ 5 "code": "1101", 6 "name": "市辖区", 7 "c...

weixin_30603633的博客 154

min-ui 省市区三级联动

直接上代码 html <template> <div class="three-level-address" id="three_level_address"> <div class="region-div"> <span class="input-icon"><i class="iconfont icon-d...

四月 641
上一篇: Vue2组件通信方式
下一篇: 分享前端开发常用代码片段
逩跑鍀小学生
博客等级 码龄5年 37粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值