微信小程序多级联动实现

本节将继续讲述小程序picker控件的使用,上篇讲述的是单级下拉列表,本次讲述的是多级下拉列表

小程序实现联动下拉列表,为实现联动润滑的效果,需要将联动用到的所有数据请求到,然后再逻辑处理这些数据,避免选中上一级,下一级结果出现迟缓卡顿的现象

第一步,小程序端向后端php请求所有用到的区划数据

onload:function(){
        var url = app.globalData.domain + 'survey_server/api.php?action=getGroup&system_id=' + this.data.storageData.system_id;
        var that=this;
        wx.request({
          url: url,
          data: {
            group_id: this.data.storageData.system_id,  
          },
          header: {
            'content-type': 'application/json' // 默认值
          },
          success: function (res) {
           
            that.setData({ groupInfo: res.data.groupInfo});
          }

        })}

后端php 为小程序提供数据

public function getGroup($group_id,$name,$idno,$isExist){
        $db=$this->db;
        $prefix=$this->prefix;
        $len=strlen($group_id);

        $sql="select group_id,group_name from ". $prefix."_group where group_fatherid='$group_id' and group_operate!='d' ";
        $groupInfo=$db->getAll($sql);//区{镇}
        
        foreach ($groupInfo as $key => &$value) {
            $childGroupId=$value['group_id'];
           if(strlen($childGroupId==12)){
                continue;
           }
           $childGroupInfo=$this->getGroupInfo($childGroupId);//镇{社区}
           $value['child']= $childGroupInfo;
           if($len==4){
            foreach ($value['child'] as $key1 => &$value1) {
                $childGroupId2=$value1['group_id'];
                $childGroupInfo2=$this->getGroupInfo($childGroupId2);//社区{}
                $value1['child']= $childGroupInfo2;
            }
           }
        }

        $arr['groupInfo']=$groupInfo;
        $arr=$this->ConvertToUtf8($arr);
        return $arr;
    }
    
private function getGroupInfo($group_id){
        $db=$this->db;
        $prefix=$this->prefix;
        if(strlen($group_id==12)){
            return false;
        }
        $sql="select group_id,group_name from ". $prefix."_group where group_fatherid='$group_id' and group_operate!='d' ";
        $groupInfo=$db->getAll($sql);
        return $groupInfo;
    }

第二步,小程序端html页面

<picker mode="multiSelector" bindchange="bindMultiPickerChange"           bindcolumnchange="bindMultiPickerColumnChange" value="{{mutiIndexArray}}" range="{{mutiGroupArray}}">
    
<view class="picker">
      {{mutiGroupArray[0][mutiIndexArray[0]]}}{{mutiGroupArray[1][mutiIndexArray[1]]}}{{mutiGroupArray[2][mutiIndexArray[2]]}}
    </view>
</picker>

第三步 就是js端的逻辑处理

【1】初始数据生成

  data: {
     
      mutiGroupArray:[],
      mutiIndexArray:[],
      firstIndex:0,
  },
onload:function(){
  //为联动组件picker初始化数据
            var mutiGroupArray=[];
            var firstArr=[]; //收集第一列的容器
            var secondArr = []; //收集第二列的容器
            var thirdArr = []; //收集第三列的容器
            var mutiIndexArray = that.data.storageData.mutiIndexArray;
            console.log(mutiIndexArray);
            for (var i = 0; i < res.data.groupInfo.length;i++){  //遍历最外层的区划集合,收集第一列
              firstArr.push(res.data.groupInfo[i].group_name);
              if (res.data.groupInfo[mutiIndexArray[0]].child && i == mutiIndexArray[0]){  //判断第一列是否有子集,如果有,则将遍历第一列第一个项的子集集合,生成第二列
                var child1 = res.data.groupInfo[mutiIndexArray[0]].child;
                for (var m = 0; m < child1.length;m++){
                  secondArr.push(child1[m].group_name);
                  if (child1[mutiIndexArray[1]].child && m == mutiIndexArray[1]){  //判断第二列的有没有子集,若果有,同样的,遍历第二列第一个项下的子集,生成第三列集合
                    var child2 = child1[mutiIndexArray[1]].child;
                    for(var n=0;n<child2.length;n++){
                      thirdArr.push(child2[n].group_name);
                    }
                  }
                }
               
              }

            }

            if (JSON.stringify(firstArr) !== '[]'){
              mutiGroupArray.push(firstArr);

            }
            if (JSON.stringify(secondArr) !== '[]') {
              mutiGroupArray.push(secondArr);

            }
            if (JSON.stringify(thirdArr)!== '[]') {
              mutiGroupArray.push(thirdArr);
             
            }
            //初始化生成默认选中的所在社区
            var groupInfo = that.data.groupInfo;
            var valArr = that.data.mutiIndexArray;
            if (groupInfo[valArr[0]].child[valArr[1]].child) {
              var selectedgroupid = groupInfo[valArr[0]].child[valArr[1]].child[valArr[2]].group_id;
            } else {
              var selectedgroupid = groupInfo[valArr[0]].child[valArr[1]].group_id;
            }
            
       
            that.setData({ mutiGroupArray: mutiGroupArray, selectedgroupid: selectedgroupid});
}

【2】picker值改变赋值

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

   //生成改变以后的所在社区
    var valArr = e.detail.value;
 
    var groupIdArr=[];
    var groupInfo=this.data.groupInfo;
   
    if (groupInfo[valArr[0]].child[valArr[1]].child){
      var selectedgroupid = groupInfo[valArr[0]].child[valArr[1]].child[valArr[2]].group_id;
    }else{
      var selectedgroupid = groupInfo[valArr[0]].child[valArr[1]].group_id;
    }
    
    this.setData({
      mutiIndexArray: e.detail.value,
      selectedgroupid: selectedgroupid,
     
    })
    
  },

【3】picker列的改变,加载下级数据

 bindMultiPickerColumnChange: function (e) {
   // console.log('修改的列为', e.detail.column, ',值为', e.detail.value);
    var mutiGroupArray = this.data.mutiGroupArray;
    var mutiIndexArray = this.data.mutiIndexArray;
    var mutiSize = mutiIndexArray.length;
    var column = e.detail.column;
    var groupInfo = this.data.groupInfo;
    var firstIndex=0;  //表示第一列选的是哪个值,默认是0,就是第一个区

    switch (column){
        case 0:  //以西咸新区市级为例,改变第一列的值,那将重新生成第二列(街道)和第三列(村)
        firstIndex = e.detail.value;
        this.data.storageData['firstIndex'] = firstIndex
        this.setData({ firstIndex: firstIndex, storageData: this.data.storageData});
        var mutiGroup1=[];//镇集合
        //groupInfo[e.detail.value] 表示第一列选择的是哪一个区,那么意味着接下来生成这个区的镇和村,生成镇就要遍历groupInfo[e.detail.value].child(镇集合列表),生成村只需要生成第一个镇下面的村就可以了即就是遍历groupInfo[e.detail.value].child[0].child(第一个镇下的村的集合列表)
        for (var key1 in groupInfo[e.detail.value].child){
          mutiGroup1.push(groupInfo[e.detail.value].child[key1].group_name);
          if (key1 == 0 && groupInfo[e.detail.value].child[0].child){
            var child1 = groupInfo[e.detail.value].child[0].child;
            var mutiGroup2=[];//村集合
            for (var key2 in child1){
              mutiGroup2.push(child1[key2].group_name);
            }
            mutiGroupArray[2] = mutiGroup2;
          }
        }
        mutiGroupArray[1] = mutiGroup1 ;
      
        break;
        case 1:  //若改变第二列(镇)的值,那将重新生成第三列(村)的值就可以了
        //groupInfo[firstIndex].child[e.detail.value].child  第二列选择以后的下级集合(村集合)
        var mutiGroup2=[];
        var child = groupInfo[this.data.firstIndex].child[e.detail.value].child;
        if (child){
          for (var key in child) {
            mutiGroup2.push(child[key].group_name);
          }
          mutiGroupArray[2] = mutiGroup2;
        }
       
        break;
    }
    this.setData({ mutiGroupArray: mutiGroupArray})
  },

猜你喜欢

转载自blog.csdn.net/qq_21987433/article/details/88550445