Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

39 строки
1.2 KiB

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