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

ReactJS中如何在Context中设置值?解决页面刷新state值丢失问题

解决页面刷新后schoolid状态丢失的问题

问题核心是useState的状态仅存在于组件内存中,页面刷新会触发组件重新挂载,state会回到初始的未定义状态。要解决这个问题,需要把schoolid持久化存储,比如用localStorage,同时结合Firebase的auth状态监听逻辑完善代码:

修改后的完整代码

const [schoolid, setSchoolid] = useState(localStorage.getItem('schoolid'));
const [user, setUser] = useState();

const mProps = {
    user,
    login,
    schoolid
};

async function login(email, password) {
    return signInWithEmailAndPassword(auth, email, password)
}

useEffect(() => {
    const unsubscribe = onAuthStateChanged(auth, async (currentuser) => {
        setUser(currentuser);
        if (currentuser) {
            // 用户已登录,获取schoolid
            const docRef = doc(db, "userTbl", currentuser.uid);
            const docSnap = await getDoc(docRef);
            if (docSnap.exists()) {
                const fetchedSchoolId = docSnap.data().schoolid;
                setSchoolid(fetchedSchoolId);
                // 同步存储到localStorage
                localStorage.setItem('schoolid', fetchedSchoolId);
            }
        } else {
            // 用户注销,清空状态和存储
            setSchoolid(null);
            localStorage.removeItem('schoolid');
        }
    });

    return unsubscribe;
}, []);

关键修改点说明

  • 初始值从localStorage读取:组件挂载时优先从localStorage获取之前存储的schoolid,刷新后能直接恢复状态。
  • 更新状态同步存储:获取到schoolid后,除了更新useState,同时把值存入localStorage,确保持久化。
  • 处理用户注销场景:当auth状态变为null(用户登出)时,清空state并删除localStorage中的schoolid,避免数据残留。

额外注意事项

  • 如果schoolid是数字类型,从localStorage读取时需要用parseInt转换,因为localStorage存储的是字符串。
  • 若需要更高安全性(比如敏感数据),可以改用sessionStorage,它会在浏览器关闭后自动清除数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:25:42