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

Next.js中访问API获取的对象属性报错:TypeError: Cannot read property 'id' of undefined

解决Next.js中访问异步加载数组元素属性的报错问题

问题根源

你遇到的TypeError: Cannot read property 'id' of undefined本质是数据加载的异步性导致的:自定义Hook调用API是异步操作,在组件初始渲染(尤其是Next.js的服务端渲染阶段)时,avengers还是初始的空数组,此时avengers[0]为undefined,直接访问.id就会抛出错误。

可行解决方案

1. 使用可选链操作符(推荐)

通过?.语法安全访问嵌套属性,当avengers[0]不存在时,表达式会直接返回undefined而不报错:

const avengers = useFilteredData("Adventure");
// 安全访问id
const avengerId = avengers[0]?.id;

2. 条件渲染判断

先检查数组长度,确保存在元素后再访问属性:

const avengers = useFilteredData("Adventure");

return (
  <div>
    {avengers.length > 0 ? (
      <p>ID: {avengers[0].id}</p>
    ) : (
      <p>加载中...</p>
    )}
  </div>
);

3. 在自定义Hook中添加加载状态

修改你的自定义Hook,返回数据的同时返回加载状态,组件根据状态控制渲染逻辑:

// 自定义Hook示例
function useFilteredData(filterName) {
  const [data, setData] = useState([]);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const fetchData = async () => {
      const res = await fetch("/api/your-endpoint");
      const result = await res.json();
      const filtered = result.filter(item => item.name === filterName);
      setData(filtered);
      setLoading(false);
    };
    fetchData();
  }, [filterName]);

  return { data, loading };
}

// 组件中使用
const { data: avengers, loading } = useFilteredData("Adventure");

return (
  <div>
    {loading ? (
      <p>加载中...</p>
    ) : (
      <p>ID: {avengers[0]?.id}</p>
    )}
  </div>
);

4. 空值合并运算符处理默认值

如果需要在属性不存在时显示默认值,可以结合可选链和空值合并:

const avengerId = avengers[0]?.id ?? "暂无数据";

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:18:23