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

从Firebase取数后传递给子组件时初始空数组问题求助

问题修复方案

1. 子组件 UserDataTable 核心问题:map 未返回渲染元素

你的userData.map回调使用大括号{}但未返回<TableRow>,导致React无法渲染任何行数据。修改方式有两种:

  • 把大括号换成小括号(隐式返回)
  • 显式添加return语句

同时建议给每行添加唯一key属性,避免React警告:

// 修复后的TableBody部分
<TableBody>
  {userData.map((d, index) => (
    <TableRow key={index}>
      <TableCell>{d.wpm}</TableCell>
      <TableCell>{d.rawWpm}</TableCell>
      <TableCell>{d.accuracy}</TableCell>
      <TableCell>0|0|0|0</TableCell>
      <TableCell>{d.timeStamp.toDate().toLocaleString()}</TableCell>
    </TableRow>
  ))}
</TableBody>

提示:如果Firebase文档有唯一doc.id,用doc.id作为key比index更稳定。

2. 父组件 User 优化与修复

(1)移除无效的effectFunction

effectFunction在useEffect中调用返回JSX不会被渲染,完全无效。直接在组件return中处理loading状态:

// 替换原return内容
return (
  <div>
    {loading ? <CircularProgress /> : <UserDataTable userData={userData} />}
  </div>
);

(2)用useAuthState返回的user替代auth.currentUser

auth.currentUser可能在组件渲染初期未完成初始化,而useAuthState返回的user是实时同步的,可靠性更高:

const fetchUserData = () => {
  const resultsReference = db.collection("Results");
  const { uid } = user; // 直接使用useAuthState返回的user对象

  let tempData = [];

  resultsReference
    .where("userId", "==", uid)
    .get()
    .then((snapshot) => {
      snapshot.docs.forEach((doc) => {
        // 建议存入doc.id,方便后续编辑/删除操作
        tempData.push({ id: doc.id, ...doc.data() });
      });
      setUserData(tempData);
    })
    .catch(err => {
      // 添加错误捕获,便于调试
      console.error("获取数据失败:", err);
    });
};

(3)简化useEffect逻辑并补全依赖

useEffect(() => {
  if (loading) return;

  if (!user) {
    navigate("/");
    return;
  }

  fetchUserData();
}, [loading, user, navigate]); // 补全依赖数组,消除React警告

3. 验证修复效果

修复后流程:

  1. 初始渲染时loading为true,显示加载动画
  2. Firebase auth加载完成后,loading变为false,若用户未登录则跳转首页;已登录则调用fetchUserData获取数据
  3. 数据获取完成后,userData状态更新,父组件重新渲染,将填充后的数组传给子组件
  4. 子组件的map函数正确返回行元素,渲染出数据

控制台仍会先打印空数组(初始状态),之后打印填充后的数组,这是正常的React状态更新流程,此时子组件已能正确渲染数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:59:58