Dashboard sipadu mbip
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

useMergeState.js 1.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. "use strict";
  2. exports.__esModule = true;
  3. exports.default = useMergeState;
  4. var _react = require("react");
  5. function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
  6. /**
  7. * Mimics a React class component's state model, of having a single unified
  8. * `state` object and an updater that merges updates into the existing state, as
  9. * opposed to replacing it.
  10. *
  11. * ```js
  12. * const [state, setState] = useMergeState({ name: 'Betsy', age: 24 })
  13. *
  14. * setState({ name: 'Johan' }) // { name: 'Johan', age: 24 }
  15. *
  16. * setState(state => ({ age: state.age + 10 })) // { name: 'Johan', age: 34 }
  17. * ```
  18. *
  19. * @param initialState The initial state object
  20. */
  21. function useMergeState(initialState) {
  22. var _useState = (0, _react.useState)(initialState),
  23. state = _useState[0],
  24. setState = _useState[1];
  25. var updater = (0, _react.useCallback)(function (update) {
  26. if (update === null) return;
  27. if (typeof update === 'function') {
  28. setState(function (state) {
  29. var nextState = update(state);
  30. return nextState == null ? state : _extends({}, state, {}, nextState);
  31. });
  32. } else {
  33. setState(function (state) {
  34. return _extends({}, state, {}, update);
  35. });
  36. }
  37. }, [setState]);
  38. return [state, updater];
  39. }