uView2.0 u-picker三级联动省市区

效果图:
在这里插入图片描述

html:

<u-form-item @click="poptanqi" label="所在地区" labelWidth="70" borderBottom ref="item1">
					<u-picker keyName="name" :show="addressShow" ref="uPicker" @cancel="pickerCancel" :columns="columns"
						@confirm="confirm" @change="changeHandler">
					</u-picker>
					<view>{{getAddressText()}}</view>
</u-form-item>

script:

	import {
		areaList
	} from '@/utils/address-data'
	export default {
		data(){
			return {
				//地址展示框
				addressShow: false,
				getLocationState: false,
				//要提交的表单信息
				userAddress: {},
				//三级联动组件展示框
				addressShow:false,
				//省市区数据
				columns: [
					[],
					[],
					[]
				]
			}
	},
	created() {
			this.columns[0] = areaList;
			this.columns[1] = areaList[0].cities;
			this.columns[2] = areaList[0].cities[0].districts;
	},
	computed: {
			getAddressText() {
				return () => this.userAddress.province + '  ' + this.userAddress.city + '  ' + this.userAddress.area;
			}
	},
	methods:{
		pickerCancel() {
				//隐藏联动展示框
				this.addressShow = false;
				//重置联动数据为初始状态
				this.$refs.uPicker.setIndexs([0, 0, 0], true);
				this.$refs.uPicker.setColumnValues(0, areaList);
				this.$refs.uPicker.setColumnValues(1, areaList[0].cities);
				this.$refs.uPicker.setColumnValues(2, areaList[0].cities[0].districts);
			},
		},
		//三级联动框滑动选择后触发的事件
		changeHandler(e) {
				const {
					columnIndex,
					value,
					values, // values为当前变化列的数组内容
					index,
					indexs,
					// 微信小程序无法将picker实例传出来,只能通过ref操作
					picker = this.$refs.uPicker
				} = e
				// 当第一列值发生变化时,变化第二列(后一列)对应的选项
				if (columnIndex === 0) {
					// picker为选择器this实例,变化第二列对应的选项
					picker.setColumnValues(1, areaList[index].cities)
					picker.setColumnValues(2, areaList[indexs[0]].cities[0].districts)
				} else if (columnIndex === 1) {
					// picker为选择器this实例,变化第三列对应的选项
					picker.setColumnValues(2, areaList[indexs[0]].cities[indexs[1]].districts)
				}
		},
		// 点击确定事件,回调参数为包含columnIndex、value、values
		confirm(e) {
			console.log('confirm', e)
			//省
			this.userAddress.province = e.value[0].name;
			//市
			this.userAddress.city = e.value[1].name;
			//区
			this.userAddress.area = e.value[2].name;
			//区域代码
			this.userAddress.regionId = e.value[2].id;
			this.pickerCancel();
		},
		poptanqi() {
				let that = this;
				if (!that.getLocationState) {
					uni.showLoading({
						title: '加载中'
					});
					uni.getLocation({
						type: 'wgs84',
						isHighAccuracy: true,
						success: function(res) {
							console.log('当前位置的经度:' + res.longitude);
							console.log('当前位置的纬度:' + res.latitude);
							//自定义的接口,按照腾讯位置服务文档接入
							getAdInfoByLngAndLat({
								longitude: res.longitude,
								latitude: res.latitude
							}).then(res2 => {
								if (res2.data.head.code == '0') {
									let resData = res2.data.details;
									if (resData.status == 0) {
										that.$set(that.userAddress, 'province', resData.result.ad_info
											.province);
										that.$set(that.userAddress, 'city', resData.result.ad_info
											.city);
										that.$set(that.userAddress, 'area', resData.result.ad_info
											.district);
										that.$set(that.userAddress, 'regionId', resData.result.ad_info
											.adcode + '000');
										that.getLocationState = true;
									} else {
										that.$nextTick(()=>{
											that.$refs["cityPicker"].show();
										})
									}
								} else {
									that.$nextTick(()=>{
										that.$refs["cityPicker"].show();
									})
								}
							});
						},
						fail(err) {
							that.addressShow = true;
							console.log('遇到错误!');
							console.log(err);
						},
						complete() {
							uni.hideLoading();
						}
					});
				} else {
					that.$nextTick(()=>{
						this.$refs["cityPicker"].show();
					})
				}
			},
}

address-data.js下载地址

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
uview2.0的u-picker组件实现省市二级联动,可以按照以下步骤操作: 1. 在页面中引入u-picker组件。 2. 在页面中定义两个变量,一个用来存储省份列表,一个用来存储城市列表。初始化时,省份列表为空,城市列表为第一个省份的城市列表。 3. 在u-picker组件中设置mode为multi-column,表示多列选择,设置columns为2,表示有两列。 4. 设置第一列的数据源为省份列表,第二列的数据源为城市列表。 5. 监听u-picker组件的change事件,在事件处理函数中更新当前省份和城市列表,并根据选中的省份动态更新城市列表。 下面是示例代码: ```html <template> <view> <u-picker @change="onPickerChange" :mode="mode" :columns="columns" :list="pickerList"></u-picker> </view> </template> <script> export default { data() { return { mode: 'multi-column', columns: 2, provinces: [], // 省份列表 cities: [], // 当前省份的城市列表 pickerList: [this.provinces, this.cities] // u-picker组件的数据源,初始时为第一个省份的城市列表 } }, created() { // 初始化时从服务端获取省份列表和第一个省份的城市列表 this.getProvinceList().then(() => { this.getCitiesByProvince(this.provinces[0]).then(() => { // 更新u-picker组件的数据源 this.pickerList = [this.provinces, this.cities]; }); }); }, methods: { onPickerChange(e) { const column = e.currentTarget.dataset.column; const index = e.detail.value[column]; if (column === '0') { // 选中了省份 const province = this.provinces[index]; this.getCitiesByProvince(province).then(() => { // 更新u-picker组件的数据源 this.pickerList = [this.provinces, this.cities]; }); } }, getProvinceList() { // TODO: 从服务端获取省份列表 return new Promise((resolve) => { this.provinces = ['北京市', '上海市', '广东省']; resolve(); }); }, getCitiesByProvince(province) { // TODO: 从服务端获取指定省份的城市列表 return new Promise((resolve) => { if (province === '北京市') { this.cities = ['北京市']; } else if (province === '上海市') { this.cities = ['上海市']; } else if (province === '广东省') { this.cities = ['广州市', '深圳市', '珠海市']; } resolve(); }); } } } </script> ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值