主要用来性能优化
useMemo
缓存每次重新渲染都需要计算的结果
const cachedValue = useMemo(calculateValue, dependencies)
calculateValue:要缓存计算值的函数。它应该是一个没有任何参数的纯函数,并且可以返回任意类型。dependencies:所有在 calculateValue 函数中使用的响应式变量组成的数组。响应式变量包括 props、state 和所有你直接在组件中定义的变量和函数。
const visibleTodos = useMemo(
() => filterTodos(todos, tab),
[todos, tab]
)useMemo 不会让 第一次 渲染变快。它只是跳过不必要的更新
使用场景:
- 缓存昂贵计算
- 缓存对象
useCallback
在多次渲染中缓存函数
const cachedFn = useCallback(fn, dependencies)
fn:想要缓存的函数。dependencies:有关是否更新 fn 的所有响应式值的一个列表。
const handleSubmit = useCallback((orderDetails) => {
post('/product/' + productId + '/buy', {
referrer,
orderDetails,
});
}, [productId, referrer])使用场景:
- 函数作为其他 hook 的依赖项
- 事件处理函数
缺点
- 每个 useMemo/useCallback 都需要额外内存来存储缓存
- 初始渲染性能下降,渲染时需要做额外的工作
- 代码复杂度增加
- 依赖数组容易忘记导致拿到过期的旧数据