use-deep-compare-effect
Version:
It's react's useEffect hook, except using deep comparison on the inputs, not reference equality
42 lines (31 loc) • 1.08 kB
JavaScript
import React from 'react';
import deepEqual from 'dequal';
function checkDeps(deps) {
if (!deps || !deps.length) {
throw new Error('useDeepCompareEffect should not be used with no dependencies. Use React.useEffect instead.');
}
if (deps.every(isPrimitive)) {
throw new Error('useDeepCompareEffect should not be used with dependencies that are all primitive values. Use React.useEffect instead.');
}
}
function isPrimitive(val) {
return val == null || /^[sbn]/.test(typeof val);
}
function useDeepCompareMemoize(value) {
var ref = React.useRef();
if (!deepEqual(value, ref.current)) {
ref.current = value;
}
return ref.current;
}
function useDeepCompareEffect(callback, dependencies) {
if (process.env.NODE_ENV !== 'production') {
checkDeps(dependencies);
}
React.useEffect(callback, useDeepCompareMemoize(dependencies));
}
function useDeepCompareEffectNoCheck(callback, dependencies) {
React.useEffect(callback, useDeepCompareMemoize(dependencies));
}
export default useDeepCompareEffect;
export { useDeepCompareEffectNoCheck };