1 | import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
2 | import useEvent from "./useEvent";
|
3 | import { useLayoutUpdateEffect } from "./useLayoutEffect";
|
4 | import useState from "./useState";
|
5 |
|
6 | function hasValue(value) {
|
7 | return value !== undefined;
|
8 | }
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 | export default function useMergedState(defaultStateValue, option) {
|
15 | var _ref = option || {},
|
16 | defaultValue = _ref.defaultValue,
|
17 | value = _ref.value,
|
18 | onChange = _ref.onChange,
|
19 | postState = _ref.postState;
|
20 |
|
21 |
|
22 | var _useState = useState(function () {
|
23 | if (hasValue(value)) {
|
24 | return value;
|
25 | } else if (hasValue(defaultValue)) {
|
26 | return typeof defaultValue === 'function' ? defaultValue() : defaultValue;
|
27 | } else {
|
28 | return typeof defaultStateValue === 'function' ? defaultStateValue() : defaultStateValue;
|
29 | }
|
30 | }),
|
31 | _useState2 = _slicedToArray(_useState, 2),
|
32 | innerValue = _useState2[0],
|
33 | setInnerValue = _useState2[1];
|
34 | var mergedValue = value !== undefined ? value : innerValue;
|
35 | var postMergedValue = postState ? postState(mergedValue) : mergedValue;
|
36 |
|
37 |
|
38 | var onChangeFn = useEvent(onChange);
|
39 | var _useState3 = useState([mergedValue]),
|
40 | _useState4 = _slicedToArray(_useState3, 2),
|
41 | prevValue = _useState4[0],
|
42 | setPrevValue = _useState4[1];
|
43 | useLayoutUpdateEffect(function () {
|
44 | var prev = prevValue[0];
|
45 | if (innerValue !== prev) {
|
46 | onChangeFn(innerValue, prev);
|
47 | }
|
48 | }, [prevValue]);
|
49 |
|
50 |
|
51 | useLayoutUpdateEffect(function () {
|
52 | if (!hasValue(value)) {
|
53 | setInnerValue(value);
|
54 | }
|
55 | }, [value]);
|
56 |
|
57 |
|
58 | var triggerChange = useEvent(function (updater, ignoreDestroy) {
|
59 | setInnerValue(updater, ignoreDestroy);
|
60 | setPrevValue([mergedValue], ignoreDestroy);
|
61 | });
|
62 | return [postMergedValue, triggerChange];
|
63 | } |
\ | No newline at end of file |