小程序 picker 多列选择器 数据动态获取

需求是将各校区对应各班级的数据 以两列选择器的方式展示出来,并且可以在选择完成之后记录选结果参数。

校区数据 和 班级数据 分别是两个接口,以 校区 teach_area_id 字段关联 其各班级数据

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

校区api数据格式

    "result": [
        {
            "teach_area_id": "xxx1",  //值为模拟 加密数据
            "teach_area_name": "上海校区"
        },
        {
            "teach_area_id": "xxx2",
            "teach_area_name": "无锡校区"
        },
        {
            "teach_area_id": "xxx3",
            "teach_area_name": "苏州校区"
        },
        {
            "teach_area_id": "xxx4",
            "teach_area_name": "杭州校区"
        },
        {
            "teach_area_id": "xxx5",
            "teach_area_name": "南京校区"
        },
        {
            "teach_area_id": "xxx6",
            "teach_area_name": "北京校区"
        },
        {
            "teach_area_id": "xxx7",
            "teach_area_name": "广州校区"
        },
        {
            "teach_area_id": "xxx",
            "teach_area_name": "深圳校区"
        }
    ],

1.首先在onload 中请求校区数据并存到全局变量中

wx.request({
    url:‘https://api.xxxxxxx‘,
    data: {},
    header: {
      ‘content-type‘: ‘application/json‘ // 默认值
    },
    success(){
      var xiaoquList = res.data.result;
      var xiaoquArr = xiaoquList.map(item => {    // 此方法将校区名称区分到一个新数组中
        return item.teach_area_name;
      });
      that.setData({
        multiArray: [xiaoquArr, []],    
        xiaoquList,
        xiaoquArr
      })
      var default_xiaoqu_id = xiaoquList[0][‘teach_area_id‘];    //获取默认的校区对应的 teach_area_id
      if (default_xiaoqu_id) {
        that.searchClassInfo(default_xiaoqu_id)      // 如果存在调用获取对应的班级数据
      }
    }
  })   

2.获取班级数据函数并存到全局变量中

班级数据格式

"result": [
        {  
            "teach_instance_id": "xxx",    //加密数值
            "teach_instance_name": "2级-33期-1班"
        },
        {
            "teach_instance_id": "xxx1",
            "teach_instance_name": "3级-25期-10班"
        },
        {
            "teach_instance_id": "xxx2",
            "teach_instance_name": "3级-25期-9班"
        },
  ]

获取班级数据函数 searchClassInfo

searchClassInfo(xiaoqu_id){
    var that = this;
    if (xiaoqu_id) {
      this.setData({
        teach_area_id: xiaoqu_id
      })
      var url = ‘https://classapi‘;
      util.http(url, { teach_area_id: xiaoqu_id},res => {      // 此处将请求封装在util.js中
        var classList = res.data.result;
        var classArr = classList.map(item => {
          return item.teach_instance_name;
        })
        classArr.unshift(‘全部班级‘);      // 接口中没有提供全部班级字段,添加之
        var xiaoquArr = this.data.xiaoquArr;
        that.setData({
          multiArray: [xiaoquArr, classArr],
          classArr,
          classList
        })
      })

    }
  },

3.默认数据添加之后需要在每次滚动选择校区分类的时候,请求加载对应班级数据,监听picker滚动函数

bindMultiPickerColumnChange: function (e) {
    //e.detail.column 改变的数组下标列, e.detail.value 改变对应列的值
    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 teach_area_id_session = this.data.teach_area_id;    // 保持之前的校区id 与新选择的id 做对比,如果改变则重新请求数据
    switch (e.detail.column) {
      case 0:
        var xiaoquList = this.data.xiaoquList;
        var teach_area_id = xiaoquList[e.detail.value][‘teach_area_id‘];
        if (teach_area_id_session != teach_area_id) {    // 与之前保持的校区id做对比,如果不一致则重新请求并赋新值
          this.searchClassInfo(teach_area_id);      
        }
        data.multiIndex[1] = 0;
        break;
    }
    this.setData(data);
  },

4.选择完毕后记录选择的值

由于官方api返回的值是数组格式,需要做小调整

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({
        class_id: 0
      })
    } else {
      this.setData({
        class_id: classList[real_key][‘teach_instance_id‘]      // class_id 代表着选择的班级对应的 班级id
      })
    }
    this.setData({
      multiIndex: e.detail.value
    })
  },

5.之后就可以根据 teach_area_id (校区id) 和 teach_instance_id (班级id)  完成其他业务逻辑

时间: 2024-10-01 10:46:14

小程序 picker 多列选择器 数据动态获取的相关文章

微信小程序——picker通过value返回你想获取的值

关于微信小程序中的picker使用方法可以访问:picker-小程序 从它的官方文档中,可以看出它返回的value值是它range的下标: 在项目中,我们大多数时候传的值并不是需要这个下标,而是其他的值.像我项目中,需要获取到的是它对应的teamId,那么我们如何通过它的这个下标值返回你想要的值呢? 项目需求如下图: 步骤如下:  1.编写wxml文件 这是主要讲picker的功能,所以我只截了 picker 部分的wxml 代码了. 2.编写js文件 a). 定义data b). 赋值 c).

微信小程序picker下拉绑定数据

页面部分,wxml中写入以下代码 <picker mode = "selector" bindchange="bindPickerChange" value="{{project[idx].id}}" range="{{project}}" range-key="{{'val'}}"> <view class="picker picker1"> {{project

[微信小程序] 微信小程序下拉滚动选择器picker绑定数据的两种方式

微信小程序下拉滚动选择器picker绑定数据的两种方式  本地数据绑定和wx.request(OBJECT) json数据绑定 1.本地数据绑定 (对象数组) Page({ data:{ //户型 这是一个本地的对象,然后绑定到页面上 pic_array: [ { id: 13, name: '1室1厅1卫' }, { id: 14, name: '1室2厅1卫' }, { id: 15, name: '2室1厅1卫' }, { id: 16, name: '3室1厅2卫' }, { id: 1

微信小程序picker组件 - 省市二级联动

微信小程序picker组件自带省市区选择器,但是业务需求需要省市选择器,参考官方demo自己写了一个省市选择器 wxml文件 <view class="section"> <view class="section__title">省市二级联动demo</view> <picker mode="multiSelector" bindchange="bindMultiPickerChange&quo

微信小程序后台返回大量多余数据的处理

台接口返回一个数组,数组里面N多对象,每个对象里面几十上百条数据,最好玩的是,我只需要每个对象里面的某两个数据.... 类似这种: datas:[   {   id:1000,   name: "帅哥",   title: '...',   b: '...',   d: 0,   f:0,   ....   },   {   id:1001,   name: "美女",   title: '...',   b: '...',   d: 0,   f:0,   ...

微信小程序把玩(三十八)获取设备信息 API

原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx.onAccelerometerChange, 罗盘数据wx.onCompassChange wxml <button type="primary" bindtap="getNetWorkType">获取网络类型</button> <butt

小程序地区时间自定义选择器 picker

进入微信公众平台小程序开发文档搜索 picker 点进去后下滑,点击在开发者工具中预览即可 原文地址:https://www.cnblogs.com/junyi-bk/p/10475301.html

关于小程序picker 的使用

前言 以前做小程序的时候只会用那个picker mode = region的 3级选中, 现在需要自己根据后台给的编号省市区来用然后就研究了多列选择器:mode = multiSelector 的用法 当然啦, 利用微信小程序的picker组件,其中: 1,普通选择器:mode = selector实现一级选择实例: 2,省市区选择器:mode = region实现省市区三级联动: 3, 多列选择器:mode = multiSelector实现二级和三级联动的10以内数字的乘法. 其实只要写一个

微信小程序picker空白

如果你看完发现跟我遇到一样的问题,那么真的很奇葩 这个得从功能需求讲起 直接上图: 在 个人信息里面显示身高和体重,而且支持修改 我最开始想到的做法 直接使用微信小程序提供的组件picker(从屏幕下方弹出 的选择框) 我就比较懒,想一步选择两个属性,比如这样: 就是不管用户点击身高,还是体重,都是弹出这个进行选择修改,一步到位 那么我就给两个属性都绑定了一个picker,也使用同一组数据,大致代码: <picker mode="multiSelector" rang="