uview picker 组件实现只要省和市的两级数据联动选择器

uview picker 组件实现只要省和市的两级数据联动选择器


前言

在开发过程中,业务需求只要省份和城市的选择器,但是 uview 中的 picker 组件是省市区三级联动的,在网上也没有找到合适的只有省份和城市的选择器组件,就自己看了下 uview picker 组件的源码,做了一些改动,实现了只有省市的选择器,项目中使用的是 uview1.0 但这个方法对于 uview2.0 应该也是试用的


一、uview 1.0 picker 组件分析

uview 中 picker 组件的效果
在这里插入图片描述
选中后
在这里插入图片描述

直接使用组件代码

<template>
	<view>
		<u-form :model="model" ref="uForm" >
			<u-form-item  label="所在地区" prop="region" label-width="150">
				<u-input  type="select" :select-open="pickerShow" v-model="model.region"
					placeholder="请选择地区" @click="pickerShow = true"></u-input>
			</u-form-item>
			<u-picker mode="region" v-model="pickerShow" @confirm="regionConfirm"></u-picker>
		</u-form>
		<button type="default" @click="submit()">提交 </button>
	</view>
</template>
<script>
	export default {
		data() {
			return {
				model: {
					region: '',
				},
				pickerShow: false,
			}
		},
		methods: {
			// 选择地区回调
			regionConfirm(e) {
				console.log(e);
				this.model.region = e.province.label + '-' + e.city.label + '-' + e.area.label;
			},
			submit(){
				console.log(this.model)
			}
		}
	}
</script>

<style>

</style>

二、picker 组件分析改造

picker 组件源码位置 : uview-ui/components/u-picker

原本的 picker 选择器的展示是 省 市 区 三级,那么只要找到 区的位置,删掉,就好了
在这里插入图片描述
在这里插入图片描述
这个时候看之前的测试页面,选择器中显示的就只有 省,市 两列了,但是现在选择后,页面中显示的还是有区域的
在这里插入图片描述
这里需要在引用组件的位置做一些改动,html 部分一样,js 部分在选择后的回调函数中处理一下

<script>
	export default {
		data() {
			return {
				model: {
					region: '',
				},
				pickerShow: false,
			}
		},
		methods: {
			// 选择地区回调
			regionConfirm(e) {
				// 这里,页面中显示选择的数据中将区域部分的不显示就好了
				//this.model.region = e.province.label + '-' + e.city.label + '-' + e.area.label;
				this.model.region = e.province.label + '-' + e.city.label;
			},
			submit(){
				console.log(this.model)
			}
		}
	}
</script>

这个时候再看效果,完成 ~!
在这里插入图片描述

以上就是对于 uview1.0 中的 picker 选择器 改为 只要省份,城市 两级的解决办法啦,方案可能有不成熟的地方,欢迎指正交流 ~~

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现五级选择器,可以使用uView组件库中的Picker组件,并在其内部嵌套多个Picker组件。下面是一个五级选择器的示例代码: ```html <template> <view class="picker"> <picker :range="provinceList" @change="provinceChange"></picker> <picker :range="cityList" @change="cityChange"></picker> <picker :range="districtList" @change="districtChange"></picker> <picker :range="streetList" @change="streetChange"></picker> <picker :range="villageList" @change="villageChange"></picker> </view> </template> <script> export default { data() { return { provinceList: ['省份1', '省份2', '省份3'], cityList: ['城市1', '城市2', '城市3'], districtList: ['区县1', '区县2', '区县3'], streetList: ['街道1', '街道2', '街道3'], villageList: ['村庄1', '村庄2', '村庄3'] } }, methods: { provinceChange(e) { // 省份变化时更新城市列表 const index = e.detail.value this.cityList = this.getCityList(index) }, cityChange(e) { // 城市变化时更新区县列表 const index = e.detail.value this.districtList = this.getDistrictList(index) }, districtChange(e) { // 区县变化时更新街道列表 const index = e.detail.value this.streetList = this.getStreetList(index) }, streetChange(e) { // 街道变化时更新村庄列表 const index = e.detail.value this.villageList = this.getVillageList(index) }, villageChange(e) { // 村庄变化时输出最终结果 const index = e.detail.value const province = this.provinceList[index[0]] const city = this.cityList[index[1]] const district = this.districtList[index[2]] const street = this.streetList[index[3]] const village = this.villageList[index[4]] console.log(`${province}-${city}-${district}-${street}-${village}`) }, getCityList(provinceIndex) { // 根据省份获取城市列表 // TODO: 根据实际需求替换为异步请求或本地数据 return ['城市1', '城市2', '城市3'] }, getDistrictList(cityIndex) { // 根据城市获取区县列表 // TODO: 根据实际需求替换为异步请求或本地数据 return ['区县1', '区县2', '区县3'] }, getStreetList(districtIndex) { // 根据区县获取街道列表 // TODO: 根据实际需求替换为异步请求或本地数据 return ['街道1', '街道2', '街道3'] }, getVillageList(streetIndex) { // 根据街道获取村庄列表 // TODO: 根据实际需求替换为异步请求或本地数据 return ['村庄1', '村庄2', '村庄3'] } } } </script> <style> .picker { display: flex; flex-direction: row; justify-content: space-between; align-items: center; } </style> ``` 在上面的代码中,我们使用了五个Picker组件,分别对应省份、城市、区县、街道、村庄五个级别。每当用户选择某个级别的选项时,我们会根据该级别的值更新下一个级别的选项列表。当用户选择最后一个级别时,我们会输出最终的选择结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值