UNPKG

1.21 kBJavaScriptView Raw
1import { useRef, useEffect, useDebugValue } from 'react';
2import useMounted from './useMounted';
3
4function useCustomEffect(effect, dependencies, isEqualOrOptions) {
5 var isMounted = useMounted();
6
7 var _ref = typeof isEqualOrOptions === 'function' ? {
8 isEqual: isEqualOrOptions
9 } : isEqualOrOptions,
10 isEqual = _ref.isEqual,
11 _ref$effectHook = _ref.effectHook,
12 effectHook = _ref$effectHook === void 0 ? useEffect : _ref$effectHook;
13
14 var dependenciesRef = useRef();
15 dependenciesRef.current = dependencies;
16 var cleanupRef = useRef(null);
17 effectHook(function () {
18 // If the ref the is `null` it's either the first effect or the last effect
19 // ran and was cleared, meaning _this_ update should run, b/c the equality
20 // check failed on in the cleanup of the last effect.
21 if (cleanupRef.current === null) {
22 var cleanup = effect();
23
24 cleanupRef.current = function () {
25 if (isMounted() && isEqual(dependenciesRef.current, dependencies)) {
26 return;
27 }
28
29 cleanupRef.current = null;
30 if (cleanup) cleanup();
31 };
32 }
33
34 return cleanupRef.current;
35 });
36 useDebugValue(effect);
37}
38
39export default useCustomEffect;
\No newline at end of file