useUpdate.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = useUpdate;
  7. exports.useUpdateState = useUpdateState;
  8. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  9. var _useLayoutEffect = require("rc-util/lib/hooks/useLayoutEffect");
  10. var _react = require("react");
  11. /**
  12. * Help to merge callback with `useLayoutEffect`.
  13. * One time will only trigger once.
  14. */
  15. function useUpdate(callback) {
  16. var _useState = (0, _react.useState)(0),
  17. _useState2 = (0, _slicedToArray2.default)(_useState, 2),
  18. count = _useState2[0],
  19. setCount = _useState2[1];
  20. var effectRef = (0, _react.useRef)(0);
  21. var callbackRef = (0, _react.useRef)();
  22. callbackRef.current = callback;
  23. // Trigger on `useLayoutEffect`
  24. (0, _useLayoutEffect.useLayoutUpdateEffect)(function () {
  25. var _callbackRef$current;
  26. (_callbackRef$current = callbackRef.current) === null || _callbackRef$current === void 0 || _callbackRef$current.call(callbackRef);
  27. }, [count]);
  28. // Trigger to update count
  29. return function () {
  30. if (effectRef.current !== count) {
  31. return;
  32. }
  33. effectRef.current += 1;
  34. setCount(effectRef.current);
  35. };
  36. }
  37. function useUpdateState(defaultState) {
  38. var batchRef = (0, _react.useRef)([]);
  39. var _useState3 = (0, _react.useState)({}),
  40. _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
  41. forceUpdate = _useState4[1];
  42. var state = (0, _react.useRef)(typeof defaultState === 'function' ? defaultState() : defaultState);
  43. var flushUpdate = useUpdate(function () {
  44. var current = state.current;
  45. batchRef.current.forEach(function (callback) {
  46. current = callback(current);
  47. });
  48. batchRef.current = [];
  49. state.current = current;
  50. forceUpdate({});
  51. });
  52. function updater(callback) {
  53. batchRef.current.push(callback);
  54. flushUpdate();
  55. }
  56. return [state.current, updater];
  57. }