关于微信小程序中的foreach和indexOf遍历数组的见解

在开发的过程中,我遇到过这样一个需求,把一个复选框的每一个选项都当成一个字段处理,传入后端的复选框数据不能是数组,而是一个一个字段,当时我的解决办法是,因为用户在复选框勾选的每一个选项,会被微信小程序存放到一个数组中,我在前端拿到这个数组后,最开始用foreach来遍历这个数组,如果遍历到这个勾选的值之后,就传入到后台,但是我发现了一个bug,我第一次向后端传输的是复选框第一个选项,后台显示传输成功,但是当我第二次没有勾选复选框第一个选项时,也就是不向不传输第一个选项,但是后台里面显示,新增的数据竟然有第一个复选框的值!现在假设有一个复选框,里面值为:1,2,3,4,5   当时我的代码如下:

chose则是拿到复选框勾选的数组:

checkboxChange1: function (e) {
  const chose=e.detail.value;
  if(chose.foreach((value=== 1)=>{
    this.setData({
      nation_study_award:'1'
    })
  }else{
    this.setData({
      nation_study_award:''
    })
  })

但是正如我所说,假如我第一个勾选1,用foreach来判断,第一次我上传的时候,我成功上传了1,但是当我第二次没有勾选1的时候,我再点击上传的时候,发现后台新增的数据竟然传输了1!

这是因为:setData方法用于更新页面数据,但它是异步的,这意味着在 forEach循环中调用 setData时,可能会导致后续的更新操作不符合预期。具体来说,可能会出现在在第二次上传时未勾选的情况下,前一次的数据仍然留在页面上没有被清除。

setData 方法异步执行: 在小程序或者某些前端框架中,如Vue.js或React等,更新页面数据一般通过调用类似 setData的方法来实现。这些方法通常是异步的,也就是说,当你调用 setData时,它不会立即更新页面上的数据,而是会安排在稍后的时间点进行更新。

如果在循环中多次调用setData ,它们并不会立即执行,而是会被放入任务队列中等待执行。

但是我如果使用indexOf就会解决这种问题

代码如下:

checkboxChange1: function (e) {
  const chose=e.detail.value;
  console.log(chose)
  if(chose.indexOf(1)>-1){
    this.setData({
      nation_study_award:'1'
    })
  }else{
    this.setData({
      nation_study_award:''
    })
  }
}

为了避免这种问题,常见的做法是使用 indexOf或其他方式来计算出需要的更新数据,然后在循环外部仅调用一次​​​​​​​setData。这样做可以确保更新操作按照期望的顺序和条件执行,而不会受到异步调用的影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值