use-deep-compare-effect
Version:
It's react's useEffect hook, except using deep comparison on the inputs, not reference equality
48 lines (34 loc) • 1.35 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var React = _interopDefault(require('react'));
var deepEqual = _interopDefault(require('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));
}
exports.useDeepCompareEffectNoCheck = useDeepCompareEffectNoCheck;
exports.default = useDeepCompareEffect;