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

useEffect首次渲染时State未展示,Firebase onValue数据加载问题排查

问题原因

你遇到的问题和useState更新速度无关,核心是异步执行逻辑和代码语法错误两个问题:

  1. Firebase的onValue是异步监听函数,你注册监听后不会马上执行回调,会先继续走后面的同步代码。也就是你调用showAttendance(aux)的时候,回调还没触发,aux还是初始的空对象,所以第一次更新的attendance_list1就是空数组。等后续onValue拿到数据之后,你只更新了allAttendanceDetails,没有重新触发showAttendance更新attendance_list1,自然渲染不出来。
  2. 你的showAttendance函数存在语法错误:没有定义接收参数,函数内部遍历的x是未定义变量,即使后续拿到正确数据调用,也会报错无法正常更新状态。
修复方案
  • 把showAttendance的调用移到onValue的回调内部,确保拿到Firebase返回的真实数据后再执行处理逻辑
  • 修正showAttendance的参数定义,用传入的参数作为遍历数据源
  • 把nume_mat加到useEffect的依赖数组中,保证路径参数变更时可以重新注册正确的监听
  • 新增组件卸载时取消Firebase监听的逻辑,避免内存泄漏
修复后代码
const [attendance_list1, setAttendanceList1] = useState([]);

useEffect(() => {
  console.log("entered Use ef");
  const db = getDatabase();
  const reference = ref(db, `prezente/${nume_mat}`);
  // 注册Firebase监听,拿到取消监听的方法
  const unsubscribe = onValue(reference, (snapshot) => {
    const mat = snapshot.val();
    setAllAttendanceDetails(mat);
    // 拿到数据后再调用处理函数
    showAttendance(mat);
  });
  // 组件卸载时取消监听
  return () => unsubscribe();
}, [nume_mat]); // 把路径参数加入依赖

// 修正参数定义,用传入的对象遍历
function showAttendance(x){
  let aux = [];
  for (var key in x) {
    if (x.hasOwnProperty(key)) {
      aux.push(x[key]);
    }
  }
  setAttendanceList1(aux);
}

return (
  <View>
    <Text style={{ fontWeight: "bold" }}>Attendance List 1</Text>
    {attendance_list1.map((item, i) => {
      return <Text key={i}>{item}</Text>;
    })}
  </View>
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:24:04