React | useCallback-使用
🚀 React 提供的一个 Hook,用于缓存函数,达到优化性能。
1. 为什么需要 useCallback?
在 React 中,每次组件渲染时,函数组件内部的函数都会被重新创建。
如果这些函数被传递给子组件,可能会导致子组件不必要的重新渲染,即使子组件的 props 没有实际变化。
useCallback 的作用是缓存函数,只有在依赖项发生变化时才会重新创建函数,从而减少不必要的重新渲染。
2、 useCallback 的基本用法
const memoizedCallback = useCallback(
() => {
// 函数逻辑
},
[dependency1, dependency2], // 依赖项数组
);
第一个参数: 需要缓存的函数。
第二个参数: 依赖项数组。只有当依赖项发生变化时,才会重新创建函数。
依赖数组: 决定了 useCallback 何时重新创建函数:
如果依赖数组为空([]):函数只会在组件挂载时创建一次,之后不会重新创建。
如果依赖数组不为空:只有当依赖项发生变化时,才会重新创建函数。
如果省略依赖数组:每次组件渲染时都会重新创建函数。
3、 useCallback 的主要应用场景
1)优化子组件的渲染:
当父组件将一个函数作为 props 传递给子组件时,如果父组件重新渲染,
导致子组件即使使用了 React.memo 也会重新渲染。
const Child = React.memo(({ onClick }) => {
console.log('Child 渲染了');
return <button onClick={onClick}>点击</button>;
});
function Parent() {
const [count, setCount] = useState(0);
const handleClick = useCallback(() => {
console.log('按钮被点击了');
}, []); // 空依赖数组,函数不会重新创建
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>增加 Count</button>
<Child onClick={handleClick} />
</div>
);
}
📍 如果你移除 useCallback:
当你点击“增加 Count”按钮时, Parent 组件的 count 状态会更新,导致 Parent 组件重新渲染。
每次 Parent 组件重新渲染时,handleClick 函数都会重新创建,导致 Child 组件的 onClick prop 发生变化,
从而触发 Child 组件的重新渲染。