严格模式下,会强制渲染两次,主要目的
let externalCounter = 0;
function ImpureComponent() {
externalCounter++; // 不纯的操作:修改外部变量
return <div>External Counter: {externalCounter}</div>;
}
function App() {
return (
<React.StrictMode>
<ImpureComponent />
</React.StrictMode>
);
}
function EffectComponent() {
useEffect(() => {
console.log("Effect ran"); // 副作用逻辑
const interval = setInterval(() => {
console.log("Interval tick");
}, 1000);
// 忘记清理定时器
}, []);
return <div>Check your console!</div>;
}
function App() {
return (
<React.StrictMode>
<EffectComponent />
</React.StrictMode>
);
}
React 的并发模式下,任务会被拆分为多个小任务(时间分片)。
每个小任务的结果会被计算出来,但不会立即渲染到页面上。
React 会等待所有任务完成后,才将最终结果一次性提交到 DOM。
这种机制确保了渲染的一致性和性能优化。
在特殊情况下(如 useDeferredValue 和 startTransition),React 允许部分更新以优化用户体验。
React 中闭包的应用场景非常广泛,主要包括:
Hooks 的实现(如 useState、useEffect)。
事件处理函数。
function Counter() {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(count + 1); // 通过闭包访问 `count`
};
return <button onClick={handleClick}>Count: {count}</button>;
}
副作用清理。
useEffect(() => {
const timer = setInterval(() => {
console.log('Timer tick');
}, 1000);
return () => {
clearInterval(timer); // 通过闭包访问 `timer`
};
}, []);
自定义 Hooks。
函数组件的渲染。
高阶组件(HOC)。
Context API。
回调函数。
function Parent() {
const [count, setCount] = useState(0);
const handleChildClick = () => {
setCount(count + 1); // 通过闭包访问 `count`
};
return <Child onClick={handleChildClick} />;
}
function Child({ onClick }) {
return <button onClick={onClick}>Click me</button>;
}
Memoization(如 useMemo、useCallback)。