React JS页面刷新时数据丢失如何实现数据持久化?
解决方案
1. 替换直接从props取user的逻辑,改用Firebase身份状态监听
Firebase Auth默认会自动持久化用户登录状态,无需依赖React组件状态/Props传递用户信息,只要监听onAuthStateChanged事件即可在页面加载、刷新时自动获取当前登录的有效用户信息。
示例代码可直接在ListadoPedidos组件中使用:
import { getAuth, onAuthStateChanged } from "firebase/auth"; import { useEffect, useState } from "react"; function ListadoPedidos() { const [user, setUser] = useState(null); const [estudiantes, setEstudiantes] = useState([]); const auth = getAuth(); useEffect(() => { // 监听身份状态变化,页面刷新时会自动触发回调返回当前登录用户 const unsubscribe = onAuthStateChanged(auth, (currentUser) => { if (currentUser) { setUser(currentUser); // 确认用户存在后再执行Firebase数据查询逻辑 const estudiantesRef = db.collection("usuarios").doc(currentUser.uid).collection("estudiantes"); // 此处补充你的集合数据拉取、set到state渲染表格的逻辑 } else { // 未登录状态处理,比如跳转登录页、清空表格数据 setUser(null); } }); // 组件卸载时取消监听避免内存泄漏 return () => unsubscribe(); }, [auth]); // 未拿到用户前显示加载占位,避免提前访问user.uid报错 if (!user) return <div>加载中...</div>; // 你的表格渲染逻辑 return ( // 表格代码 ) }
2. 补充空值兜底校验避免报错
所有访问user.uid的场景都先判断user是否存在,避免偶发的空值报错:
// 错误写法:直接访问可能为null的user属性 estudiantesRef = db.collection("usuarios").doc(user.uid).collection("estudiantes") // 正确写法:先校验再执行 let estudiantesRef; if (user) { estudiantesRef = db.collection("usuarios").doc(user.uid).collection("estudiantes"); // 后续数据操作 }
3. 可选:保留Props传参逻辑的适配方案
如果确实需要在父层维护user状态,可结合本地存储做持久化:
// 父层登录成功后存储用户必要信息 localStorage.setItem('userInfo', JSON.stringify(user)); // 父层初始化时先从本地存储取初始值 const initialUser = localStorage.getItem('userInfo') ? JSON.parse(localStorage.getItem('userInfo')) : null; const [user, setUser] = useState(initialUser); // 配合onAuthStateChanged同步最新状态,避免本地存储信息过期 useEffect(() => { const unsubscribe = onAuthStateChanged(auth, (currentUser) => { if (currentUser) { setUser(currentUser); localStorage.setItem('userInfo', JSON.stringify(currentUser)); } else { setUser(null); localStorage.removeItem('userInfo'); } }) return () => unsubscribe(); }, [auth])
内容的提问来源于stack exchange,提问作者React Enjoyer
相关产品推荐
相关产品推荐

