小程序picker实现省市二级联动

先讲一下需求

服务端提供了省、市两个接口,市的接口通过省的pid进行关联,所以小程序直接提供的地区选择picker不适用(或者有我不知道的方法,话不能说满哈哈)。

方案是用小程序picker组件提供的多项选择mode,自己写了一个二级联动,或不多说上代码:

<picker mode="multiSelector" bindchange="bindMultiPickerChange" bindcolumnchange="bindMultiPickerColumnChange" value="{{multiIndex}}" range="{{multiArray}}">
  <view class="picker">
      当前选择:{{multiArray[0][multiIndex[0]]}} > {{multiArray[1][multiIndex[1]]}}
    </view>
</picker>

js文件


Page({

  data: {

    multiIndex:[]

  },

  bindPickerChange: function (e) {

    console.log('picker发送选择改变,携带值为', e.detail.value)

    this.setData({

      index: e.detail.value

    })

  },

  searchClassInfo(xiaoqu_id) {

    var that = this;

    if (xiaoqu_id) {

      this.setData({

        pid: xiaoqu_id

      }, () => {

        wx.request({

          url: ''https://www.XXX.com/XXX/XXX',',

          method: "POST",

          header: {

            'content-type': 'application/x-www-form-urlencoded',

            'Accept': 'application/json'

          },

          data: {

            "pid": that.data.pid

          },

          success: function (res) {

            console.log(res);

            var classList = res.data.data;

            var classArr = classList.map(item => {

              return item.city;

            })

            var xiaoquArr = that.data.xiaoquArr;

            that.setData({

              multiArray: [xiaoquArr, classArr],

              classArr,

              classList

            })

          }

        })

      })

    }

  },

  bindMultiPickerColumnChange: function (e) {

    //e.detail.column 改变的数组下标列, e.detail.value 改变对应列的值

    console.log(e);

    console.log('修改的列为', e.detail.column, ',值为', e.detail.value);

    var data = {

      multiArray: this.data.multiArray,

      multiIndex: this.data.multiIndex

    };

    data.multiIndex[e.detail.column] = e.detail.value;

    var pid_session = this.data.pid;    // 保持之前的校区id 与新选择的id 做对比,如果改变则重新请求数据

    switch (e.detail.column) {

      case 0:

        var xiaoquList = this.data.xiaoquList;

        var pid = xiaoquList[e.detail.value]['pid'];

        if (pid_session != pid) {    // 与之前保持的校区id做对比,如果不一致则重新请求并赋新值

          this.searchClassInfo(pid);

        }

        data.multiIndex[1] = 0;

        break;

    }

    this.setData(data);

  },

  bindMultiPickerChange: function (e) {

    console.log('picker发送选择改变,携带值为', e.detail.value)

    var class_key = 0;

    var classList = this.data.classList;

    var select_key = e.detail.value[1];

    var real_key = select_key - 1;

    if (real_key < class_key) {

      this.setData({

        cid: 0

      })

    } else {

      this.setData({

        cid: classList[real_key]['cid']      // class_id 代表着选择的班级对应的 班级id

      })

    }

    this.setData({

      multiIndex: e.detail.value

    })

  },

  onLoad:function(){

    var that = this;

    wx.request({

      url: 'https://www.XXX.com/XXX/XXX',

      data: {},

      method:"POST",

      header: {

        'content-type': 'application/json' // 默认值

      },

      success:function(res) {

        console.log(res);

        var xiaoquList = res.data.data;

        var xiaoquArr = xiaoquList.map(item => {    // 此方法将校区名称区分到一个新数组中

          return item.province;

        });

        that.setData({

          multiArray: [xiaoquArr, []],

          xiaoquList,

          xiaoquArr

        })

        var default_xiaoqu_id = xiaoquList[0]['pid'];    //获取默认的校区对应的 teach_area_id

        if (default_xiaoqu_id) {

          that.searchClassInfo(default_xiaoqu_id)      // 如果存在调用获取对应的班级数据

        }

      }

    })

  }

})

由于借鉴了【小程序 picker 多列选择器 数据动态获取】,所以请无视那些命名奇怪的变量。
原文链接:https://www.cnblogs.com/inzaghihao/p/7844844.html

踩的坑:

由于原文没有贴js文件的data部分,于是天真的我就进坑了

如果没有预先在data里定义multiIndex,则在打开滑动框并鼠标移入后会出现以下报错

QQ截图20180815110411.png

错误解释:

在第一次打开时,multiIndex还未被定义,浏览器无法识别其为数组,所以wxml中的picker无法获取第一次的index

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载链接 注:本文转载知乎上的回答 作者:初雪 链接:https://www.zhihu.com/question...
    pengshuangta阅读 29,083评论 9 295
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,962评论 25 709
  • 第四章 “嗯,苦中带甜,甜中带香,回味无穷。”若能再有几块点心便锦上添花了。 “你吃些什么?我吩咐御厨做些膳食与你...
    子未央阅读 3,641评论 0 0
  • 1. 蹲在地上给童哥洗澡时,他看到我的一个膝盖着地,满怀关心地说: “妈妈,别跪在地上,膝盖疼。” 2. 给童哥的...
    Shealy222阅读 1,594评论 0 0
  • 初识汇编 我们在学习逆向开发之前,我们要了解一个基本的逆向原理.首先我们是逆向iOS系统上面的APP.那么我们知道...
    SunnyLeong阅读 4,606评论 0 3

友情链接更多精彩内容