正如 React 文档中所说,应该谨慎使用此 API,因为可以使用更简单的替代方案来实现相同的结果。这是我理解并完全同意的。
但是,作为独立的 API,应该有一些强制要求的情况。令我困惑的是,即使是文档提到的此API的"罕见用例"也无法说服它是专门需要的。
以第二个用例为例:https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html#fetching-external-data-when-props-change
此生命周期方法仅用于在渲染新 props 之前清除陈旧数据。但是我们不能只清除组件DidUpdate中的过时数据吗?尽管它会触发不必要的重新渲染,其中道具比较是相等的,但对于它的价值来说,这是一个可接受的解决方案。
componentDidUpdate(prevProps, prevState) {
if (prevProps.id !== this.props.id) {
this.setState({ externalData: null });
this._loadAsyncData(this.props.id);
}
}
我稍微修改了一下,以显示这两种解决方案会产生相同的最终结果:https://codesandbox.io/embed/sharp-paper-p5hv2?fontsize=14&hidenavigation=1&theme=dark
您认为在哪里适合使用此 API?
我们不能只清除componentDidUpdate中的过时数据吗?尽管它会触发不必要的重新渲染,其中道具比较是相等的,但对于它的价值来说,这是一个可接受的解决方案。
如果可以接受呈现空内容,则不需要它。
我会在现有内容旁边使用加载指示器(通过更改状态中的标志(重新渲染(在加载新内容之前不清除现有数据( - 如果内容呈现为单独的组件(传递相同的道具,"演示与容器组件"(重新渲染很便宜。
现在我确信组件DidUpdate肯定可以做到这一点。缺点无非是额外的不必要的渲染通道和您必须在 componentDidUpdate 中关心的结束条件,以免触发无休止的渲染周期。但是通过使用getDerivedStateFromProps来避免这种不必要的渲染是值得的。