mpvue微信小程序多列选择器实现省份城市选择
本文介绍在mpvue框架下,如何利用微信小程序的multiSelector多列选择器实现省份与城市的级联选择。由于默认region模式仅保存名称,本文通过接口获取包含id的JSON数据,结合@change和@columnchange事件处理逻辑,完成省市数据的动态加载与提交,确保仅保存省份和城市ID。
前言
前言
微信小程序原生提供了省市区选择的picker组件,只需将mode属性设置为region即可使用。
原生省市区选择器限制
<picker
mode="region"
bindchange="bindRegionChange"
value="{{region}}"
custom-item="{{customItem}}"
>
由于原生省市区选择器仅能保存名称而无法保存ID,且本文不需要三级城市选择功能,因此计划通过mode="multiSelector"来实现省份和城市的选择。
城市数据json格式
关于省份和城市数据的获取,这里通过接口去获取数据,返回的json格式为
城市数据JSON格式
{
"code": 0,
"msg": "success",
"data": [
{
"id": 2,
"name": "北京",
"children": [
{
"id": 36,
"name": "北京市"
}
]
}
]
}
在我们保存提交的时候只需要保存省份和城市的id即可
picker多列选择器的用法
多列选择器配置与用法
<picker
mode="multiSelector"
@change="bindCityChange"
@columnchange="bindCityColumnChange"
:value="multiIndex"
:range="multiArray"
range-key="name"
>
<view class="picker">选择城市{{userInfo.province.name}},{{userInfo.city.name}}</view>
</picker>
设置picker mode属性为multiSelector
mode="multiSelector"
1、这里需要注意的是,在mpvue中无法直接使用bindchange和bindcolumnchange,而是使用@change和@columnchange这种方式
2、value是一个数组,例如我们有两列
[["北京", "湖南"], ["长沙", "永州"]]
3、range也是一个数组,指定的是value值的选中索引值,下标从0开始,如[0,0]
4、如果我们的数据是一个二维对象数组,我们可以通过使用range-key来指定Object 中 key 的值作为选择器显示内容
5、当我们确认选中之后会触发@change事件
// 城市选择 获取选中的值 [0,0] 这里需要注意的是获取值的方式在mpvue中通过e.mp.detail.value而不是e.detail.value
bindCityChange(e) {
// 选中的值索引
console.log(e.mp.detail.value[0], e.mp.detail.value[1]);
// 选中的省份和城市数据
console.log(
this.multiArray[0][e.mp.detail.value[0]],
this.multiArray[1][e.mp.detail.value[1]]
);
this.userInfo.province = this.multiArray[0][e.mp.detail.value[0]];
this.userInfo.city = this.multiArray[1][e.mp.detail.value[1]];
},
6、在我们滚动每一列的值的时候会触发@columnchange事件
7、通过e.mp.detail.column和e.mp.detail.value可以获取到修改列对应的值
事件处理与数据更新
console.log(
"修改的列为",
e.mp.detail.column,
",值为",
e.mp.detail.value
);
通过获取到修改的数据更新multiIndex的值
级联数据加载逻辑
// 监听滚动事件 滚动第一列 修改第二列数据
bindCityColumnChange(e) {
// 更新multiIndex的值
this.multiIndex[e.mp.detail.column] = e.mp.detail.value;
//加载对应省份下城市数据
switch (e.mp.detail.column) {
case 0:
// this.multiArray[1] = this.cityList[e.mp.detail.value].children;
this.multiArray = [
this.cityList,
this.cityList[e.mp.detail.value].children
];
break;
}
},
data() {
return {
multiIndex: [0, 0],
multiArray: [],
}
}
参考阅读
参考阅读
- https://www.jb51.net/article/121309.htm
- https://developers.weixin.qq.com/miniprogram/dev/component/picker.html
总结
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对本站的支持。
免登录快速分享代码:适合面试协作的轻量级JS在线运行工具推荐
2026-11-05 14:45:59
JS空字符串和纯空格转浮点数的结果是什么
2026-11-05 11:04:42
JS在线格式化缩进混乱怎么办?配置项调整技巧
2026-11-04 23:27:25
JS怎么获取秒级时间戳
2026-11-03 21:45:29
JS时间戳怎么从毫秒转换为秒
2026-11-03 20:04:14
