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.4KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. 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); }
  2. import { useCallback, useState } from 'react';
  3. /**
  4. * Mimics a React class component's state model, of having a single unified
  5. * `state` object and an updater that merges updates into the existing state, as
  6. * opposed to replacing it.
  7. *
  8. * ```js
  9. * const [state, setState] = useMergeState({ name: 'Betsy', age: 24 })
  10. *
  11. * setState({ name: 'Johan' }) // { name: 'Johan', age: 24 }
  12. *
  13. * setState(state => ({ age: state.age + 10 })) // { name: 'Johan', age: 34 }
  14. * ```
  15. *
  16. * @param initialState The initial state object
  17. */
  18. export default function useMergeState(initialState) {
  19. var _useState = useState(initialState),
  20. state = _useState[0],
  21. setState = _useState[1];
  22. var updater = useCallback(function (update) {
  23. if (update === null) return;
  24. if (typeof update === 'function') {
  25. setState(function (state) {
  26. var nextState = update(state);
  27. return nextState == null ? state : _extends({}, state, {}, nextState);
  28. });
  29. } else {
  30. setState(function (state) {
  31. return _extends({}, state, {}, update);
  32. });
  33. }
  34. }, [setState]);
  35. return [state, updater];
  36. }