我們在開發小程序時,使用官方給的城市選擇器會方便的很多,但有的時候我們需要自己寫一套城市選擇器,
我們所選的城市需要城市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) //更新數據
},
})
這樣一個簡單的城市選擇器就搞好了
