UNPKG

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