您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

react挂钩中的useEffect执行顺序及其内部清理逻辑是什么?

react挂钩中的useEffect执行顺序及其内部清理逻辑是什么?

将这三行代码放入组件中,您将看到它们的优先顺序。

  useEffect(() => {
    console.log('useEffect')
    return () => {
      console.log('useEffect cleanup')
    }
  })

  window.requestAnimationFrame(() => console.log('requestAnimationFrame'))

  useLayoutEffect(() => {
    console.log('useLayoutEffect')
    return () => {
      console.log('useLayoutEffect cleanup')
    }
  })

useLayoutEffect > requestAnimationFrame > useEffect

您遇到的问题是由执行loopRaf清理功能之前请求另一个动画帧引起的useEffect

进一步的测试表明,该useLayoutEffect操作始终在之前被调用requestAnimationFrame并且其清理功能在下一次执行之前被调用,以防止重叠。

更改useEffectuseLayoutEffect,它应该可以解决您的问题。

useEffectuseLayoutEffect按照它们在代码中出现的顺序调用,就像useState调用一样。

您可以通过运行以下几行来查看:

  useEffect(() => {
    console.log('useEffect-1')
  })
  useEffect(() => {
    console.log('useEffect-2')
  })
  useLayoutEffect(() => {
    console.log('useLayoutEffect-1')
  })
  useLayoutEffect(() => {
    console.log('useLayoutEffect-2')
  })
其他 2022/1/1 18:22:52 有516人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶