useLockEffect.js 802 B

12345678910111213141516171819202122232425
  1. import { useLayoutUpdateEffect } from "rc-util/es/hooks/useLayoutEffect";
  2. import raf from "rc-util/es/raf";
  3. import * as React from 'react';
  4. /**
  5. * Trigger `callback` immediately when `condition` is `true`.
  6. * But trigger `callback` in next frame when `condition` is `false`.
  7. */
  8. export default function useLockEffect(condition, callback) {
  9. var delayFrames = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
  10. var callbackRef = React.useRef(callback);
  11. callbackRef.current = callback;
  12. useLayoutUpdateEffect(function () {
  13. if (condition) {
  14. callbackRef.current(condition);
  15. } else {
  16. var id = raf(function () {
  17. callbackRef.current(condition);
  18. }, delayFrames);
  19. return function () {
  20. raf.cancel(id);
  21. };
  22. }
  23. }, [condition]);
  24. }