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

React从外部API拉取数据,刷新页面后调用map报undefined类型错误

报错根因

你给tshirts设置的初始值是空数组[],而你后续访问的tshirts.tShirt是对象属性,空数组本身不存在tShirt属性。首次渲染时异步fetch请求还未返回结果,此时tshirtArray取值为undefined,对undefined调用map方法就会抛出该错误。你所说的首次运行正常属于特殊情况,大概率是本地开发环境缓存、热更新或接口响应极快,刚好在首次渲染前完成了数据赋值的巧合,刷新后接口响应和渲染流程时序恢复正常就会稳定复现报错。

可行解决方案

方案1:修正状态初始值

将tshirts的初始值调整为和接口返回结构对齐的对象,保证初始状态下tShirt属性存在且为数组:

// 把原来的useState([])替换为下面的写法
const [tshirts, setTshirts] = useState({ tShirt: [] });

方案2:属性访问加兜底逻辑

使用可选链+空值合并运算符做兼容,保证调用map的目标永远是数组,不受初始值或接口返回异常影响:

// 把原来的tshirtArray赋值替换为下面的写法
const tshirtArray = tshirts?.tShirt ?? [];
const listItems = tshirtArray.map((item) => <li>{item}</li>);

方案3:新增加载状态控制

新增加载状态,接口请求完成前不执行遍历逻辑,还可以配合加载提示优化用户体验:

const [tshirts, setTshirts] = useState({ tShirt: [] });
const [loading, setLoading] = useState(true);

const fetchData = () => {
    fetch('apiEndpoint')
        .then((response) => response.json())
        .then((data) => {
            setTshirts(data[0].clothes.regular.top);
        })
        .catch((error) => {
            console.log(error);
        })
        .finally(() => {
            setLoading(false);
        });
};
React.useEffect(() => {
    fetchData();
}, []);

// 渲染逻辑前先判断加载状态
if (loading) return <div>数据加载中...</div>;

const tshirtArray = tshirts.tShirt;
const listItems = tshirtArray.map((item) => <li>{item}</li>);
额外优化建议

接口赋值时也可以增加可选链兜底,避免接口返回结构不符合预期时导致状态异常:

setTshirts(data?.[0]?.clothes?.regular?.top ?? { tShirt: [] });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:06:05