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

React Context更新后页面未重渲染问题求助

问题:Context更新后页面未重渲染,持续显示Loading

我创建了用于存储当前登录用户等基础数据的Base Context,对应的User页面本该展示用户信息,但Context更新时页面并未重渲染。初始状态下Context未加载(isLoaded = false),当从API获取用户的初始化操作完成后,isLoaded与base.loaded均被设为true,Context已更新,但User页面仍持续显示“Loading...”,且页面已正确包裹在Context中。

问题原因

React的组件重渲染仅会响应通过useState/useReducer等钩子管理的状态变化。你当前的实现中,Base是普通JavaScript类实例,直接修改它的loaded属性(this.loaded = true)属于普通对象的属性变更,不会被React的状态检测机制感知到。User组件中获取的base是静态对象,其属性变化无法触发组件重渲染。

解决方案

方法1:用React状态管理Base实例

修改BaseProvider,通过useState保存Base实例,初始化完成后更新状态,让React感知到变化并触发重渲染:

"use client"

import { createContext, useContext, ReactNode, useState, useEffect } from 'react';
import Base from '@/scripts/classes/Base.class';

const BaseContext = createContext<Base | undefined>(undefined);

export const BaseProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
  const [base, setBase] = useState<Base | null>(null);
  const [isLoaded, setLoaded] = useState(false);

  useEffect(() => {
    const initBase = async () => {
      try {
        const newBase = new Base("123");
        await newBase.init();
        console.log("Initialized base");
        setBase(newBase); // 更新React状态,触发重渲染
        setLoaded(true);
      } catch (err) {
        console.log("ERROR ON INITIALIZATION", err);
      }
    };
    initBase();
  }, []);

  if (!isLoaded || !base) return "Loading Base...";

  return <BaseContext.Provider value={base}>{children}</BaseContext.Provider>;
};

export const useBase = () => {
  const context = useContext(BaseContext);
  if (!context) {
    throw new Error("useBase must be used within a BaseProvider");
  }
  return context;
};

方法2:简化User页面的判断逻辑

由于BaseProvider已经确保在base初始化完成后才渲染子组件,User页面无需再判断base.loaded,直接使用数据即可:

"use client"

export default function UserProfile({ params }: Props) {
    const base = useBase();
    // Provider已保证base完成初始化,无需额外判断
    return "Loaded " + base.users.me.username;
}

核心逻辑说明

通过useState保存Base实例后,调用setBase(newBase)会触发React的状态更新流程,Provider会重新渲染并将更新后的base传递给子组件,User页面因此会获取到最新的base实例并渲染用户信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:34:56