useCompatibleInsertionEffect.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334
  1. import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
  2. // import canUseDom from 'rc-util/lib/Dom/canUseDom';
  3. import useLayoutEffect from "rc-util/es/hooks/useLayoutEffect";
  4. import * as React from 'react';
  5. // We need fully clone React function here
  6. // to avoid webpack warning React 17 do not export `useId`
  7. var fullClone = _objectSpread({}, React);
  8. var useInsertionEffect = fullClone.useInsertionEffect;
  9. /**
  10. * Polyfill `useInsertionEffect` for React < 18
  11. * @param renderEffect will be executed in `useMemo`, and do not have callback
  12. * @param effect will be executed in `useLayoutEffect`
  13. * @param deps
  14. */
  15. var useInsertionEffectPolyfill = function useInsertionEffectPolyfill(renderEffect, effect, deps) {
  16. React.useMemo(renderEffect, deps);
  17. useLayoutEffect(function () {
  18. return effect(true);
  19. }, deps);
  20. };
  21. /**
  22. * Compatible `useInsertionEffect`
  23. * will use `useInsertionEffect` if React version >= 18,
  24. * otherwise use `useInsertionEffectPolyfill`.
  25. */
  26. var useCompatibleInsertionEffect = useInsertionEffect ? function (renderEffect, effect, deps) {
  27. return useInsertionEffect(function () {
  28. renderEffect();
  29. return effect();
  30. }, deps);
  31. } : useInsertionEffectPolyfill;
  32. export default useCompatibleInsertionEffect;