useEffect与useLayoutEffect的区别是什么?
时间: 2025-05-14 11:58:17 浏览: 34
### React 中 `useEffect` 和 `useLayoutEffect` 的区别
#### 1. 执行时机的不同
`useEffect` 是在浏览器完成布局和绘制之后执行副作用操作的钩子[^1]。这意味着当组件已经渲染到屏幕上并显示给用户时,`useEffect` 定义的回调才会被执行。
相比之下,`useLayoutEffect` 则是在浏览器完成布局计算但尚未将其绘制到屏幕上的阶段同步执行其定义的副作用逻辑[^3]。因此,如果某些副作用需要立即更新 DOM 并阻止视觉闪烁或不一致的情况发生,则应该优先考虑使用 `useLayoutEffect`。
#### 2. 性能影响方面
由于 `useLayoutEffect` 同步阻塞了页面重绘过程中的时间窗口,所以它可能会带来一定的性能开销;而异步性质使得 `useEffect` 更适合处理那些不会直接影响当前帧呈现效果的任务,比如网络请求、订阅事件等非紧急型工作负载[^4]。
以下是两个例子来展示它们如何应用:
```javascript
import React, { useState, useEffect } from 'react';
function ExampleComponent() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `You clicked ${count} times`;
});
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
```
在这个简单的计数器示例里,每当点击按钮改变状态变量 count 值的时候都会触发一次 effect 更新网页标题栏文字内容 —— 这种场景下显然无需担心即时性问题故采用标准版即可满足需求.
对于另一种情况:
```javascript
import React, { useLayoutEffect, useRef } from 'react';
const MeasureExample = () => {
const ref = useRef();
useLayoutEffect(() => {
console.log(ref.current.getBoundingClientRect());
}, []);
return <div ref={ref}>Hello World!</div>;
};
export default MeasureExample;
```
这里通过 `useLayoutEffect`, 可以确保测量行为发生在重新绘制前,从而避免可能因尺寸变化引起的闪屏现象.
综上所述,尽管两者都能用来管理函数式组件内的各种 side-effects ,但在实际开发过程中还是应当依据具体业务需求合理选用合适的工具选项.
阅读全文
相关推荐




















