是什么让 React.memo 不可靠地防止渲染?

IT技术 reactjs
2021-05-24 15:14:29

React.memo文档中,它说:

此方法仅作为性能优化存在。不要依赖它来“阻止”渲染,因为这会导致错误。

我真的不明白这个警告。为什么不能依赖?如果它不一定阻止渲染,它如何优化?

我希望他们在这里更深入,但既然他们没有,有人可以详细说明一下吗?照原样,我根本不愿意使用它,因为这个警告使它的行为看起来很不清楚。

2个回答

也许,我们应该考虑一下官方文档中关于类似useMemo功能的引用

您可以依赖 useMemo 作为性能优化,而不是语义保证。

将来,React 可能会选择“忘记”一些先前记忆的值并在下一次渲染时重新计算它们,例如为屏幕外组件释放内存。编写您的代码,使其在没有 useMemo 的情况下仍然可以工作——然后添加它以优化性能。

我相信这同样适用于钩子React.memouseCallback钩子,所以你不能 100% 依赖 React 不会“忘记”一些记忆的props来释放一些内存。

如果 Parent 组件将一个函数(特别是一个更新 Parent 状态的函数)向下传递给 Child 组件,则仅使用 React.memo 将不起作用。Parent 组件中的函数需要用 useCallback 钩子包装。这是因为每次父级重新渲染时该函数都会“重新渲染”,因此子级将始终认为该函数是一个新的props。

此处阅读更多相关信息

这是我发现的另一个关于React.memo 的有趣讨论

React.memo就是用于功能构件什么React.PureComponent是类组件。

PureComponentshouldComponentUpdate默认处理方法(浅比较)。

shouldComponentUpdate基本上告诉 react 是否需要和解。如果是,true则react会newly returned element with the previously rendered one使用其差异算法进行比较,并根据比较结果更新 DOM。可能存在一种情况,即组件已协调但呈现的 react 元素相同,因此没有发生 DOM 更改。

要获得上面的清晰图片,请查看此图表

我认为根据上面我们可以说,React.memo也告诉我们render循环是否应该为一个组件运行。实际的 DOM 更改取决于 react 更新 DOM 的差异算法。