即使在 React 中更新了 props,是否存在 componentDidUpdate 不会触发的情况?
5 回答
有 3 种情况会导致 componentDidUpdate 不触发:
1) 您编写了一个返回 false 的自定义 shouldComponentUpdate。
2)内部react方法判断虚拟DOM没有变化,所以选择不重新渲染。
3) 你扩展了 React.Component 以外的东西(比如 PureComponent),它有一个默认的 shouldComponentUpdate 方法返回 false。
您可以通过在中返回 false 来抑制渲染shouldComponentUpdate()
。所以是的,在那种情况下componentDidUpdate()
不会开火。
如果您的组件在列表中并且组件的键更改(即在每次渲染时)或键丢失或键重复等,也会发生这种情况。
有关详细信息,请参阅文档: https ://reactjs.org/docs/lists-and-keys.html
发生这种情况的常见情况是发生多个不影响虚拟 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 更改时使用它来强制更新。
Nathan 的回答是正确的,但是当我搜索相同的答案时,它并没有解决我的问题。
有时它看起来像是更新了道具,但它是使用不同道具呈现的全新组件。检查componentDidMount
(例如在其中添加 console.log)以查看究竟发生了什么。