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

React Native中如何渲染Firestore数据?数据已获取却不显示

问题分析与解决

你的代码存在两个关键问题,导致数据无法正常渲染:

1. useState 更新逻辑错误

在getWorkouts中用forEach循环逐个调用setWorkouts,由于useState的更新是异步的,且每次循环里的workouts都是初始的空数组状态,最终只会保留最后一条数据(甚至可能因状态合并问题丢失部分数据)。

正确做法是先将所有文档数据一次性收集到数组中,再更新状态:

const getWorkouts = async () => {
  const workoutsCollection = collection(db, 'Users', auth.currentUser.uid, 'Workouts');
  const workoutDocs = await getDocs(workoutsCollection);
  // 批量提取所有文档数据
  const workoutsData = workoutDocs.docs.map(doc => doc.data());
  setWorkouts(workoutsData);
};

2. map 函数未返回渲染元素

你的map回调使用了大括号,但没有显式返回<Text>组件,导致map生成的是全为undefined的数组,自然无法渲染内容。可以改成两种写法:

  • 显式添加return:
{workouts.map((workout) => {
  return <Text key={workout.id}>{workout.name}</Text>;
})}
  • 去掉大括号用隐式返回:
{workouts.map((workout) => (
  <Text key={workout.id}>{workout.name}</Text>
))}

另外,记得给map生成的元素添加唯一key属性(如果workout对象本身没有id,可以在收集数据时带上Firestore文档的id:const workoutsData = workoutDocs.docs.map(doc => ({...doc.data(), id: doc.id}));)

完整修正后的代码

export function TestScreen() {
  const [workouts, setWorkouts] = React.useState([]);

  const getWorkouts = async () => {
    const workoutsCollection = collection(db, 'Users', auth.currentUser.uid, 'Workouts');
    const workoutDocs = await getDocs(workoutsCollection);
    // 收集数据并带上文档id作为key
    const workoutsData = workoutDocs.docs.map(doc => ({
      ...doc.data(),
      id: doc.id
    }));
    setWorkouts(workoutsData);
  };

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

  return (
    <View>
      <Text>{auth.currentUser.uid}</Text>
      <Text>{auth.currentUser.phoneNumber}</Text>

      {workouts.map((workout) => (
        <Text key={workout.id}>{workout.name}</Text>
      ))}
    </View>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:27:08