7

即使在 React 中更新了 props,是否存在 componentDidUpdate 不会触发的情况?

4

5 回答 5

6

有 3 种情况会导致 componentDidUpdate 不触发:

1) 您编写了一个返回 false 的自定义 shouldComponentUpdate。

2)内部react方法判断虚拟DOM没有变化,所以选择不重新渲染。

3) 你扩展了 React.Component 以外的东西(比如 PureComponent),它有一个默认的 shouldComponentUpdate 方法返回 false。

于 2018-06-22T21:35:54.477 回答
3

您可以通过在中返回 false 来抑制渲染shouldComponentUpdate()。所以是的,在那种情况下componentDidUpdate()不会开火。

于 2018-06-22T21:06:18.843 回答
3

如果您的组件在列表中并且组件的更改(即在每次渲染时)或键丢失或键重复等,也会发生这种情况。

有关详细信息,请参阅文档: https ://reactjs.org/docs/lists-and-keys.html

于 2019-02-12T04:09:23.193 回答
3

发生这种情况的常见情况是发生多个不影响虚拟 DOM 中的任何内容的 prop 更改。

例如,如果 API 返回 200 状态码,您可能希望显示一条成功消息,其中的 props 会发生如下变化:

未调用 API:

this.props.apiState == false

API调用:

this.props.apiState == 'loading'

API成功:

this.props.apiState == 'success'

在这种情况下componentDidUpdate只会触发一次,如果您this.props.apiState在触发时控制台日志,您将看到它是loading. componentDidUpdate因此,任何正在等待的触发器success都不会发生。

ComponentWillReceiveProps在较旧版本的 React 中处理此问题,在较新版本的 React 中,您可以shouldComponentUpdate在发生所需的 prop 更改时使用它来强制更新。

于 2019-10-26T13:01:39.617 回答
0

Nathan 的回答是正确的,但是当我搜索相同的答案时,它并没有解决我的问题。

有时它看起来像是更新了道具,但它是使用不同道具呈现的全新组件。检查componentDidMount(例如在其中添加 console.log)以查看究竟发生了什么。

于 2021-01-28T09:01:40.267 回答