【发布时间】:2022-11-02 23:15:35
【问题描述】:
我目前正在这个网站上工作:https://virgile-hasselmann.vercel.app/。并且有一个我无法解决的问题,我制作了一个自定义光标和一个 CursorContext 以在悬停时更改其状态等...我注意到当上下文更改其状态时,我的应用程序的每个组件都会重新呈现.为什么这样 ?以及如何解决? 我听说过记忆 ContextProvider 正下方的组件,但它似乎不起作用(提供程序下方的组件是我的布局组件,没问题吗?)
这是我的应用程序组件,我怎样才能防止那些无用的重新渲染发生?
function MyApp({ Component, pageProps }: AppProps) {
return (
<AuthProvider>
<CursorProvider>
<Layout>
<Component {...pageProps} />
</Layout>
</CursorProvider>
</AuthProvider>
);
}
我已将布局包装到 React.memo HOC 中,但没有用:
export default React.memo(Layout);
我尝试在布局组件中使用 useMemo :
const Layout = ({ children }: Props): JSX.Element => {
const { width } = useWindowSize();
const memoizedJSX = useMemo(() => {
return (
<div id="App" className="relative">
<Head>
<title>Virgile Hasselmann</title>
<meta
name="description"
content="Virgile Hasselmann, a video and photo portfolio"
/>
<link rel="icon" href="/favicon.ico" />
</Head>
{width! > 768 && <CustomCursor />}
<header className="fixed w-screen z-50">
<Navbar />
</header>
<main className="min-h-screen">
<div>{children}</div>
</main>
</div>
);
}, []);
return memoizedJSX;
};
它也没有工作......帮助!
【问题讨论】:
-
这就是上下文的工作方式。一旦状态改变,它将重新渲染它的所有孩子。您可以尝试仅使用 CursorProvider 包装鼠标组件,而将应用程序的其余部分留在其中。这样只有鼠标组件将在状态更改时重新呈现
-
我可以假设
<CustomCursor />是需要从<CursorProvider/>更新的内容吗?你能敲出一个简单的例子吗?我感觉您仍然可以使用CursorProvider,但您可能希望与事件混合而不是更改Provider.value
标签: javascript reactjs react-hooks next.js