1. 省市区三级联动概述
省市区三级联动,顾名思义就是在省市区三个级别之间进行联动,用户选择一个省份后,就会刷新该省份的所有市区信息,并在用户选择一个市区后,刷新该市区下辖的所有区县信息。它的主要应用场景是在用户填写个人资料时要求填写所在地信息,这样做的优点在于方便用户在填写时进行选择,将输入错误的几率降到最低。
2. picker组件介绍
picker组件是微信小程序提供的用户数据选择器,可以用来取代传统的列表选择器。与传统的列表选择器不同的是,picker组件允许用户通过手指滑动来选择数据,极大地提高了用户的体验感。picker组件的主要特点如下:
2.1 数据源要求
picker组件的数据源必须是一个数组,数组中存储的每一个元素都应该是一个字符串或者一个对象,如果是一个字符串,则该字符串将会作为picker组件的显示内容;如果是一个对象,则该对象的键值对会被解析出来并作为picker组件的显示内容。
2.2 使用方法
picker组件的使用方法非常简单,只需要在页面中添加一个picker组件标签即可,代码示例如下:
<picker mode="selector" bindchange="bindCityChange" value="{{cityIndex}}" range="{{cityData}}">
<view class="picker">{{cityData[cityIndex]}}</view>
</picker>
picker组件的最上层是一个picker标签,其中mode属性指定了picker组件使用的模式,一共有两种模式可选,分别为selector和multiSelector。selector模式是默认模式,在该模式下,picker组件只提供单列显示;multiSelector模式则提供多列显示。在picker组件内部,还需要指定一个value属性和一个range属性,分别指定当前选择的数据和picker组件的数据源。其中,value属性默认为0,表示初始时picker组件的选中项为第0项;range属性必须是一个数组,数组中的元素可以是字符串也可以是对象。
3. picker联动实现思路
实现picker的联动效果有一定的技巧,下面是实现picker联动的基本思路:
3.1 省市区数据源格式
为了实现picker的联动效果,我们需要对省市区数据进行格式化处理。具体来说,我们需要将省份、城市和区县的数据按照以下的格式进行存储:
var region = [
{
"provinceName": "北京市",
"city": [ { "cityName": "东城区", "area": [ "和平街道", ... ] } ]
},
{
"provinceName": "海南省",
"city": [ { "cityName": "三亚市", "area": [ "凤凰岛镇", ... ] } ]
},
...
]
即每一个省份都是一个对象,其中包含一个provinceName属性表示省份名称,还包含一个city属性,该属性是一个数组,存储了该省份下辖的所有城市。同样,每一个城市也是一个对象,它包含一个cityName属性表示城市名称,一个area属性存储了该城市下辖的所有区县名称。
3.2 picker联动实现步骤
通过上面的数据格式化,我们得到了一个省市区的层级结构。接下来,我们需要使用picker组件实现它们的联动效果,具体实现步骤如下:
获取省份数据源,在页面加载时,我们需要将所有的省份数据源存储在一个数组中,并初始化picker组件。
根据用户选择的省份,获取该省份下辖的所有城市,在picker组件的bindchange事件中,我们可以通过用户选择的省份所对应的索引,获取该省份对应的所有城市列表。
根据用户选择的城市,获取该城市下辖的所有区县,在picker组件的bindchange事件中,我们可以通过用户选择的城市所对应的索引,获取该城市对应的所有区县列表。
将数据源填充到picker组件中,每当获取新的数据源时,我们需要将数据源填充到picker组件中,这样用户才能看到新的数据。
4. 完整代码实现
下面是完整的picker联动实现代码:
Page({
data: {
// 省份数据源
provinceData: [],
// 城市数据源
cityData: [],
// 区县数据源
areaData: [],
// 用户选择的省份
provinceIndex: 0,
// 用户选择的城市
cityIndex: 0,
// 用户选择的区县
areaIndex: 0
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
// 获取所有省份信息
var that = this;
wx.request({
url: 'https://xxxxxx',
success: function(res) {
that.setData({
provinceData: res.data.region
})
}
})
},
/**
* 用户选择省份
*/
bindProvinceChange: function(e) {
var that = this;
that.setData({
provinceIndex: e.detail.value
})
// 获取用户选择的省份所对应的城市列表
wx.request({
url: 'https://xxxxxx' + that.data.provinceIndex,
success: function(res) {
var cityData = res.data.region[0].city;
// 获取用户选择的第一个城市所对应的区县列表
wx.request({
url: 'https://xxxxxx' + cityData[0].cityCode,
success: function(res) {
that.setData({
cityData: cityData,
areaData: res.data.region[0].area
})
}
})
}
})
},
/**
* 用户选择城市
*/
bindCityChange: function(e) {
var that = this;
that.setData({
cityIndex: e.detail.value
})
// 获取用户选择的城市所对应的区县列表
wx.request({
url: 'https://xxxxxx' + that.data.cityData[that.data.cityIndex].cityCode,
success: function(res) {
that.setData({
areaData: res.data.region[0].area
})
}
})
},
/**
* 用户选择区县
*/
bindAreaChange: function(e) {
var that = this;
that.setData({
areaIndex: e.detail.value
})
}
})
上面的代码使用了wx.request方法,这是一个异步调用方法,用于获取远程数据,具体使用方法请参考微信小程序官方文档。
5. 总结
本文介绍了在微信小程序中使用picker组件实现省市区三级联动效果的方法。通过对picker组件的介绍,我们了解了其主要特点。在实现picker的联动效果时,我们需要将省、市和区县的数据按照层级关系进行格式化存储,并根据用户选择的省、市和区县获取对应的数据,将数据源填充到picker组件中。