在 UniApp 中实现 H5 省市区选择器,可以使用 picker 组件结合省市区数据实现。以下是具体步骤和代码示例:
1. 数据准备
准备省市区 JSON 数据,可从 GitHub 等平台获取(如 china-area-data),或使用在线数据源。
2. 实现代码
<template>
<view>
<picker
mode="multiSelector"
:range="multiArray"
:value="multiIndex"
@columnchange="onColumnChange"
@change="onPickerChange"
>
<view class="picker">
当前选择:{{ selectedText }}
</view>
</picker>
</view>
</template>
<script>
import provinceData from '@/common/province-data.js'; // 导入省市区数据
export default {
data() {
return {
multiArray: [[], [], []], // 三级数据
multiIndex: [0, 0, 0], // 当前选中索引
selectedText: '请选择省市区'
};
},
mounted() {
this.initPicker();
},
methods: {
// 初始化选择器数据
initPicker() {
// 填充省份
this.multiArray[0] = provinceData.map(item => item.name);
// 根据第一个省份填充城市
const cities = provinceData[0].children || [];
this.multiArray[1] = cities.map(item => item.name);
// 根据第一个城市填充区县
const districts = cities[0]?.children || [];
this.multiArray[2] = districts.map(item => item.name);
this.$forceUpdate();
},
// 列数据变化时触发
onColumnChange(e) {
const { column, value } = e.detail;
const newIndex = [...this.multiIndex];
newIndex[column] = value;
// 根据列变化更新数据
if (column === 0) {
// 省份变化,更新城市和区县
const cities = provinceData[value].children || [];
this.multiArray[1] = cities.map(item => item.name);
this.multiArray[2] = (cities[0]?.children || []).map(item => item.name);
newIndex[1] = 0;
newIndex[2] = 0;
} else if (column === 1) {
// 城市变化,更新区县
const cities = provinceData[newIndex[0]].children || [];
const districts = cities[value]?.children || [];
this.multiArray[2] = districts.map(item => item.name);
newIndex[2] = 0;
}
this.multiIndex = newIndex;
this.$forceUpdate();
},
// 选择确认
onPickerChange(e) {
const values = e.detail.value;
const province = provinceData[values[0]];
const city = province.children[values[1]];
const district = city.children[values[2]];
this.selectedText = `${province.name} ${city.name} ${district.name}`;
}
}
};
</script>
<style>
.picker {
padding: 20rpx;
border: 1px solid #eee;
}
</style>
3. 数据示例(province-data.js)
export default [
{
name: "北京市",
children: [
{
name: "北京市",
children: [
{ name: "东城区" },
{ name: "西城区" }
]
}
]
},
{
name: "广东省",
children: [
{
name: "广州市",
children: [
{ name: "天河区" },
{ name: "越秀区" }
]
}
]
}
// ... 其他省份数据
];
4. 注意事项
- 数据源需包含完整的省市区三级嵌套结构
- 使用
$forceUpdate() 确保视图更新
- 可添加加载动画改善用户体验
此实现适用于 H5 平台,在微信小程序等平台也兼容。如需更复杂功能(如搜索),可结合第三方组件库(如 uView)实现。