You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中使用setInterval向空列表添加对象出现null值如何解决

问题原因

  • 列表拼接逻辑放在了useEffect的同步执行块,而非定时器回调中,只要seconds发生变化、组件重新渲染,就会立刻执行一次拼接操作,并非按预设间隔触发
  • 当seconds取值等于winners数组长度时,winners[seconds]为无效下标,返回undefined,拼接进数组后就会生成null项
  • 每次seconds变化都会重新创建新的定时器,存在多定时器并行的逻辑冲突,同时终止定时器的判断位置错误,无法正常结束定时任务

修复方案

调整逻辑,将列表更新操作放到定时器回调内,无需额外维护seconds状态,直接通过当前list的长度判断待插入的元素即可,定时器仅需在组件挂载后初始化一次:

const [list, setList] = useState([])
const winners = [
  {
    name: 'john',
    price: '200'
  },
  {
    name: 'Micheal',
    price: '230'
  }
]

useEffect(() => {
  // 每隔1秒触发一次插入操作
  const interval = setInterval(() => {
    setList(prevList => {
      // 所有winner插入完成后清除定时器
      if (prevList.length >= winners.length) {
        clearInterval(interval)
        return prevList
      }
      // 拼接下一个元素
      return prevList.concat(winners[prevList.length])
    })
  }, 1000)
  // 组件卸载时清除定时器
  return () => clearInterval(interval)
}, [winners])

内容的提问来源于stack exchange,提问作者Gabriel Udo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 10:45:04