如果父元件所傳遞的 props 包含 Object,
則在元件因狀態改變而 re-render 時,
Object 的記憶體位址也會隨之重新分配。
useCallback 則能夠在特定條件下
保留原本的 Object,
防止其記憶體位址參考
因 re-render 而被改變。
因此搭配 React.memo 使用時,
能夠避免因傳入元件的 callback
記憶體位址不同而強迫重新渲染的問題。
const memorizedValue = useCallback(callback, array)
const memoizedCallback = useCallback(
() => {
doSomething(a, b);
},
[a, b],
);
useCallback 會幫我們記住
callback 函式的記憶體位置,
在 React 元件重新渲染時,
若 dependencies array 中的值沒有被修改,
就沿用上次的 reference。
const List = ({getItems}) => {
const [item, setItems] = useState([])
useEffect(() => {
setItems(getItems())
}, [getItems])
return item.map(item => <span key={item}>{item} , </span>)
}
const App = () => {
const [number, setNumber] = useState(0);
// very slow function
const getItems = useCallback(() => {
return [number, number + 1, number + 2]
}, [number])
const changeHandler = e => {
setNumber(e.target.value)
}
return (
<>
<input type='number' value={number} onChange={changeHandler} />
<List getItems={getItems} ></List>
</>
)
};
useCallback(fn, depsArr)
等同於useMemo(() => fn, depsArr)