React Hooks 之 useMemo、useCallback与memo

101 阅读1分钟

基本用法

  1. useMemo
const memorizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

useMemo() 返回的是一个 memoized 值,只有当依赖项(比如上面的 a,b 发生变化的时候,才会重新计算这个 memoized 值)

  1. useCallback
const memorizedfn = useCallback(()=>{return fn}, [a])

useCallback 跟 useMemo 比较类似,但它返回的是缓存的函数。

  1. memo
function MyComponent(props) { 
    /* render using props */ 
} 
function isEqual(prevProps, nextProps) { 
    /*
    return true,相等,不进行render
    return false,不相等,进行render
    */ 
} 
export default React.memo(MyComponent, isEqual);

React.memo() 包装组件。

第二个参数不传递,默认进行props属性的浅比较

第二个参数传递isEqual方法,来判断两次 props 有什么不同,返回true不render,false进行render。

总结

  • 在子组件不需要父组件的值和函数的情况下,只需要使用 memo 函数包裹子组件即可。保证不进行多余render。

  • 如果有函数传递给子组件,使用 useCallback

  • 如果有值传递给子组件,使用 useMemo

  • useEffectuseMemouseCallback 都是自带闭包的。也就是说,每一次组件的渲染,其都会捕获当前组件函数上下文中的状态(state, props),所以每一次这三种hooks的执行,反映的也都是当前的状态,你无法使用它们来捕获上一次的状态。如果需要捕获上一次状态,我们应该使用 ref 来访问。