2 回答
TA贡献1155条经验 获得超0个赞
答案是 React 使用一组启发式方法来确定它是否可以避免再次调用渲染函数。这些启发式方法可能会在版本之间发生变化,并且不能保证在状态相同时总是退出。React 提供的唯一保证是,如果状态相同,它不会重新渲染子组件。
你的渲染函数应该是纯的。因此,它们运行多少次并不重要。如果您在渲染函数中计算一些昂贵的东西并且担心调用它而不是必要的,您可以将该计算包装在useMemo
.
一般来说,React 中的“计数渲染”是没有用的。React 何时调用您的函数取决于 React 本身,并且确切的时间将在版本之间不断变化。这不是合同的一部分。
TA贡献1827条经验 获得超8个赞
这似乎是一种预期的行为。
来自React 文档:
摆脱状态更新
如果您将 State Hook 更新为与当前状态相同的值,React 将退出而不渲染子级或触发效果。(React 使用
Object.is
比较算法。)请注意,React 可能仍需要在退出之前再次渲染该特定组件。这不应该是一个问题,因为 React 不会不必要地“深入”到树中。如果您在渲染时进行昂贵的计算,您可以使用
useMemo
.
因此,React确实在第一个演示的第 4 步和第二个演示的第 3 步重新渲染了组件。因此,它执行函数内的所有代码,并调用React.createElement()
组件的每个子组件。
但是,它不会渲染组件的任何后代,也不会触发效果。
这仅适用于功能组件。对于纯类组件,render
如果状态未更改,则永远不会调用该方法。
我们无法避免重新运行。记住这个函数memo()
也无济于事,因为它只检查 props的变化,而不是状态。所以我们只需要考虑这种情况。
这并不能回答 React 为什么以及何时运行该函数但退出,以及何时它根本不运行该函数的问题。如果您知道原因,请添加您的答案。
添加回答
举报