useCallback(fn, deps)
:缓存函数,避免每次渲染都新建函数。useMemo(fn, deps)
:缓存值(计算结果),避免重复执行计算。React.memo(Component)
:缓存组件的渲染结果,避免 props 没变却重复渲染。三者搭配使用,在中大型组件中可显著优化性能,减少重复渲染。
useCallback
—— 缓存函数引用useEffect
/ useMemo
。const handleClick = useCallback(() => {
console.log("Clicked");
}, []);
useMemo(() => fn, deps)
。useMemo
—— 缓存计算结果const result = useMemo(() => heavyComputation(data), [data]);
React.memo
—— 缓存组件渲染结果const MyComponent = React.memo((props) => {
return {props.text};
});
useCallback
/useMemo
使用更有效。React.memo(Component, (prevProps, nextProps) => {
return prevProps.id === nextProps.id;
});
import React, { useState, useMemo, useCallback } from 'react';
const List = React.memo(({ items, onClickItem }) => {
console.log("List rendered");
return (
{items.map(item => (
- onClickItem(item)}>
{item.name}
))}
);
});
const App = () => {
const [count, setCount] = useState(0);
const items = useMemo(() => [
{ id: 1, name: "Apple" },
{ id: 2, name: "Banana" },
], []);
const handleClick = useCallback((item) => {
console.log("Clicked:", item.name);
}, []);
return (
);
};
List
被 React.memo
包裹,只有 items
或 onClickItem
改变才会重新渲染。items
用 useMemo
缓存,防止数组地址变化。handleClick
用 useCallback
缓存函数,防止函数引用变化。React.memo
;