[小程序开发]picker实现二级联动
2024-04-30 09:20:00 by wst
小程序
问题
picker的官方例子是没有联动的,在实际开发当中经常有联动的需求。
比如在选择班级的时候,不同年级的班级个数不一样。就需要实现联动。
解决方法
这里只给出wxml文件和js文件的内容,如有其他问题可以留言。
视图wxml文件:
逻辑js文件:
Page({
data: {
from: "",
multiData: [
{
"label": "七",
"value": 1,
"children": [
{"label": "一", "value": 1},
{"label": "二", "value": 2},
{"label": "三", "value": 3},
{"label": "四", "value": 4},
{"label": "五", "value": 5},
{"label": "六", "value": 6},
{"label": "七", "value": 7},
{"label": "八", "value": 8},
{"label": "九", "value": 9},
{"label": "十", "value": 9},
]
}, {
"label": "八",
"value": 1,
"children": [
{"label": "一", "value": 1},
{"label": "二", "value": 2},
{"label": "三", "value": 3},
{"label": "四", "value": 4},
{"label": "五", "value": 5},
{"label": "六", "value": 6},
{"label": "七", "value": 7},
{"label": "八", "value": 8},
{"label": "九", "value": 9},
]
}
],
multiIndex: [0, 0],
},
onLoad: function (options) {
console.log("options:", options);
this.setData({
from: options.from,
});
var _this = this;
console.log(_this.data.multiData);
var multiData = _this.data.multiData;
var multiIndex = _this.data.multiIndex;
_this.setData({
multiArray: [
multiData,
multiData[0].children,
],
})
},
bindMultiPickerChange: function (e) {
console.log("picker发送选择改变,携带值为", e.detail.value);
this.setData({
multiIndex: e.detail.value,
});
},
bindMultiPickerColumnChange: function (e) {
console.log("修改的列为", e.detail.column, ",值为", e.detail.value);
var _this = this;
var multiData = _this.data.multiData;
var multiIndex = _this.data.multiIndex;
var columnIndex = e.detail.column;
var columnValue = e.detail.value;
multiIndex[columnIndex] = columnValue;
_this.setData({
multiArray: [
multiData,
multiData[multiIndex[0]].children,
],
})
console.log("one:", this.data.multiArray[0][this.data.multiIndex[0]].label);
console.log("two:", this.data.multiArray[0][this.data.multiIndex[0]].children[this.data.multiIndex[1]].label)
},
});
总结
这里通过二级联动实现了班级的选择。
注意multiArray的动态赋值。
如果掌握了这个方法,还可以实现三级联动或者四级联动。
后续
细心的读者可能会发现,当用户不选择班级(使用班级的默认值时)界面上仍然显示“请选择”,显然是个bug,经过思考,解决方法如下:
添加一个标志位,当用户选完班级,点击确定后标志位变化为true.
js文件变动:
wxml文件变动:
注意第4行的变化。