uniapp picker实现:市区镇村4级懒加载

使用这种方法的原因:

  • 市区镇村4级数据太大,后台接口响应时间太长

方法实现:

  • 样式
    在这里插入图片描述

  • view

      <view class="inputbox clearfix outbox" @click="showTrue">
        <text class="fl lefttxt">所在地区</text>
		<picker mode="multiSelector" :range="mulSelect" :range-key="'deptName'" @change="pickerChange" @columnchange="colChange">
			<view :class="{active:isActive}" v-if="!address">
				<u--input fontSize="12px" class="fl oneinput" suffixIcon="arrow-down" suffixIconStyle="color: #3CB261"
				v-model="userInfo.address" disabled placeholder="请选择" border="none"></u--input>
			</view>
			<view v-else style="font-size:12px;">{{address}}</view>
		</picker>
      </view>
  • data
  data() {
      return {
		province: [], //省数组
		city: [], //市数组
		district: [], //区数组
		street: [], //街道数组
		mulSelect: [], //四级联动显示数组,该数组的值为[[province],[city],[district],[street]]
		provinceId: 0, //省的id
		cityId: 0, //市的id
		districtId: 0,//区的id
		isActive:false,
		address:'',
      }
 }
  • methods
    onLoad(options) {
		this.getProvince();
    },
    methods: {
        colChange(e) {
			switch (e.detail.column){
				case 0://选择市
					this.provinceId=this.mulSelect[0][e.detail.value].deptId;
					// 获取对应的 区县
					getCountyListByCityApi({deptId:this.provinceId}).then(res=>{
						if(res.code == 200){
							this.city = res.data;
							this.mulSelect[1]=this.city;
							// 获取对应的乡镇
							getCountyListByCityApi({deptId:this.city[0].deptId}).then(res=>{
								if(res.code == 200){
									this.district = res.data;
									this.mulSelect[2]=this.district;
									// 获取对应的村
									getCountyListByCityApi({deptId:this.district[0].deptId}).then(res=>{
										if(res.code == 200){
											this.street = res.data;
											this.mulSelect[3]=this.street;
										}
									})
								}
							})
						}
					})
					break;
				case 1://选择区县
					this.cityId=this.mulSelect[1][e.detail.value].deptId;
					// 获取对应的乡镇
					getCountyListByCityApi({deptId:this.cityId}).then(res=>{
						if(res.code == 200){
							this.district = res.data;
							this.mulSelect[2]=this.district;
							// 获取对应的村
							getCountyListByCityApi({deptId:this.district[0].deptId}).then(res=>{
								if(res.code == 200){
									this.street = res.data;
									this.mulSelect[3]=this.street;
									
								}
							})
						}
					})
					break;
				case 2://选择镇
					this.districtId=this.mulSelect[2][e.detail.value].deptId;
					getCountyListByCityApi({deptId:this.districtId}).then(res=>{
						if(res.code == 200){
							this.street = res.data;
							this.mulSelect[3]=this.street;
						}
					});
					break;
				case 3://选择街道
					break;
				default:
					break;
			}
		},
        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.deptName+s_city.deptName+s_district.deptName+s_street.deptName;
			//将字体颜色修改为黑色
			this.isActive=true;
			console.log(s_street);
			// 给表单复制
			this.userInfo.address = s_street.deptId
		},
    	getProvince() { // 此方法可以继续优化
			var that = this;
			getAllCityListApi({}).then(res=>{
				that.province = []
				if(res.code == 200){
					that.province = res.data;;
					that.mulSelect.push(that.province);
					var p = that.province[0].deptId;
					getCountyListByCityApi({deptId:p}).then(res=>{
						if(res.code == 200){
							that.city = res.data;
							that.mulSelect.push(that.city);
							var p = that.city[0].deptId;
							getCountyListByCityApi({deptId:p}).then(res=>{
								if(res.code == 200){
									that.district = res.data;
									that.mulSelect.push(that.district);
									var p = that.district[0].deptId;
									getCountyListByCityApi({deptId:p}).then(res=>{
										if(res.code == 200){
											that.street = res.data;
											that.mulSelect.push(that.street);
										}
									})
								}
							})
						}
					})
				}
			})
		},

    }
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
uniapp picker是指在uniapp框架中使用的选择器组件。它可以在开发者编写的一套代码中,通过调用picker组件实现在iOS、Android、Web以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)等多个平台上的城市选择、日期选择、时间选择等功能。 在使用uniapp制作微信小程序时,可以使用picker组件封装底部选择弹框选择器,实现对自定义确定和取消按钮颜色的支持。这样可以解决微信中弹框样式不可自定义的问题,使得选择框的样式与项目主题样式保持一致。 总结来说,uniapp pickeruniapp框架中的一个组件,用于实现多平台的选择器功能,并且可以自定义确定和取消按钮颜色。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [uniapp使用picker](https://blog.csdn.net/weixin_46181037/article/details/115670692)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [使用uniapppicker-view封装底部选择弹框选择器,解决微信小程序中不可自定义样式问题](https://download.csdn.net/download/lmx15063393957/85416764)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值