react hook中的不理解

useMutationEffect和useLayoutEffect的区别怎么这么不明显?有什么区别么?
自己做实验`console.log('开始代码上的use')//1

  useEffect(() => {//6
    const btn = document.getElementById('btn')
    console.log(btn, btn.style.backgroundColor, btn.style.width, btn.style.color, 'useEffect')
  })

  //5和6之间出view
  useLayoutEffect(() => {//5
    const btn = document.getElementById('btn')
    console.log(btn, btn.style.backgroundColor, btn.style.width, btn.style.color, 'useLayoutEffect') 
  })

  useMutationEffect(() => {//4
    const btn = document.getElementById('btn')
    console.log(btn, btn.style.backgroundColor, btn.style.width, btn.style.color, 'useMutationEffect')
  })
  console.log('结束代码上的use')//2
  return (
    <div>
      {computed}
      <input type = 'text' value = { value } onChange = {(e) => setValue(e.target.value)} />
      <br />
      <input type = 'text' value = { name} onChange = {(e) => setName(e.target.value)}/>
      <Button onClick = { handleClick } style = {{ backgroundColor: 'red', width: '50px', color: color}} id = 'btn'/>
      {console.log('render')}{/* //3 */}
      
    </div>
  )
}`

发现除了顺序不同并没有明显区别?看来很多文档都是这样描述的:
useMutationEffect
api与useEffect相同,但在更新兄弟组件之前,它在React执行其DOM改变的同一阶段同步触发。使用它来执行自定义DOM改变。

useLayoutEffect
api与useEffect相同,但在所有DOM改变后同步触发。使用它来从DOM读取布局并同步重新渲染。在浏览器有机会绘制之前,将在useLayoutEffect内部计划的更新将同步刷新。

然后就是这句:
注意 避免在useMutationEffect中读取DOM。在读取计算样式或布局信息时,useLayoutEffect更合适。
然后这篇文章:https://stackoverflow.com/que...;有什么通俗易懂的解释能说清楚的?或者是用代码直观的证明??

阅读 1.7k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题