【问题标题】:Multiple times render in react functional component with hooks [duplicate]使用钩子多次渲染反应功能组件[重复]
【发布时间】:2020-02-29 23:38:00
【问题描述】:

实际上,我没有得到这个问题的正确观点。于是寻求帮助。 我有这个状态的全功能组件。 我在这里注意到的是,当我使用 useEffect 钩子获取数据时,我得到了正确的响应。

问题是,当我在 return 语句中执行 console.log("ok") 时,它会在控制台中多次提供输出。图片添加如下:

这是我的状态和 useEffect 钩子

这是我的返回函数

这是我每次浏览页面时得到的控制台输出。

为什么 console.log("ok") 会执行多次?

【问题讨论】:

  • "默认情况下,它会在第一次渲染后和每次更新后运行。" reactjs.org/docs/hooks-effect.html
  • @Faz 但console.log() 不在效果内,即使它会在挂载后仅记录一次,因为依赖项列表为空。
  • 请避免将代码发布为图片。这使得人们更难复制代码的一部分并用它创建沙箱进行测试。此外,这些图像将来可能会变得不可用。请改用代码块或代码 sn-p 编辑器。

标签: reactjs react-hooks use-effect


【解决方案1】:

React 非常简单,基本上一直在重新渲染所有内容。如果组件的状态发生变化,则会触发重新渲染。您更新状态 4 次,这就是原因。

【讨论】:

  • 这不正确,React 可能会批量更新状态
  • 是的,当您“手动”调用状态更新时,它可以但在这种特定情况下不能。 :)
  • 这实际上取决于您是在 React 事件处理程序内部还是外部设置状态:github.com/facebook/react/issues/10231#issuecomment-316644950.
  • 这并不完全正确。默认情况下,它只会重新渲染 props 或 state 发生变化的组件及其子组件。此外,多个状态更新可能会被批处理,从而导致仅重新渲染一次。
【解决方案2】:

它没有执行multiple次,它执行了5次:

  1. useEffect(第一次渲染)
  2. setMovies
  3. setHeroImage
  4. setCusrrentPage
  5. setTotalPages

useEffect 的 deps 为 [],所以这只发生在第一次渲染时。然后您将更改状态 4 次,因此会发生重新渲染。这并不意味着 DOM 改变了 5 次。

【讨论】:

  • 也许 OP 期望批量更新多个状态,这通常是这种情况。但是正如@El Aoutar Hamza 链接的问题的答案中所指出的,如果状态更新发生在异步处理程序中,则这不适用。
  • 如果我的组件的钩子版本渲染 5 次而不是 1 次,这怎么可能比类组件的 setState 更高性能? /跨度>
猜你喜欢
  • 2019-07-27
  • 1970-01-01
  • 2021-06-08
  • 2020-08-03
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 2019-12-22
相关资源
最近更新 更多