uni-app地址四级联动

  1. uni-app的picker地址联动只有三级联动。
  2. 想要四级联动只能将picker的mode改为“multiSelector”,再自行获取数据填写
<template>
	<view class="content">
		<view class="address">
			<image src="/static/images/index/address.png" mode="widthFix"></image>
			<!-- 当 range 是一个 Object Array 时,通过 range-key 来指定 Object 中 key 的值作为选择器显示内容,range-key只接受字符串 -->
			<picker mode="multiSelector" :range="mulSelect" :range-key="'name'" @change="pickerChange" @columnchange="colChange">
				<view :class="{active:isActive}">{{address}}</view>
			</picker>
		</view>
	</view>
</template>

js部分:

<script>
	export default {
		data() {
			return {
				provinceList: [{
						id: 1,
						name: '广东省',
						cityList: [
							{
								id: 1,
								name: '广州市',
								districtList: [
									{
										id: 1,
										name: '天河区',
										streetList: [{id:1,name:'黄村新村大街'},{id:2,name:'玉树新村大街'}]
									},
									{
										id:2,
										name:'白云区',
										streetList:[{id:1,name:'大河大街'},{id:2,name:'小何大街'}]
									}
								],
							},
							{
								id:2,
								name:'茂名市',
								districtList:[
									{
										id:1,
										name:'信宜市',
										streetList:[{id:1,name:'东镇大街'},{id:2,name:'锦江大街'}]
									},
									{
										id:2,
										name:'电白县',
										streetList:[{id:1,name:'小区大街'},{id:2,name:'大区大街'}]
									}	
								]
							}
						]
					},
					{
						id: 2,
						name: '广西省',
						cityList: [
							{
								id:1,
								name:'南宁市',
								districtList:[
									{
										id:1,
										name:'楠楠区',
										streetList:[{id:1,name:'安安大街'},{id:2,name:'安全大街'}]
									},
									{
										id:2,
										name:'安南区',
										streetList:[{id:1,name:'南山大街'},{id:2,name:'俺家大街'}]
									}
							    ]
							},
							{
								id:2,
								name:'吉普市',
								districtList:[
									{
										id:1,
										name:'吉尔区',
										streetList:[{id:1,name:'吉祥大街'},{id:2,name:'吉吉大街'}]
									},
									{
										id:2,
										name:'吉子市',
										streetList:[{id:1,name:'季付大街'},{id:2,name:'集合大街'}]
									}
								]
							}
						]
					}
				],
				province: [], //省数组
				city: [], //市数组
				district: [], //区数组
				street: [], //街道数组
				mulSelect: [], //四级联动显示数组,该数组的值为[[province],[city],[district],[street]]
				provinceId: 0, //省的id
				cityId: 0, //市的id
				districtId: 0,//区的id
				address:'请选择地址',
				isActive:false//字体颜色样式
			}
		},
		onReady() {
			// console.log(this.arrList[0].name)
		},
		methods: {
			pickerChange(e) {
				//什么都不选的话,e.detail.value的值为[null,null,null,null]
				//只选择省的话,e.detail.value的值为[数字,null,null,null]
				//只选择市的话,e.detail.value的值为[数字,数字,null,null]
				//所以获取e.detail.value的值先判断是否为null,如果为null则取值为0
				for(var i=0;i<e.detail.value.length;i++){
					if(e.detail.value[i]===null){
						e.detail.value[i]=0;
					}
				}
				
				var s_province=this.mulSelect[0][e.detail.value[0]];//获取选中的省
				var s_city=this.mulSelect[1][e.detail.value[1]||0];//获取选中的市
				var s_district=this.mulSelect[2][e.detail.value[2]||0];//获取选中的区
				var s_street=this.mulSelect[3][e.detail.value[3]||0];//获取选中的街道
				
				// console.log(e.detail.value);
				//赋值显示在页面
				this.address=s_province.name+s_city.name+s_district.name+s_street.name;
				
				//将字体颜色修改为黑色
				this.isActive=true;
			},
			colChange(e) {
				// console.log(e.detail);
				// console.log(this.mulSelect[0][e.detail.value])
				switch (e.detail.column){
					case 0://选择省
						this.provinceId=this.provinceList[e.detail.value].id;
						
						this.getCity();
						this.mulSelect[1]=this.city;
						
						this.getDistrict();
						this.mulSelect[2]=this.district;
						
						this.getStreet();
						this.mulSelect[3]=this.street;
						
						break;
					case 1://选择市
					    for(var i=0;i<this.provinceList.length;i++){
							if(this.provinceList[i].id==this.provinceId){
								this.cityId=this.provinceList[i].cityList[e.detail.value].id;
							}
						}
						
						this.getDistrict();
						this.mulSelect[2]=this.district;
						
						this.getStreet();
						this.mulSelect[3]=this.street;
						
					    break;
					case 2://选择区
					    for(var i=0;i<this.provinceList.length;i++){
					    	if(this.provinceList[i].id==this.provinceId){
					    		for(var j=0;j<this.provinceList[i].cityList.length;j++){
									if(this.provinceList[i].cityList[j].id==this.cityId){
										this.districtId=this.provinceList[i].cityList[j].districtList[e.detail.value].id;
									}
								}
					    	}
					    }
						
						this.getStreet();
						this.mulSelect[3]=this.street;
						
					    break;
					case 3://选择街道
					
					    break;
					default:
						break;
				}
			},
			getProvince() {
				for(var i=0;i<this.provinceList.length;i++){
					var pro={};
					pro.id=this.provinceList[i].id;//获取省id
					pro.name=this.provinceList[i].name;//获取省名
					
					this.province.push(pro);//将获取到的id,name放入省名称数组
				}
			},
			getCity() {
				for(var i=0;i<this.provinceList.length;i++){
					//寻找与省id匹配的索引
					if(this.provinceList[i].id==this.provinceId){
						
						if(this.city.length){//清空历史数据
							this.city=[];
						}
						
						for(var j=0;j<this.provinceList[i].cityList.length;j++){
							var ci={};
							ci.id=this.provinceList[i].cityList[j].id;//获取城市id
							ci.name=this.provinceList[i].cityList[j].name;//获取城市名
							
							//将城市id,name放入城市数组
							this.city.push(ci);
						}
					}
				}
			},
			getDistrict(){
				for(var i=0;i<this.provinceList.length;i++){
					//寻找与省id匹配的索引
					if(this.provinceList[i].id==this.provinceId){
						// console.log(this.provinceId)
						for(var j=0;j<this.provinceList[i].cityList.length;j++){
							//寻找与市id匹配的索引
							if(this.provinceList[i].cityList[j].id==this.cityId){
								// console.log(this.cityId)
								if(this.district.length){//清空历史数据
									this.district=[];
								}
								for(var k=0;k<this.provinceList[i].cityList[j].districtList.length;k++){
									var di={};
									di.id=this.provinceList[i].cityList[j].districtList[k].id;//获取区id
									di.name=this.provinceList[i].cityList[j].districtList[k].name;//获取区名
									
									//将区id,name放入区数组
									this.district.push(di);
								}
							}
						}
					}
				}
			},
			getStreet() {
				for(var i=0;i<this.provinceList.length;i++){
					//寻找与省id匹配的索引
					if(this.provinceList[i].id==this.provinceId){
						for(var j=0;j<this.provinceList[i].cityList.length;j++){
							//寻找与市id匹配的索引
							if(this.provinceList[i].cityList[j].id==this.cityId){
								for(var k=0;k<this.provinceList[i].cityList[j].districtList.length;k++){
									//寻找与区id匹配的索引
									if(this.provinceList[i].cityList[j].districtList[k].id==this.districtId){
										//循环遍历输出街道
										if(this.street.length){//清空历史数据
											this.street=[];
										}
										for(var l=0;l<this.provinceList[i].cityList[j].districtList[k].streetList.length;l++){
											var st={};
											st.id=this.provinceList[i].cityList[j].districtList[k].streetList[l].id;
											st.name=this.provinceList[i].cityList[j].districtList[k].streetList[l].name;
											
											this.street.push(st);
										}
									}
								}
							}
						}
					}
				}
			}
		},
		onNavigationBarButtonTap(e) {

		},
		onLoad() {
		//默认展示id为1的项
			this.getProvince();
			this.mulSelect.push(this.province);
			
			this.provinceId=1;
			this.getCity();
			this.mulSelect.push(this.city);
			
			this.cityId=1;
			this.getDistrict();
			this.mulSelect.push(this.district);
			
			this.districtId=1;
			this.getStreet();
			this.mulSelect.push(this.street);
			
			// console.log(this.mulSelect)
		}
	}
</script>

css部分:

<style lang="scss">
	.active{
		color: #000000;
	}
	.content {
		width: 100%;
		height: 40px;
		line-height: 40px;
		.address{
			display: flex;
			justify-content: flex-start;
			image{
				width: 30px;
				height: 30px;
				margin: 5px 5px;
				vertical-align: middle;
			}
			picker{
				color: #CCCCCC;
			}
		}
	}
</style>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值