useDelayState.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = useDelayState;
  7. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  8. var _rcUtil = require("rc-util");
  9. var _raf = _interopRequireDefault(require("rc-util/lib/raf"));
  10. var _react = _interopRequireDefault(require("react"));
  11. /**
  12. * Will be `true` immediately for next effect.
  13. * But will be `false` for a delay of effect.
  14. */
  15. function useDelayState(value, defaultValue, onChange) {
  16. var _useMergedState = (0, _rcUtil.useMergedState)(defaultValue, {
  17. value: value
  18. }),
  19. _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
  20. state = _useMergedState2[0],
  21. setState = _useMergedState2[1];
  22. var nextValueRef = _react.default.useRef(value);
  23. // ============================= Update =============================
  24. var rafRef = _react.default.useRef();
  25. var cancelRaf = function cancelRaf() {
  26. _raf.default.cancel(rafRef.current);
  27. };
  28. var doUpdate = (0, _rcUtil.useEvent)(function () {
  29. setState(nextValueRef.current);
  30. if (onChange && state !== nextValueRef.current) {
  31. onChange(nextValueRef.current);
  32. }
  33. });
  34. var updateValue = (0, _rcUtil.useEvent)(function (next, immediately) {
  35. cancelRaf();
  36. nextValueRef.current = next;
  37. if (next || immediately) {
  38. doUpdate();
  39. } else {
  40. rafRef.current = (0, _raf.default)(doUpdate);
  41. }
  42. });
  43. _react.default.useEffect(function () {
  44. return cancelRaf;
  45. }, []);
  46. return [state, updateValue];
  47. }