uniapp#实现自定义省市区三级联动

适用情况和效果

自定义地址选择适用于:前端展示的省市区县是由后端接口返回的(业务可能需要地区id或者其他数据);如果只是要选择位置,可以使用uni的api:uni.chooseLocation
手机端效果:
在这里插入图片描述

PC端效果:

使用的组件

实现该功能,首先需要一个弹出层,在下方弹出,还需要一个选择器。

  1. 弹出层 - uniPopupuniPopup 可以直接导入插件到项目中 ;
  2. 选择器 - picker-view: 官方文档中,选择器有picker和picker-view两种,picker中有一个省市区选择器,但为什么不用呢,看看官方怎么说:在这里插入图片描述可以看出,使用picker-view是全平台友好的;

功能实现

template代码

		<uni-popup ref="popup" type="bottom">
			<view class="popup">
				<view class="picker-btn">
					<view class="left" @click="cancel">取消</view>
					<view class="right" @click="confirm">确定</view>
				</view>
				<picker-view :indicator-style="indicatorStyle" :value="valueArr" @change="bindChange">
					<picker-view-column>
						<view class="item" v-for="(item,index) in province" :key="index">{{item.provinceName}}</view>
					</picker-view-column>
					<picker-view-column v-if="province[valueArr[0]]">
						<view class="item" v-for="(item,index) in province[valueArr[0]].children" :key="index">{{item.name}}</view>
					</picker-view-column>
					<picker-view-column v-if="province[valueArr[0]]">
						<view class="item" v-for="(item,index) in province[valueArr[0]].children[valueArr[1]].children" :key="index">{{item.name}}</view>
					</picker-view-column>
				</picker-view>
			</view>
		</uni-popup>

data数据

			indicatorStyle: `height: ${Math.round(uni.getSystemInfoSync().screenWidth/(750/100))}px;`,
			valueArr: [0, 0, 0], // 用于判断当前滑动的是哪一列
			province: [], // 数据列表

方法

初始化方法:
进入页面时调用,loadAddr()是具体的接口方法,加载省数据

		initLoadArea() {
			loadAddr().then(res => {
				if (res.status) {
					this.province = res.data;
					this.loadCity(this.province[0].id)
				}
			})
		},

加载市数据:
loadChildAddr()是具体的加载子地区的方法;

		loadCity(parentId) {
			const params = {
				parent_id: parentId
			}

			loadChildAddr(params).then(res => {
				if (res.status) {
					if (this.province[this.valueArr[0]].children === undefined) {
						this.$set(this.province[this.valueArr[0]], 'children', [])
						res.data.forEach(item => {
							this.province[this.valueArr[0]].children.push(item)
						})
						this.loadArea(this.province[this.valueArr[0]].children[this.valueArr[1]].id)
					}
				}
			})
		},

加载区(县)数据:
我这里的加载省以下的数据是同一个接口,实际不同的情况可能是不同的接口方法,方法仅供参考,实际可根据需求选择更适合自己项目的方式

		loadArea(parentId) {
			const params = {
				parent_id: parentId
			}
			loadChildAddr(params).then(res => {
				if (res.status) {
					this.area = res.data;
					if (this.province[this.valueArr[0]].children[this.valueArr[1]].children === undefined) {
						this.$set(this.province[this.valueArr[0]].children[this.valueArr[1]], 'children', [])
						res.data.forEach(item => {
							this.province[this.valueArr[0]].children[this.valueArr[1]].children.push(item)
						})
					}
				}
			})
		},

picker-view的change事件绑定的方法:
在这里插入图片描述

		bindChange(e) {
			const val = e.detail.value;
			if (this.valueArr[0] !== val[0]) {
				this.loadCity(this.province[val[0]].id)
			} else if (this.valueArr[1] !== val[1]) {
				this.loadArea(this.province[val[0]].children[val[1]].id)
			}
			this.valueArr = val
		},

显示/关闭弹出层popup的方法:
popup是使用ref来弹出的,所以在写template代码的时候,要给uni-popup加上一个ref

		toggleTab() {
			this.$refs.popup.open();
		},
		cancel() {
			this.$refs.popup.close();
		},

样式代码

最后附上css:

.popup {
	height: fit-content;
	width: 100%;
	background: #fff;
}

.picker-btn {
	display: flex;
	height: 100upx;
	width: 100%;
	line-height: 100upx;
	background: #fff;
	font-size: 34upx;
	z-index: 1;
	border-bottom: 1rpx solid #f8f8f8;

	.left {
		flex: 1;
		color: #0076FF;
		padding-left: 40upx;
		box-sizing: border-box;
	}

	.right {
		flex: 1;
		text-align: right;
		padding-right: 40upx;
		color: #FE4533;
		box-sizing: border-box;
	}
}

picker-view {
	width: 100%;
	height: 500rpx;
	display: relative;
}
.item {
	line-height: 100rpx;
	text-align: center;
}
  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
Uniapp是一款跨平台的开发框架,可以用于开发多种类型的应用程序,包括小程序、H5、App等。对于自定义县三级联动组件,我们可以参照以下步骤来实现。 首先,我们需要获取县的数据源,可以从后台接口获取或者使用静态的json文件。将数据源存储在data的变量中。 接下来,我们可以创建一个Picker组件来实现三级联动选择。通过使用uni-app的Picker组件,我们可以选择份,然后根据选择的份,展示对应的城和县的选项。同时,需在Picker组件上设置改变份选项时的change事件,以及城和县选项的列数、初始值等属性。 在change事件中,我们根据选择的份,从数据源中获取对应的城和县选项,并更新到data的变量中。然后,将更新后的data传递给Picker组件,刷新选项。 最后,我们可以在页面上引入并使用自定义县三级联动组件。通过v-model指令,将选择的县的值与页面的数据进行双向绑定,并可以在提交时获取选中的县的值,进行后续的业务处理。 通过以上步骤,我们可以实现定义县三级联动组件。根据不同的需求,我们还可以对组件进行优化和扩展,例如添加搜索功能、增加默认值等。总之,Uniapp提供了强大的开发能力,可以帮助我们轻松地实现定义县三级联动组件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值