UNPKG

2.17 kBJavaScriptView Raw
1import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2import useEvent from "./useEvent";
3import { useLayoutUpdateEffect } from "./useLayoutEffect";
4import useState from "./useState";
5/** We only think `undefined` is empty */
6function hasValue(value) {
7 return value !== undefined;
8}
9
10/**
11 * Similar to `useState` but will use props value if provided.
12 * Note that internal use rc-util `useState` hook.
13 */
14export 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 // ======================= Init =======================
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 // ====================== Change ======================
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 // Sync value back to `undefined` when it from control to un-control
51 useLayoutUpdateEffect(function () {
52 if (!hasValue(value)) {
53 setInnerValue(value);
54 }
55 }, [value]);
56
57 // ====================== Update ======================
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