useFrameState.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = useFrameState;
  8. var React = _interopRequireWildcard(require("react"));
  9. var _raf = _interopRequireDefault(require("rc-util/lib/raf"));
  10. function useFrameState(defaultValue) {
  11. const [value, setValue] = React.useState(defaultValue);
  12. const frameRef = React.useRef(null);
  13. const batchRef = React.useRef([]);
  14. const destroyRef = React.useRef(false);
  15. React.useEffect(() => {
  16. destroyRef.current = false;
  17. return () => {
  18. destroyRef.current = true;
  19. _raf.default.cancel(frameRef.current);
  20. frameRef.current = null;
  21. };
  22. }, []);
  23. function setFrameValue(updater) {
  24. if (destroyRef.current) {
  25. return;
  26. }
  27. if (frameRef.current === null) {
  28. batchRef.current = [];
  29. frameRef.current = (0, _raf.default)(() => {
  30. frameRef.current = null;
  31. setValue(prevValue => {
  32. let current = prevValue;
  33. batchRef.current.forEach(func => {
  34. current = func(current);
  35. });
  36. return current;
  37. });
  38. });
  39. }
  40. batchRef.current.push(updater);
  41. }
  42. return [value, setFrameValue];
  43. }