我们在开发小程序时,使用官方给的城市选择器会方便的很多,但有的时候我们需要自己写一套城市选择器,
我们所选的城市需要城市id,来对应后端,方便后端处理,不多说,上代码
首先我们在.wxml中
<view class='item'>
所在地区
<picker mode="multiSelector" bindchange="bindRegionChange" bindcolumnchange="bindRegionColumnChange" range='{{multiArray}}'>
<text wx:if="{{addressCity}}">{{addressCity[0]}} {{addressCity[1]}} {{addressCity[2]}}</text>
<text wx:else class='placeholder'>请选择地区</text>
</picker>
</view>
wxss中
page{background-color: #efeff4;}
.tui-picker-content{
padding: 30rpx;
text-align: center;
}
.tui-picker-name{
height: 80rpx;
line-height: 80rpx;
}
.tui-picker-detail{
height: 80rpx;
line-height: 80rpx;
background-color: #fff;
font-size: 35rpx;
padding: 0 10px;
overflow: hidden;
}
在 .js中写入逻辑
Page({
data: {
province_list: null,
province_name: null,
city_list: null,
city_name: null,
area_list: null,
area_name: null,
addressCity: null,
multiArray: [], // 三维数组数据
multiIndex: [0, 0, 0], // 默认的下标,
selectProvinceId: null,
selectCityId: null,
selectAreaId: null,
},
onLoad: function (options) { //在页面加载就调用获取
this.getProvince()
},
//获取省份列表
getProvince: function () {
let that = this
wx.request({ //网路请求
url: '',
data:{
parentId: 0 //通过parentId来获取到省份列表 一般来说这个parentId都为0
},
success(res) {
let provinceList = [...res.data.data] //放到一个数组里面
let provinceArr = res.data.data.map((item) => { return item.name }) //获取名称
that.setData({
multiArray: [provinceArr, [], []], //更新三维数组 更新完为[['广东','北京'],[],[]]
province_list: provinceList, //省级原始数据
province_name: provinceArr, //省级全部名称
})
let defaultCode = that.data.province_list[0].id //使用第一项当作参数获取市级数据
if (defaultCode) {
that.setData({
currnetProvinceId: defaultCode //保存当前省份id
})
that.getCity(defaultCode) //获取市区数据
}
}
})
},
//根据省份id获取城市
getCity: function (id) {
if(id){
let that = this
that.setData({
currnetProvinceId: id //这个id是省份id获取城市
})
wx.request({
url: '',
data: {
parentId: id
},
success(res) {
// console.log(res.data.data)
let cityArr = res.data.data.map((item) => { return item.name }) //返回城市名称
let cityList = [...res.data.data]
that.setData({
multiArray: [that.data.province_name, cityArr, []], //更新后[['广东','北京'],['潮州','汕头','揭阳'],[]]
city_list: cityList, //保持市级数据
city_name: cityArr //市级名称
})
let defaultCode = that.data.city_list[0].id //获取第一个市的区级数据
if (defaultCode) {
that.setData({
currentCityId: defaultCode //保存当下市id
})
that.getArea(defaultCode) //获取区域数据
}
}
})
}
},
//获取区域
getArea: function (id) {
if(id){
let that = this
that.setData({
currentCityId: id //保存当前选择市
})
wx.request({
url: '',
data: {
parentId: id
},
success(res) {
// console.log(res.data.data)
let areaList = [...res.data.data]
let areaArr = res.data.data.map((item) => { return item.name }) //区域名
that.setData({
multiArray: [that.data.province_name, that.data.city_name, areaArr],
area_list: areaList, //区列表
area_name: areaArr //区名字
})
}
})
}
},
//picker确认选择地区
bindRegionChange: function (e) {
// 因为在获取省中 北京只有一个选项,导致获取不了北京》北京》第一个
if (e.detail.value[1] == null || e.detail.value[2] == null) { //如果只滚动了第一列则选取第一列的第一数据
this.setData({
multiIndex: e.detail.value, //更新下标
addressCity: [this.data.province_list[e.detail.value[0]].name, this.data.city_list[0].name, this.data.area_list[0].name],
selectProvinceId: this.data.province_list[e.detail.value[0]].id,
selectCityId: this.data.city_list[0].id,
selectAreaId: this.data.area_list[0].id
})
} else {
this.setData({
multiIndex: e.detail.value, //更新下标
addressCity: [this.data.province_list[e.detail.value[0]].name, this.data.city_list[e.detail.value[1]].name, this.data.area_list[e.detail.value[2]].name],
selectProvinceId: this.data.province_list[e.detail.value[0]].id,
selectCityId: this.data.city_list[e.detail.value[1]].id,
selectAreaId: this.data.area_list[e.detail.value[2]].id
})
}
// console.log(this.data.selectProvinceId,this.data.selectCityId,this.data.selectAreaId)
},
//滑动地区组件
bindRegionColumnChange: function (e) {
// console.log(e.detail.column,e.detail.value)
let that = this
let column = e.detail.column //当前改变的列
let data = {
multiIndex: JSON.parse(JSON.stringify(that.data.multiIndex)),
multiArray: JSON.parse(JSON.stringify(that.data.multiArray))
}
data.multiIndex[column] = e.detail.value //第几列改变了就是对应multiIndex的第几个,更新他
switch (column) {
case 0: //第一列改变,省级改变
let currentProvinceId = that.data.province_list[e.detail.value].id
if (currentProvinceId != that.data.currentProvinceId) { //判断当前id是不是更新了
that.getCity(currentProvinceId) //获取当前id下的市级数据
}
data.multiIndex[1] = 0 //将市默认选择第一个
break
case 1: //第二列改变,市级改变
let currentCityId = that.data.city_list[e.detail.value].id
if (currentCityId != that.data.currentCityId) {
that.getArea(currentCityId) //获取区域
}
data.multiIndex[2] = 0 //区域默认第一个
break
}
that.setData(data) //更新数据
},
})
这样一个简单的城市选择器就搞好了
