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

React Context更新异常:登录后其他页面无法获取用户上下文

问题分析

你的CurrentUserContext状态仅存在UserContextLayout组件的内存中,没有做持久化处理。一旦页面刷新(或组件重新挂载),状态就会重置为初始值null;另外登录时直接调用navigate,虽然setCurrentUserContext是异步操作,但单页路由跳转场景下,核心问题还是状态未持久化导致的丢失。

修复方案

1. 给用户上下文加上持久化逻辑

修改UserContextLayout.jsx,让组件初始化时从localStorage读取用户信息,状态更新时同步写入存储:

import { Outlet } from "react-router-dom";
import { useState, useEffect } from "react";
import { CurrentUserContext } from "../hooks/CurrentUserContext";

const UserContextLayout = () => {
  // 从localStorage初始化用户状态
  const [currentUserContext, setCurrentUserContext] = useState(() => {
    const savedUser = localStorage.getItem("currentUser");
    return savedUser ? JSON.parse(savedUser) : null;
  });

  // 状态变化时同步到localStorage
  useEffect(() => {
    if (currentUserContext) {
      localStorage.setItem("currentUser", JSON.stringify(currentUserContext));
    } else {
      localStorage.removeItem("currentUser");
    }
  }, [currentUserContext]);

  return (
    <CurrentUserContext.Provider
      value={[currentUserContext, setCurrentUserContext]}
    >
      <Outlet />
    </CurrentUserContext.Provider>
  );
};

export default UserContextLayout;

2. 优化登录跳转逻辑(可选)

如果担心setCurrentUserContext异步更新还没完成就跳转,可以用useEffect监听状态变化后再跳转:
修改Signin.jsx的相关代码:

// 新增useEffect监听用户状态
useEffect(() => {
  if (currentUserContext) {
    navigate("/");
  }
}, [currentUserContext, navigate]);

const handleSubmit = async () => {
  try {
    const response = await signin(user1);
    setCurrentUserContext(response.data.user);
    authenticate(response.data.token, rememberMe);
  } catch (error) {
    console.log(error);
  }
};

3. 修复路由中的导入遗漏

你的MainRouter.jsx里用了Navigate但没导入,补上:

import { Route, Routes, Navigate } from "react-router-dom";
验证方法

登录成功后,打开浏览器开发者工具的Application标签,查看localStorage里是否有currentUser条目。刷新页面后,上下文会自动从localStorage恢复用户信息,不再是null。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:10:51