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

如何解决React中Uncaught TypeError: data.map is not a function错误

解决React中TypeError: data.map is not a function的问题

从你的控制台输出可以看到,API返回的是一个包含products数组的对象,而你直接将整个响应对象赋值给了data状态。由于data此时是一个对象而非数组,自然无法调用数组的map方法,导致报错。

修复方案

方案1:直接存储API返回的数组

修改getProduct函数,将响应中的products数组赋值给data:

async function getProduct() {
  var res = await axios.get("http://localhost:9900/products");
  console.log(res.data);
  // 取响应中的products数组
  setData(res.data.products);
}

这种方式下,你的初始状态useState([])是匹配的,后续判断data.length > 0也能正常工作。

方案2:保留完整响应对象(如果需要用到其他字段)

如果需要保留API返回的整个对象,需要调整初始状态和渲染逻辑:

  1. 修改初始状态为对象:
const [data, setData] = useState({});
  1. 渲染时先判断products数组是否存在,再调用map:
{data.products?.length > 0 && (
  data.products.map((product) => {
    // 你的渲染逻辑不变
  })
)}

这里使用可选链操作符?.避免初始状态下data.products为undefined导致的报错。

修正后的完整代码示例(方案1)

import axios from 'axios';
import React, { useEffect, useState } from 'react'
import { NavLink } from 'react-router-dom';

const Products = () => {
  const [data, setData] = useState([]);

  useEffect(()=>{
    getProduct();
  },[]);

  async function getProduct() {
    var res = await axios.get("http://localhost:9900/products");
    console.log(res.data);
    // 改为存储products数组
    setData(res.data.products);
  }

  return (
    <>
      <div>
      {data.length > 0 && (
        data.map((product) => {
          return (
              <>
                  <div className="col-md-3 mb-4">
                      <div className="card h-100 text-center p-4 border-0 " key={product.productId} >
                          <NavLink to={`/products/${product.productId}`}><img src={product.productImage} className="card-img-top" alt={product.productTitle} height='250px' /></NavLink>
                          <div className="card-body">
                              <h5 className="card-title mb-0">{product.productTitle.substring(0, 12)}...</h5>
                              <h6 className="card-text text-center">Rating {product.productRating}</h6>
                              <p className="card-text lead fw-bold">${product.productPrice}</p>
                              <NavLink to={`/products/${product.productId}`} className="btn btn-outline-dark">Buy Now</NavLink>
                          </div>
                      </div>
                  </div>
              </>
          )
      })
      )}
    </div>
    </>
  )
}

export default Products

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:22:48