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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:54:03