useLockEffect.js 1.2 KB

1234567891011121314151617181920212223242526272829303132
  1. "use strict";
  2. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  3. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = useLockEffect;
  8. var _useLayoutEffect = require("rc-util/lib/hooks/useLayoutEffect");
  9. var _raf = _interopRequireDefault(require("rc-util/lib/raf"));
  10. var React = _interopRequireWildcard(require("react"));
  11. /**
  12. * Trigger `callback` immediately when `condition` is `true`.
  13. * But trigger `callback` in next frame when `condition` is `false`.
  14. */
  15. function useLockEffect(condition, callback) {
  16. var delayFrames = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
  17. var callbackRef = React.useRef(callback);
  18. callbackRef.current = callback;
  19. (0, _useLayoutEffect.useLayoutUpdateEffect)(function () {
  20. if (condition) {
  21. callbackRef.current(condition);
  22. } else {
  23. var id = (0, _raf.default)(function () {
  24. callbackRef.current(condition);
  25. }, delayFrames);
  26. return function () {
  27. _raf.default.cancel(id);
  28. };
  29. }
  30. }, [condition]);
  31. }