小程序自定義城市列表選擇器


我們在開發小程序時,使用官方給的城市選擇器會方便的很多,但有的時候我們需要自己寫一套城市選擇器,

我們所選的城市需要城市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)  //更新數據
  },
})

  這樣一個簡單的城市選擇器就搞好了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM