• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Angela2022
V2EX  ›  程序员

[React 的 onclick 事件函数中:执行语句外面包了一层 setTimeout((...), 0)是啥意思? 谢谢]

  •  
  •   Angela2022 · Nov 20, 2022 · 3754 views
    This topic created in 1449 days ago, the information mentioned may be changed or developed.
    const handleUpdate = (item)=>{
    setTimeout(()=>{
    updateForm.current.setFieldsValue(item)
    },0)
    }

    如上面代码所示
    React 的 onclick 事件函数中:执行语句外面包了一层 setTimeout((...), 0)是啥意思? 谢谢
    10 replies  •  2022-11-21 09:34:35 +08:00
    westoy
    westoy
    Nov 20, 2022 via Android
    1
    设计 dom 渲染,工程上会出现很多玄学问题。比如你第一行明明插入了一个元素,第二行操作的时候它却有可能还没被生成,所有的这类玄学问题都能通过一个 setTimeout 解决。
    westoy
    westoy
    Nov 20, 2022 via Android
    2
    涉及。。。
    TWorldIsNButThis
    TWorldIsNButThis
    Nov 20, 2022
    3
    异步执行
    Rocketer
    Rocketer
    Nov 20, 2022 via iPhone❤️1
    4
    关键词:javascript 事件循环
    userdhf
    userdhf
    Nov 20, 2022
    5
    拿 Promise 包一下更好...
    kongkx
    kongkx
    Nov 20, 2022 via iPhone
    6
    如一楼所说,强行调整执行顺序 ( event loop 相关)。至于是否必要,可以说是个玄学问题(太懒了,不想深究)
    eason1874
    eason1874
    Nov 20, 2022❤️1
    7
    JS 是单线程,代码排队执行,你想把一段代码放到队伍最后就可以用 setTimeout 0 (看起来是立即执行,其实是等其他事件后立即执行)

    比如 1 2 3 三个函数,一般按代码顺序执行,如果你给 2 setTimeout 0 ,那执行顺序就变成 1 3 2
    ragnaroks
    ragnaroks
    Nov 20, 2022
    8
    这里有两种可能。

    1 是代码作者不知道如何正确验证 updateForm.current 一定存在,想借 setTimeout 确保 DOM 已经存在。

    2 是代码作者不知道如何(在 react 中是 startTransition )正确将任务设置为闲置执行
    qzhai
    qzhai
    Nov 21, 2022
    9
    关键字: 微任务、宏任务、Event-Loop

    简单来说,有 Promise 这个函数之后,出现了新的执行顺序。

    ```
    setTimeout(_ => console.log(4))

    new Promise(resolve => {
    resolve()
    console.log(1)
    }).then(_ => {
    console.log(3)
    })

    console.log(2)

    ```

    上面代码 会 输出 1 2 3 4 。

    then 属于微任务,(这个要结合 Event-Loop 的原理去看 为什么异步要先执行微任务 )
    setTimeout 这种属于 宏任务,

    所以 一般出现 setTimeout 0 秒,是为了晚执行。
    amumu666
    amumu666
    Nov 21, 2022
    10
    我估计 onclick 事件还有其他 dom 操作。

    这代码是想在新增 dom 渲染之后,再进行赋值操作。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   673 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 85ms · UTC 20:06 · PVG 04:06 · LAX 12:06 · JFK 15:06
    ♥ Do have faith in what you're doing.