关于react的useEffect的依赖比较问题,在hook的底层源码是用Object.is来进行浅比较的。
Object.is在进行比较时同一个引用地址的对象会返回true,否则会返回false。
处理方式:我们知道每一次渲染由于引用地址的变化,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来做浅比较,所以,我们尽量少用这种深比较的方式,对性能不太友好