「目标」: 持续输出!每日分享关于web前端常见知识、面试题、性能优化、新技术等方面的内容。
提到react
项目中的性能优化,我们马上就能想到两个钩子:useMemo
、useCallback
。前一期文章已经简单聊过useMemo了,今天我们将从「用法」、「工作原理」、「作用」、「优缺点」、「使用场景」、「使用注意点」这六个角度来介绍useCallback
useCallback
用于缓存一个函数,以便在组件重新渲染时避免不必要的函数创建和内存分配。它的基本用法如下:
const memoizedCallback = useCallback(
() => {
// 函数体
},
[dependencies]
);
useCallback
接受两个参数,第一个参数是要缓存的函数,第二个参数是一个依赖数组,只有当依赖数组中的值发生变化时,才会重新创建函数。如果依赖数组为空,函数将永远不会重新创建。
useCallback
使用了 memoization 技术,它会在每次渲染时比较依赖数组中的值是否发生了变化。如果依赖数组中的值没有变化,它会返回上一次创建的函数引用,否则会创建一个新的函数。
useCallback
可以确保子组件不会因为父组件的重新渲染而重新渲染,除非依赖数组中的值发生变化。 「优点」:
「缺点」:
以下是一些常见的使用场景:
import React, { useCallback } from 'react';
import ChildComponent from './ChildComponent';
function ParentComponent() {
const handleClick = useCallback(() => {
// 处理点击事件
}, []);
return <ChildComponent onClick={handleClick} />;
}
在这个场景中,我们使用 useCallback
来确保 handleClick
函数不会因为 ParentComponent
的重新渲染而重新创建。这有助于优化 ChildComponent
的性能,因为它的 onClick
属性不会频繁地改变。
import React, { useState, useCallback } from 'react';
function Counter() {
const [count, setCount] = useState(0);
const increment = useCallback(() => {
setCount(count + 1); // 使用 count 作为依赖
}, [count]);
return (
<div>
<p>Count: {count}p>
<button onClick={increment}>Incrementbutton>
div>
);
}
在这里,我们使用 useCallback
来确保 increment
函数只有在 count
改变时才重新创建。这样可以避免因为 increment
的重新创建而导致不必要的重新渲染。
import { useState, useCallback } from 'react';
function useToggle(initialState) {
const [value, setValue] = useState(initialState);
const toggle = useCallback(() => {
setValue((prevValue) => !prevValue);
}, []);
return [value, toggle];
}
在自定义 Hook 中,我们使用 useCallback
来确保 toggle
函数在不同组件中使用时都具有相同的引用,并且不会因为组件重新渲染而改变。
当你在渲染大型列表或表格时,可以使用 useCallback
来缓存行级别的事件处理函数,以减少不必要的函数创建。这可以显著提高性能,特别是在虚拟化列表等场景中。
useCallback
。只有当性能问题明显时,或者需要确保回调函数的稳定性时才使用它。 useCallback
用于传递给 DOM 事件处理程序时要小心,因为它可能导致事件处理程序不更新。 总之,useCallback
是 React 中用于性能优化的有效工具,可以帮助你避免不必要的函数创建和确保回调函数的稳定性。但要谨慎使用,仅在需要时使用,以免引入不必要的复杂性。
欢迎点赞、关注、转发~
本文由 mdnice 多平台发布