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

如何修复Context Provider的value每次渲染都变化的useMemo提示错误?

解决Context Provider每次渲染创建新对象的错误

错误提示「The object passed as the value prop to the Context provider changes every render」的原因是:每次MyApp组件渲染时,都会生成一个全新的对象作为ModeContext.Provider的value,React会判定这个值每次都不同,触发所有订阅该Context的组件无意义重渲染。

用useMemo缓存这个对象就能解决问题,具体修改如下:

修改后的完整代码

import { useEffect, useState, useMemo } from "react";
import { useRouter } from "next/router";
import { ThemeProvider } from "next-themes";
import { ContextProvider } from "src/context/context";
import { ModeContext } from "src/context/ModeContext";

const MyApp = ({ Component, pageProps }) => {
    const [kycState, setkycState] = useState("unverified");
    const [kybState, setkybState] = useState("unverified");
    const router = useRouter();

    // 用useMemo缓存Context值,仅当依赖项变化时重新生成对象
    const contextValue = useMemo(() => ({
        kycState,
        setkycState,
        kybState,
        setkybState
    }), [kycState, kybState]);

    return (
        <ContextProvider>
            <ModeContext.Provider value={contextValue}>
                <ThemeProvider defaultTheme="dark">
                    <Component {...pageProps} />
                </ThemeProvider>
            </ModeContext.Provider>
        </ContextProvider>
    );
};

export default MyApp;

关键说明

  • useMemo的依赖数组只放kycState和kybState:React保证setState函数(如setkycState)在组件生命周期内引用稳定,不需要加入依赖项。
  • 只有当kycState或kybState变化时,contextValue才会重新创建,避免了不必要的组件重渲染,同时消除错误提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:54:24