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

React组件<GetCarInfo>无法渲染无序列表的问题排查

问题1:初始用普通数组无法渲染的根本原因

React组件的重新渲染完全依赖状态(useState/useReducer)、props或上下文(Context)的变化。你最初的写法犯了核心错误:用普通JavaScript变量存储异步数据,而非React状态。

举个你的初始逻辑的简化反例:

function GetCarInfo() {
  let arrTitle = []; // 普通变量,React无法追踪变化
  
  fetch('/api/cars')
    .then(res => res.json())
    .then(data => {
      // 异步填充数组,但此时组件已经完成首次渲染
      data.forEach(item => arrTitle.push(item.key));
    });

  // 首次渲染时arrTitle是空数组,后续数组变化不会触发重新渲染
  return <ul>{arrTitle.map(item => <li key={item}>{item}</li>)}</ul>;
}
  • 组件首次渲染时,arrTitle是空的,所以页面渲染空列表。
  • fetch是异步操作,等API返回数据并填充arrTitle时,组件已经渲染完成。但因为arrTitle不是状态变量,React无法感知到它的更新,不会触发组件重新渲染,页面因此始终没有内容。

后来你把数据存入useState的info状态,但依然用arrTitle渲染——这等于没利用React的状态更新机制:只有调用setInfo更新状态时,React才会触发重新渲染,而你渲染的是未同步的arrTitle,自然还是无效。改用info状态渲染后,setInfo触发了组件重新渲染,此时info已经持有API返回的数据,列表就能正常渲染。

问题2:组件内console.log执行两次的原因

这是React**开发环境下Strict Mode(严格模式)**的默认行为。Strict Mode会刻意重复调用组件函数、useEffect等生命周期相关函数,目的是帮你提前发现代码中的潜在问题:

  • 比如是否存在非幂等的副作用(重复执行会导致错误的操作)。
  • 或者是否在组件函数内进行了不该做的操作(比如直接修改DOM、创建全局可变变量)。

这个重复执行的行为仅在开发环境存在,生产环境下Strict Mode会自动禁用,console.log只会执行一次。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:10:11