【问题标题】:Why the user won’t see the intermediate state after call setState() immediately in componentDidMount()为什么用户在 componentDidMount() 中立即调用 setState() 后看不到中间状态
【发布时间】:2020-07-09 02:42:29
【问题描述】:

在 React 文档中,https://reactjs.org/docs/react-component.html

您可以立即在 componentDidMount() 中调用 setState()。它会触发额外的渲染,但会在浏览器更新屏幕之前发生。这保证了即使在这种情况下 render() 将被调用两次,用户也不会看到中间状态。请谨慎使用此模式,因为它通常会导致性能问题。在大多数情况下,您应该能够在 constructor() 中分配初始状态。但是,对于模态框和工具提示等情况,当您需要在渲染取决于其大小或位置的内容之前测量 DOM 节点时,它可能是必要的。

在我自己看来,当我们调用 componentDidMount() 时,组件已经渲染了一次。我们调用 setState,组件会再次渲染。我如何理解It will trigger an extra rendering, but it will happen before the browser updates the screen.?第一个 render() 不会更新屏幕吗?

【问题讨论】:

  • 鉴于 JS 的用户空间是单线程的,如果您在事件循环迭代期间修改 DOM 两次 - 布局将只绘制一次。换句话说:e.textContent = 'foo'; e.textContent = 'bar'; 是 1 个油漆。不是 2.

标签: javascript reactjs


【解决方案1】:

第一个render()不更新屏幕吗?

没有。在“渲染阶段”,render() 调用是其中的一部分,您对虚拟 DOM 进行更改。

所以这样的阶段不会更新屏幕。

我怎么理解“它会触发额外的渲染,但它会在浏览器更新屏幕之前发生”。

componentDidMount 生命周期是“提交阶段”的一部分,它提交对 DOM 的更改,因此正如注释所说,通过调用 React API,您可以触发另一个渲染,即触发另一个“渲染阶段”。

【讨论】:

    猜你喜欢
    • 2018-08-17
    • 2015-08-27
    • 2019-09-03
    • 1970-01-01
    相关资源
    最近更新 更多