小程序自定义城市列表选择器

我们在开发小程序时,使用官方给的城市选择器会方便的很多,但有的时候我们需要自己写一套城市选择器,

我们所选的城市需要城市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)  //更新数据
  },
})

  这样一个简单的城市选择器就搞好了

猜你喜欢

转载自www.cnblogs.com/BySee1423/p/12557508.html