useCallback
当把一个回调函数以依赖项数组作为参数传入 useCallback,它将返回一个缓存后的函数。
useCallback(fn, deps) 相当于 useMemo(() => fn, deps)。
useMemo、useEffect 的执行时机对比
useMemo 和 useCallback 都会在组件第一次渲染的时候执行,之后会在其依赖的变量发生改变时再次执行;并且这两个 hooks 都返回缓存的值,useMemo 返回缓存的变量,useCallback 返回缓存的函数。
useCallback 使用场景
useCallback
useCallback 跟 useMemo 比较类似,但它返回的是缓存的函数。
hooks 组件 state 改变后会引起父组件的重新渲染,而每次重新渲染都会生成一个新函数,所以 react 子组件 props 在浅比较的时候就会认为 props 改变了,引起子组件不必要的渲染。
const Message = memo(function Message({ value, changeValue }) {
console.log("Message");
return (
<div>
<button onClick={changeValue}>改变有关数据</button>
<p>与Message渲染有关的数据{value}</p>
</div>
);
});
function APP() {
const [value, setValue] = useState(123);
const [otherValue, setOtherValue] = useState(999);
const changeValue = useCallback(() => {
setValue((value) => value + 1);
}, []);
console.log("APP");
return (
<div>
<div>与Message渲染无关的数据==={otherValue}</div>
<br />
<button onClick={() => setOtherValue((value) => (value -= 5))}>
改变无关的数据
</button>
<br />
<br />
<Message value={value} changeValue={changeValue} />
</div>
);
}