uniapp使用picker组件实现省市区选择三级联动

<template>
<!-- #ifndef MP-WEIXIN -->
<picker class="myInput" range-key="name" :range="addressList" mode="multiSelector"
						@columnchange="columnchange" @change="changeAddress">
<view class="editRow">
{{editForm.adress}}
</view>
</picker>
<!-- #endif -->
</template>

<script>
    export default {
        data(){
        return{
        timer: null, //节流器
	    addressList: [
					[],
					[],
					[]
	     ],
          }
        }
    },
        created() {
			// #ifndef MP-WEIXIN
			this.getProvince()
			this.getCity()
			// this.getDistrict()
			// #endif

		},
            // 获取省份
			getProvince() {
				const _this = this
				this.$cheeseApi({
					url: "/systemInfo/getAreaList",
					method: 'get',
					data: {
						type: 1,
						code: 0
					}
				}, true).then(res => {
					if (res.code === 200) {
						_this.addressList.splice(0, 1, [...res.data])
					}
				}).catch(err => {
					console.log(err, 'err');
				})
			},
			//获取市
			getCity(type = 2, code = 110000) {
				const _this = this
				this.$cheeseApi({
					url: "/systemInfo/getAreaList",
					method: 'get',
					data: {
						type,
						code
					}
				}, true).then(res => {
					if (res.code === 200) {
						_this.addressList.splice(1, 1, [...res.data])
						const item = res.data[0]
						_this.getDistrict(3, item.code)
					}
				}).catch(err => {
					console.log(err, 'err');
				})
			},
			//获取区
			getDistrict(type = 3, code = 110100) {
				const _this = this
				this.$cheeseApi({
					url: "/systemInfo/getAreaList",
					method: 'get',
					data: {
						type,
						code
					}
				}, true).then(res => {
					if (res.code === 200) {
						_this.addressList.splice(2, 1, [...res.data])
					}
				}).catch(err => {
					console.log(err, 'err');
				})
			},
			// 列改变
			columnchange(e) {
				clearTimeout(this.timer)
				const _this = this
				this.timer = setTimeout(() => {
					// console.log(e.detail, 'columnchange');
					const {
						column,
						value
					} = e.detail
					const item = {
						..._this.addressList[column][value]
					}
					if (column === 0) {
						console.log(item, 'item');
						_this.getCity(2, item.code)
					} else if (column === 1) {
						console.log(item, 'item');
						_this.getDistrict(3, item.code)
					}
				}, 300)

			},
			//选择省市区
			changeAddress(e) {
				console.log(e.detail.value, 'changeAddress');
				const _this = this
				const arr = e.detail.value
				let str = ''
				arr.forEach((el, index) => {
					const {
						name
					} = _this.addressList[index][el]
					console.log(name, 'name');
					str += `${index ? '-':''}${name}`
				})
				if(str){
					this.editForm.adress = str
					this.getIconColor('adress')
				}
				console.log(str, 'str');

			},
</script>

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Uniapp 中可以使用 uview-ui 组件库中的 `u-picker` 组件实现省市区三级联动功能。以下是一个简单的示例: 1. 首先,确保你已经安装了 uview-ui 组件库。可以通过 npm 安装或直接下载源码引入。 2. 在需要使用省市区三级联动的页面中,引入 `u-picker` 组件: ```vue <template> <view> <u-picker :data="provinceList" v-model="selectedProvince" @change="handleProvinceChange"></u-picker> <u-picker :data="cityList" v-model="selectedCity" @change="handleCityChange"></u-picker> <u-picker :data="districtList" v-model="selectedDistrict"></u-picker> </view> </template> <script> import { UPicker } from 'uview-ui'; export default { components: { UPicker, }, data() { return { provinceList: ['省1', '省2', '省3'], // 省份数据 cityList: [], // 城市数据,根据选择的省份动态生成 districtList: [], // 区域数据,根据选择的城市动态生成 selectedProvince: '', // 已选择的省份 selectedCity: '', // 已选择的城市 selectedDistrict: '', // 已选择的区域 }; }, methods: { handleProvinceChange(value) { // 根据已选择的省份 value,动态生成城市数据 // 可以通过接口请求获取对应省份下的城市数据 // 更新 cityList }, handleCityChange(value) { // 根据已选择的城市 value,动态生成区域数据 // 可以通过接口请求获取对应城市下的区域数据 // 更新 districtList }, }, }; </script> ``` 在上述示例中,我们使用了三个 `u-picker` 组件实现省市区三级联动。`provinceList` 是省份的数据源,`cityList` 和 `districtList` 是在选择省份和城市时动态生成的数据源。通过监听 `change` 事件,我们可以在选择省份和城市时更新相应的数据源。 注意:上述示例中的数据源只是示意,实际开发中需要根据项目需求使用真实的数据源。 希望以上示例对你有所帮助!如果有任何疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值