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

React从Firestore取用户数据刷新时报Cannot read property '1' of undefined如何解决

报错原因说明

这个报错和currentUser有间接关联,核心触发原因如下:

  • 页面刷新后Redux的currentUser是异步初始化的(比如从本地存储、鉴权接口拉取),首次渲染时currentUser大概率为空,你的useEffect仅在currentUser存在时才会触发Firestore数据请求,此时users还保持初始空数组的状态
  • 你在访问数据时只给.items加了可选链,前面的users[0][1]没有做空值保护,首次渲染时users[0]为undefined,访问undefined[1]就会抛出该错误

修复方案

1. 给多层级访问全量加空值保护

把获取userItems1的代码改成如下形式,用可选链覆盖所有层级访问,同时用空值合并运算符兜底为空对象,避免后续Object.entries报错:

const userItems1 = users[0]?.[1]?.items ?? {};

2. 加加载状态判断,避免未就绪时渲染

在渲染相关逻辑前加加载判断,数据未就绪时展示加载占位:

// 放在遍历、渲染逻辑的最前面
if (!currentUser || !users.length || !users[0]?.[1]?.items) {
  return <div>加载中...</div>
}

// 后面再执行你的遍历和渲染逻辑
let ar = [];
for (const [key, value] of Object.entries(userItems1)) {
  ar.push(key, " ");
}

3. 可选优化:简化数据存储逻辑

你当前查询的是单个用户的文档,没有必要把返回结果存在数组里,直接存对象更简洁,也能避免访问数组第0项的冗余逻辑:

// 把users改成存单个对象
const [user, setUser] = useState(null)
useEffect(() => {
  if (currentUser) {
    const unsubscribe = db
      .collection("users")
      .doc(uid)
      .onSnapshot((snapshot) => {
        setUser(snapshot.data());
      });
    return () => unsubscribe();
  }
}, [currentUser])

// 后续访问直接取对象属性
const userItems1 = user?.[1]?.items ?? {}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:06:04