useEffect首次渲染时State未展示,Firebase onValue数据加载问题排查
问题原因
你遇到的问题和useState更新速度无关,核心是异步执行逻辑和代码语法错误两个问题:
- Firebase的
onValue是异步监听函数,你注册监听后不会马上执行回调,会先继续走后面的同步代码。也就是你调用showAttendance(aux)的时候,回调还没触发,aux还是初始的空对象,所以第一次更新的attendance_list1就是空数组。等后续onValue拿到数据之后,你只更新了allAttendanceDetails,没有重新触发showAttendance更新attendance_list1,自然渲染不出来。 - 你的
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
相关产品推荐
相关产品推荐

