给定一个基本的 NextJs 应用程序,其中包含一个简单的上下文组件和几个页面
// AppContextWrapper.js
export function AppContextWrapper(props) {
console.log('AppContextWrapper - component function executed');
const appContextState = useState();
return (
<AppContext.Provider value={appContextState}>
{props.children}
</AppContext.Provider>
);
}
// _app.js
function MyApp({ Component, pageProps }) {
return (
<AppContextWrapper>
<Layout>
<Component {...pageProps} />
</Layout>
</AppContextWrapper>
);
}
我注意到从一个页面导航到另一个页面会触发重新执行AppContextWrapper
组件功能。
在基本的非 NextJs React 应用程序中,这种情况不会发生。
// index.js
ReactDOM.render(
<React.StrictMode>
<AppContextWrapper>
<App />
</AppContextWrapper>
</React.StrictMode>,
document.getElementById('root')
);
// app.js
function App() {
return (
<BrowserRouter>
<div>
<nav>
<ul>
<li>
<Link to='/'>Home</Link>
</li>
<li>
<Link to='/other'>Other</Link>
</li>
</ul>
</nav>
<Switch>
<Route path='/other'>
<OtherPage />
</Route>
<Route path='/'>
<HomePage />
</Route>
</Switch>
</div>
</BrowserRouter>
);
}
发生这种情况可能是因为在 NextJs 应用程序导航中导致重新分配Component
and pageProps
in _app.js
因此导致重新执行MyApp
组件功能。
我有几个与此相关的问题。
重新执行上下文组件函数是否存在潜在问题?
NextJs 应用程序中是否有某个位置可以安装上下文组件来避免重新执行?
最后,我看到了使用的代码useMemo
在上下文函数中,就像这样......
// appContextWrapper.js
export function AppContextWrapper(props) {
console.log('AppContextWrapper component function executed');
const [appState, setAppState] = useState({});
const appContextState = useMemo(() => ({ appState, setAppState }), [appState, setAppState]);
return (
<AppContext.Provider value={appContextState}>{props.children}</AppContext.Provider>
);
}
我不明白这种方法是否合理?我的理解是useMemo
应用于记忆不会改变的 props 或计算值,以防止子组件的组件函数不必要地重新执行。使用useMemo
保存已由 React 通过 useState 管理的值似乎毫无意义且多余。