javascript - 如果不需要任何道具,我应该用 React.memo() 包装我的所有组件吗?
问题描述
虽然很明显为什么React
默认情况下不对所有功能组件执行 React.memo,但我们应该在需要时自行包装我们的功能组件。
就我而言,我有一个大型反应项目,其结构如下:
const MyBigApp = () => {
const shouldShowX = useSelector(getShouldShowX);
const shouldShowY = useSelector(getShouldShowY);
// Many more selectors
return (
<>
{shouldShowX && <ComplexComponentX />}
{shouldShowY && <ComplexComponentY />}
{/* many more components based on different selectors like above */}
</>
);
};
我所有的业务逻辑都在 redux 内部,组件在useSelector
内部使用以从商店获取数据。
用 包装我的所有子组件是否有意义React.memo
,因为根级别的任何选择器的更改都会导致我的整个应用程序重新渲染?
早些时候,connect
我们自动获取了一个 memoized 组件,该组件正在比较自定义 props 和作为 props 传递给组件的存储值,所以我们现在是否应该在未接收任何 props 的组件中使用时总是手动执行?React.memo
useSelector
解决方案
我认为您应该考虑使用React.memo
那些不接受任何道具的子组件。我强烈推荐这篇文章:https ://dmitripavlutin.com/use-react-memo-wisely/
2.1 组件经常使用相同的 props 渲染 将
组件包装在 React.memo() 中的最佳情况是,当您希望功能组件经常且通常使用相同的 props 进行渲染时。
由于您询问的组件不接受任何道具,这意味着道具永远不会改变。因此,使用React.memo
可以避免渲染周期是有道理的。请注意同一篇文章中的这一重要警告:
5. React.memo() 是性能提示
严格来说,React 使用 memoization 作为性能提示。虽然在大多数情况下 React 会避免渲染一个记忆化的组件,但你不应该指望它来阻止渲染。
推荐阅读
- java - Gson 不映射 Java 中的值
- python - 使用 yfinance python 从 yahoo Finance 获取财务数据
- java - 我可以从毫秒值中获取当前时间的值吗
- vb.net - EMGU CV 与 vb.net
- ms-access - 如何设计两个不直接相关的表的查询
- apache-spark - 如果 mapPartitions 与 toDF() 一起使用,为什么很少有分区被处理两次
- javascript - 如何从 http 请求运行节点 localhost 子进程?
- r - 如何将子图应用于具有辅助 y 轴的图列表
- excel - vba excel datediff计算不同的结果
- typescript - 模拟类方法的 jest.fn() 的自动类型