uniapp picker组件实现二级联动

在这里插入图片描述
效果图如上

html

<picker mode="multiSelector" @change="bindPickerChange" @columnchange="columnchange" :value="index" :range="array"
	 range-key="title">
	<view class="uni-input">{{title}}</view>

</picker>

js

<script>
	export default {
		data() {
			return{
				index: [0, 0],
				array: [[],[]],
				childArr: [], // 二级分类数据源
				title: '请选择',
			}
		},
		methods: {
			// 任务分类
			getCate() {
				this.Get('请求的接口地址').then((res) => {
					if (!res.err) {
						// 返回的数据格式
						// [
							// {id: 4, title: "悬赏", desc: "", child: [{id: 10, title: "现金悬赏", desc: ""}]}
						// ]
						// 一级分类的数据源
						this.array[0] = res.result
						// 将数据源中的二级分类 push 进 childArr,作为二级分类的数据源
						this.childArr = res.result.map((item) => item.child)
						// 第一次打开时,默认给一级分类添加它的二级分类
						this.array[1] = this.childArr[0]
					}
				})
			},
			// 获取二级分类
			columnchange(e) {
				// 当滚动切换一级分类时,为当前的一级分类添加它的子类
				if (e.detail.column == 0) {
					// #ifdef H5
					// 在小程序中直接赋值无效  H5 可直接赋值
					this.array[1] = this.childArr[e.detail.value]
					// #endif
					// #ifdef MP-WEIXIN
					// 在 H5 环境下 $set 会导致一级分类无法滚动, 小程序正常运行
					this.$set(this.array, 1, this.childArr[e.detail.value])
					// #endif
				}
			},

			// 选择任务分类
			bindPickerChange: function(e) {
				console.log('picker发送选择改变,携带值为', e.target.value)
				let value = e.target.value;
				this.index = value;
				if (this.array[0].length != 0) {
					this.title = this.array[0][this.index[0]].title
				};
				if (this.array[1].length != 0) {
					this.title += ',' + this.array[1][this.index[1]].title
				}

			},
		}
	}
</script>
UniAppPicker组件是一个用于选择数据的交互控件,它支持多种数据类型的筛选。实现二级联动功能通常涉及到两个Picker组件之间的联动,即第一个Picker的选择会影响到第二个Picker的数据源。 以下是步骤和示例代码: 1. **初始化数据**: 首先,你需要有一个包含两层数据结构的数据源,通常是嵌套的对象数组,如`[{label: '一级分类', children: [{label: '二级分类'}, ...]}]`。 ```javascript const provinces = [ { label: '省份一', children: [{ label: '城市一' }, { label: '城市二' }] }, { label: '省份二', children: [{ label: '城市三' }, { label: '城市四' }] } ]; ``` 2. **绑定Picker**: 在模板上,给每个Picker设置data属性,并监听它们的变化事件,例如`change`事件。 ```html <view> <picker bindchange="onProvinceChange" value="{{province}}" range="{{provinces}}"> 省份: </picker> <picker bindchange="onCityChange" value="{{city}}" range="{{cities}}"> 城市: </picker> </view> ``` 3. **获取和更新数据**: 在对应的事件处理函数里,根据当前选择的一级分类更新二级分类的数据源。你可以通过`this.$refs`访问到Picker实例并获取其值。 ```javascript methods: { onProvinceChange(province) { this.cities = province.children; }, onCityChange(city) { console.log('选择了:', city.label); } } ``` 4. **注意点**: - 当数据量较大时,性能可能会受到影响,尽量优化数据结构和渲染策略。 - 如果需要更复杂的联动逻辑,比如依赖更多层级的数据,可以考虑使用递归或动态生成数据源。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值