微信小程序坑点挖掘(二)对象数组列表渲染无效

497 阅读1分钟

这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战

一、对象数组列表渲染无效

我之前在写一个小项目的时候,发现了一个奇怪的问题,像[{},{}…]这样子的对象数组居然没有办法做列表渲染循环出来,我打印了一下发现数组是有值的,只是给数组添加数组的时候用了数组的unshift方法,并没有使用小程序内置的setData()方法更新数据,但是其实是有值的,这点也让我卡了很久。代码大概如下:

data: {
    cls1:'cls',
    cls2:"",//控制显示样式
    finishlist:[],//保存完成的订单
    inglist:[],//保存进行中的订单
    content:true
  },
  //省去了调用API的部分代码,下面是调用API后的回调函数
        success:res=>{
        console.log(res)
        for(var i=0;i<res.data.data.length;i++){
          console.log(res.data.data[i].finish)
          if (res.data.data[i].finish==1){//找到完成的订单并且添加到我的数组的第一位
            that.data.finishlist.unshift(res.data.data[i])

          }else if(res.data.data[i].finish==0){//找到进行中订单
            that.data.inglist.unshift(res.data.data[i])
  
          }
        }

        console.log(that.data.finishlist)
        console.log(that.data.inglist)//打印出来的确实是对应的数组
      }
      /*下面是打印出来的结果,是正确的数据
      (8) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
 	  (14) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]*/

如上所述,我可以拿到数组,却不能在wxml中列表渲染出来,而且函数是写在onload里面的,理应不存在数据的更新问题(毕竟能打印出来),所以我也不知道具体的原因,这里贴出解决方法,利用第三者去传值,再数据绑定即可解决:

onLoad: function (options) {//拿到订单信息
    var that=this
    let finish=[]
    let ing=[]//定义第三者来接收数组
		//中间是API调用,下面是回调函数
      success:res=>{
        console.log(res)
        for(var i=0;i<res.data.data.length;i++){
          console.log(res.data.data[i].finish)
          if (res.data.data[i].finish==1){
            finish.unshift(res.data.data[i])

          }else if(res.data.data[i].finish==0){
            //that.data.inglist.unshift(res.data.data[i])
            ing.unshift(res.data.data[i])
          }
        }
        that.setData({
          finishlist:finish,
          inglist:ing//第三者拿到数组后动态赋值给我们要使用的数组
        })
        console.log(that.data.finishlist)
        console.log(that.data.inglist)//至此我们就可以使用这两个数组就行列表渲染了。
      }
    })
  },