reactjs - React Hooks:当只有 props.children 值发生变化时,如何防止重新渲染整个组件?
问题描述
我有一个看起来像这样的布局组件:
export const Layout = (props) => {
return (
<div>
<MenuBar />
{props.children}
<Footer />
</div>
);
};
...我想使用这个 Layout 组件来呈现不同页面的内容,如下所示:
export const App = () => {
return (
<div>
<Router>
<Layout>
<Switch>
<Route exact path="/">
<PageHome />
</Route>
<Route path="/about">
<PageAbout />
</Route>
</Switch>
<Layout />
</Router>
</div>
);
};
现在我遇到的问题是,每次路由更改时,props.children 值都会更改,因此整个 Layout 组件(包括 MenuBar 和 Footer)以及页面内容都会重新呈现。所以我的问题是:
- 当 props.children 值发生变化时,我可以防止布局重新渲染吗?
- 如果不是,那么防止 Layout 在每次路由更改时重新渲染以将 Switch 组件移出 Layout 的子项的唯一方法是什么?
解决方案
Layout
必须重新渲染它本身,因为它有新的孩子,但是你可以通过使用 React.memo 创建它们来防止和组件MenuBar
重新Footer
渲染:
const MenuBar = React.memo(function MyComponent(props) {
/* render using props, it won't re rerender unless props change */
});
推荐阅读
- sql-server - 覆盖静态 INSERT 语句中的重复行
- c# - TFS 构建失败 XML 命名空间 'clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly 中不存在标记'Chart'
- html - 对于初学者,我可以通过 CSS 代码轻松调试吗?
- data-science - Gretl 不预测测试数据
- html - 隐藏/取消特定图像的悬停效果
- c - 为什么作为位域的一部分的枚举值需要从 unsigned char 到枚举类型的(隐式)类型转换?
- swift - 如何实时向音频流添加帧以对音频进行时间拉伸
- vba - VBA 嵌套索引匹配语法错误
- python - 每当线程运行时,PythonQt QRunnable GUI 就会崩溃
- php - 麻烦在 Mac 上本地运行 PHP 5.6 应用程序