use-deep-compare-effect深比较解读

1,668 阅读1分钟

关于react的useEffect的依赖比较问题,在hook的底层源码是用Object.is来进行浅比较的。 Object.is在进行比较时同一个引用地址的对象会返回true,否则会返回false。

image.png

处理方式:我们知道每一次渲染由于引用地址的变化,Object.is复杂对象每一次比较是不一样的,而useRef在组件的整个生命周期是不变的,我们可以利用它的这个特性。可以用lodash的isEqual来做深比较,如果没有变化,返回原始的useRef的值,由于引用地址没有变化,所以,也不会再执行callback里面的逻辑

import React, { useEffect, useRef } from 'react';

export function useDeepCompareMemoize(value) {
  const ref = useRef(value)
  if (!_.isEqual(value, ref.current)) {
    ref.current = value
  }
  return ref.current
}

const useDeepCompareEffect = (callback, dependencies)=> {
  return useEffect(callback, useDeepCompareMemoize(dependencies))
}

export default useDeepCompareEffect

由于react出于性能考虑用了Object.is来做浅比较,所以,我们尽量少用这种深比较的方式,对性能不太友好