uniapp picker-view实现省市区三级联动

该博客展示了如何在Vue中使用picker-view组件实现省市区三级联动的效果。代码中,作者首先引入了静态的省市区数据,然后在created钩子中初始化数据。picker-view组件的change事件用于处理不同级别的联动,而onSubmit和onCancel方法分别处理确定和取消操作。样式部分定义了组件的布局和按钮样式。
摘要由CSDN通过智能技术生成

通过picker-view组件实现的省市区三级联动

代码中已将其 组件化,使用的是静态的数据,也可以动态进行获取

实现如下图
在这里插入图片描述
代码如下

<template>
	<view class="region-box">
		<picker-view :value="region" @change="bindChange">
			<picker-view-column>
				<view class="center" v-for="(item, index) in regionList" :key="index">
					{{ item.name }}
				</view>
			</picker-view-column>
			<picker-view-column v-if="regionList[region[0]]">
				<view class="center" v-for="(item, index) in regionList[region[0]].city" :key="index">
					{{ item.name }}
				</view>
			</picker-view-column>
			<picker-view-column v-if="regionList[region[0]]">
				<view class="center"
					v-for="(item, index) in regionList[region[0]].city[region[1]].area" :key="index">
					{{ item }}
				</view>
			</picker-view-column>
		</picker-view>

		<view style="width: 100%;" class="btn-Block center">
			<view class="btn-left center" @click="onCancel">取消</view>
			<view class="btn-right center" @click="onSubmit">
				确定
			</view>
		</view>
	</view>
</template>

<script>
	import { data } from '../region.js'		//引入的省市区静态数据文件
	export default {
		name:"levelLinkage",
		created() {
			this.regionList = data
		},
		data() {
			return {
				region: [0, 0, 0],	//地址每列的index
				regionList: [],		//地址数据,格式为 三级地址全返回
				regionText: ''
			};
		},
		methods: {
			//选择值改变事件
			bindChange(e) {
				// 用于对比滑动的是哪一列数据
				const val = e.detail.value
				if(this.region[0] !== val[0]) {
					// 如果滑动的是第一列数据,让二三列恢复到0
					this.region = [val[0], 0, 0]
				} else if(this.region[1] !== val[1]) {
					// 滑动的是第二列数据
					this.region = [val[0], val[1], 0]
				} else {
					this.region = e.detail.value;
				}
			},
			//确定按钮操作
			onSubmit: function() {
				this.regionText = this.regionList[this.region[0]].name + ' ' + this.regionList[this.region[0]]
					.city[this.region[1]].name + ' ' + this.regionList[this.region[0]].city[this.region[1]]
					.area[this.region[2]]
				console.log(this.regionText)
			},
			onCancel() {
				// 调用父组件方法关闭
				this.$emit('onCancel')
			}
		}
	}
</script>

<style lang="scss" scoped>
.region-box {
	background-color: #FFFFFF;

	.center {
		display: flex;
		justify-content: center;
		align-items: center;
	}

	.btn-Block {
		width: 100%;
		background-color: #FFFFFF;
		padding: 25upx;
		height: 230upx;

		.btn-left {
			width: 250upx;
			height: 80upx;
			border-radius: 10upx;
			color: #289CFD;
			background-color: rgba(153, 153, 153, 0.2);
			margin-right: 30upx;
		}

		.btn-right {
			width: 250upx;
			height: 80upx;
			border-radius: 10upx;
			color: #FFFFFF;
			background-color: #289CFD;
		}
	}

	.picker-view {
		background-color: #FFFEFD;
	}

	picker-view {
		width: 100%;
		height: 600upx;
	}

</style>
uview的u-picker组件可以实现省市区三级联动,使用时需要设置相应的数据源。以下是一个简单的例子: ```html <template> <view> <u-picker :picker-data="pickerData" :default-value="defaultValue" @change="onChange" /> </view> </template> <script> export default { data() { return { pickerData: [], defaultValue: [], }; }, mounted() { // 获取省市区数据 this.getAreaData(); }, methods: { async getAreaData() { // 发送请求获取省市区数据 const res = await this.$http.get('/api/area'); // 处理数据,将数据转换为u-picker可用的格式 this.pickerData = [ { label: '请选择', value: '', children: res.data.map((province) => ({ label: province.name, value: province.id, children: province.cities.map((city) => ({ label: city.name, value: city.id, children: city.areas.map((area) => ({ label: area.name, value: area.id, })), })), })), }, ]; // 设置默认值为当前所在地区 this.setDefaultArea(); }, setDefaultArea() { // 获取当前所在地区,将其设置为默认值 const area = this.$store.state.area; if (area.province && area.city && area.area) { this.defaultValue = [area.province.id, area.city.id, area.area.id]; } }, onChange(value) { // 处理选中的值 console.log(value); }, }, }; </script> ``` 在上面的代码中,我们使用了u-picker组件,并将picker-data设置为一个数组,数组中包含省市区三级数据。defaultValue设置为一个数组,数组中包含当前所在地区的id,这样在渲染u-picker时,就会自动选中对应的省市区。当用户选择省市区时,会触发onChange事件,我们可以在这里处理用户选择的省市区数据。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值