在React.memo的文档中,它说:
此方法仅作为性能优化存在。不要依赖它来“阻止”渲染,因为这会导致错误。
我真的不明白这个警告。为什么不能依赖?如果它不一定阻止渲染,它如何优化?
我希望他们在这里更深入,但既然他们没有,有人可以详细说明一下吗?照原样,我根本不愿意使用它,因为这个警告使它的行为看起来很不清楚。
在React.memo的文档中,它说:
此方法仅作为性能优化存在。不要依赖它来“阻止”渲染,因为这会导致错误。
我真的不明白这个警告。为什么不能依赖?如果它不一定阻止渲染,它如何优化?
我希望他们在这里更深入,但既然他们没有,有人可以详细说明一下吗?照原样,我根本不愿意使用它,因为这个警告使它的行为看起来很不清楚。
也许,我们应该考虑一下官方文档中关于类似useMemo
功能的引用:
您可以依赖 useMemo 作为性能优化,而不是语义保证。
将来,React 可能会选择“忘记”一些先前记忆的值并在下一次渲染时重新计算它们,例如为屏幕外组件释放内存。编写您的代码,使其在没有 useMemo 的情况下仍然可以工作——然后添加它以优化性能。
我相信这同样适用于钩子React.memo
和useCallback
钩子,所以你不能 100% 依赖 React 不会“忘记”一些记忆的props来释放一些内存。
如果 Parent 组件将一个函数(特别是一个更新 Parent 状态的函数)向下传递给 Child 组件,则仅使用 React.memo 将不起作用。Parent 组件中的函数需要用 useCallback 钩子包装。这是因为每次父级重新渲染时该函数都会“重新渲染”,因此子级将始终认为该函数是一个新的props。
这是我发现的另一个关于React.memo 的有趣讨论
也React.memo
就是用于功能构件什么React.PureComponent
是类组件。
PureComponent
shouldComponentUpdate
默认处理方法(浅比较)。
shouldComponentUpdate
基本上告诉 react 是否需要和解。如果是,true
则react会newly returned element with the previously rendered one
使用其差异算法进行比较,并根据比较结果更新 DOM。可能存在一种情况,即组件已协调但呈现的 react 元素相同,因此没有发生 DOM 更改。
要获得上面的清晰图片,请查看此图表
我认为根据上面我们可以说,React.memo
也告诉我们render
循环是否应该为一个组件运行。实际的 DOM 更改取决于 react 更新 DOM 的差异算法。