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

React中如何在fetch请求完成后执行map()方法

解决React中fetch未完成就执行map的问题

你的问题核心在于初始状态设置不当,且未在数据加载完成前做防护处理,导致map调用在productData.products还未存在时执行,引发错误。以下是具体修复方案:

1. 修正初始状态

接口返回的是包含products数组的对象,但你初始将productData设为了空数组[]。这会导致组件首次渲染时productData.products为undefined,调用map直接报错。把初始状态改成包含空products数组的对象:

const [productData, getproductData] = useState({ products: [] });

2. 给map添加防护逻辑

即使修正了初始状态,也可以通过条件判断或可选链操作符,确保只有当products存在且有数据时才执行map:

  • 方式一:条件渲染(同时展示加载状态)
<div className='products'>
  {productData.products.length > 0 ? (
    productData.products.map(product => (
      <div className='product' key={product.id}>
        <div className='productInfo'>
          <div className='productTitle'>
            <div className='productBrand'>{product.brand}</div> 
            <div className='productName'>{product.title}</div>
          </div>
        </div>
      </div>
    ))
  ) : (
    <div>加载中...</div>
  )}
</div>
  • 方式二:可选链操作符(更简洁)
<div className='products'>
  {productData.products?.map(product => (
    <div className='product' key={product.id}>
      <div className='productInfo'>
        <div className='productTitle'>
          <div className='productBrand'>{product.brand}</div> 
          <div className='productName'>{product.title}</div>
        </div>
      </div>
    </div>
  ))}
</div>

3. 优化fetch函数(可选)

你用了async但嵌套了then,可以改成await写法让代码更清晰,同时增加错误捕获:

const fetchData = async () => {
  try {
    const res = await fetch('https://dummyjson.com/products?limit=0');
    const response = await res.json();
    getproductData(response);
  } catch (err) {
    console.error('数据获取失败:', err);
  }
}

修改完成后,组件会等待数据加载完成后再渲染产品列表,同时初始状态和防护逻辑也避免了undefined调用map的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:43:18