面试题答案
一键面试执行时机区别
- useEffect:
- 它在浏览器完成布局与绘制之后,在一个延迟的事件循环中异步执行。也就是说,当页面已经在屏幕上呈现给用户之后,才会触发
useEffect
中的回调函数。这确保了不会阻塞用户界面的渲染,因为它是在渲染完成后异步执行的。
- 它在浏览器完成布局与绘制之后,在一个延迟的事件循环中异步执行。也就是说,当页面已经在屏幕上呈现给用户之后,才会触发
- useLayoutEffect:
- 与
useEffect
不同,useLayoutEffect
是在浏览器完成布局与绘制之前同步执行。这意味着它会在所有的DOM变更之后,但在浏览器将变更渲染到屏幕之前运行。由于它是同步执行的,如果useLayoutEffect
中的代码执行时间过长,可能会阻塞浏览器的渲染,导致页面卡顿。
- 与
应用场景区别
- useEffect:
- 数据获取:常用于从API获取数据。例如,在组件挂载后,通过
useEffect
发送HTTP请求获取数据,因为这种操作不需要即时完成,不会影响页面的初始渲染。 - 副作用操作:如设置页面标题、订阅事件(如
window.addEventListener
)等不需要在渲染前完成的操作。这些操作不会阻塞渲染,并且通常在页面已经渲染后执行是合理的。
- 数据获取:常用于从API获取数据。例如,在组件挂载后,通过
- useLayoutEffect:
- DOM测量与操作:当需要在渲染前测量DOM元素的尺寸或基于DOM状态进行同步更新时使用。例如,要根据某个元素的宽度动态调整另一个元素的位置,
useLayoutEffect
可以在DOM更新后但渲染前获取准确的尺寸信息并进行相应调整。 - 避免闪烁:当需要立即更新DOM以避免视觉闪烁时使用。例如,初始渲染时需要隐藏一个元素,然后基于某些状态变化显示它,使用
useLayoutEffect
可以在渲染前完成这个隐藏操作,避免用户看到元素先显示后隐藏的闪烁现象。
- DOM测量与操作:当需要在渲染前测量DOM元素的尺寸或基于DOM状态进行同步更新时使用。例如,要根据某个元素的宽度动态调整另一个元素的位置,