当前位置: 首页 > 知识库问答 >
问题:

为什么'promise.then'在React组件中调用两次,而不是在console.log中调用?

淳于祺
2023-03-14

我对以下组件的输出感到非常困惑:

import { StrictMode } from "react"
import ReactDOM from "react-dom"

function Test(): React.ReactElement {
    console.log('render')
    Promise.resolve()
        .then(() => console.log('then ' + Math.random()))
    return <></>
}

ReactDOM.render(
  <StrictMode>
    <Test />
  </StrictMode>,
  document.getElementById("root")
)

它至少在Chrome和Firefox中产生以下输出:

00:46:30.264 render
00:46:30.267 then 0.5430663800781927
00:46:30.267 then 0.9667426372511254

转载:https://codesandbox.io/s/leagle-frost-dmcsl

编辑:我知道严格模式会导致额外的呈现,但如前所述,我会期待相同的消息计数。

共有1个答案

狄新立
2023-03-14

在react严格模式下,react可能会多次运行render,这可以部分解释您所看到的情况。

但是您确实想知道,如果是这种情况,并且render被调用了多次,为什么render没有打印两次呢?第一条线索在这里:

从React17开始,React自动修改控制台方法,如console.log(),以便在第二次调用生命周期函数时使日志保持沉默。但是,在可以使用变通方法的某些情况下,它可能会导致不希望的行为。

此外,正如我所怀疑的那样,它两次从promise回调中打印console.log,但没有两次从render中打印console.log,原因是它对promise回调中的console.log的处理不同。@Trincot的回答有更多关于这部分的细节。

 类似资料:
  • 问题内容: 我有一个想法,可能是因为我正在做一些样式设计来更改单选按钮,但是我不确定。我正在设置一个onClick事件,该事件两次调用了我的函数。我已删除它以确保它没有在其他地方被触发,并且onClick似乎是罪魁祸首。 我的功能目前仅是运输选项的简单控制台日志: 如果没有任何理由可以在这里看到为什么会发生这种情况,我可以发布其余代码,但是有很多方面,我认为这与之无关,但是我认为这是一个很好的起点

  • 编辑:由于代码剪贴不会重现错误-这里有一个指向github repo的链接:(代码远未完成) https://github.com/altruios/clicker-game 我现在已经在两台计算机上运行了它——这两台计算机都有相同的行为,而代码剪报并没有显示出来。 因此,我正在构建一个clicker游戏来学习react,我不明白为什么这段代码会以这种方式运行: 在主应用程序中,我有以下功能: 那

  • 我有一个组件,我设置了一个计数,让状态更新时,按钮点击。但是当我检查渲染时间时,每次我点击按钮它都会渲染两次。 https://codesandbox.io/s/brave-forest-yre6y?file=/src/App.js 我想知道: 为什么它是这样工作的

  • 我是新来的反应,什么来理解为什么console.log在渲染函数内部被调用两次? 如果我不从组件扩展,而是使用功能,控制台只打印一次

  • 我试图建立一个连接4的游戏,它有一个由7列组件组成的板组件,所有包含6个空间组件。每个列的上方都有一个拖放按钮,该按钮将用于将该件拖放到列中。为了在“红色”和“黑色”玩家之间交替,我创建了一个状态“redorblue”,它返回一个布尔值。 简而言之,当单击Drop按钮时,我希望切换“redorblue”的值,以跟踪轮到谁了。我已经将onClick函数设置为setState({redorblue:!

  • 我知道string1将包含一个空字符串。我的问题是为什么像下面这样两次调用nextLine方法会出现错误: