12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- "use strict";
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = useMergedState;
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
- var _useEvent = _interopRequireDefault(require("./useEvent"));
- var _useLayoutEffect = require("./useLayoutEffect");
- var _useState5 = _interopRequireDefault(require("./useState"));
- /** We only think `undefined` is empty */
- function hasValue(value) {
- return value !== undefined;
- }
- /**
- * Similar to `useState` but will use props value if provided.
- * Note that internal use rc-util `useState` hook.
- */
- function useMergedState(defaultStateValue, option) {
- var _ref = option || {},
- defaultValue = _ref.defaultValue,
- value = _ref.value,
- onChange = _ref.onChange,
- postState = _ref.postState;
- // ======================= Init =======================
- var _useState = (0, _useState5.default)(function () {
- if (hasValue(value)) {
- return value;
- } else if (hasValue(defaultValue)) {
- return typeof defaultValue === 'function' ? defaultValue() : defaultValue;
- } else {
- return typeof defaultStateValue === 'function' ? defaultStateValue() : defaultStateValue;
- }
- }),
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
- innerValue = _useState2[0],
- setInnerValue = _useState2[1];
- var mergedValue = value !== undefined ? value : innerValue;
- var postMergedValue = postState ? postState(mergedValue) : mergedValue;
- // ====================== Change ======================
- var onChangeFn = (0, _useEvent.default)(onChange);
- var _useState3 = (0, _useState5.default)([mergedValue]),
- _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
- prevValue = _useState4[0],
- setPrevValue = _useState4[1];
- (0, _useLayoutEffect.useLayoutUpdateEffect)(function () {
- var prev = prevValue[0];
- if (innerValue !== prev) {
- onChangeFn(innerValue, prev);
- }
- }, [prevValue]);
- // Sync value back to `undefined` when it from control to un-control
- (0, _useLayoutEffect.useLayoutUpdateEffect)(function () {
- if (!hasValue(value)) {
- setInnerValue(value);
- }
- }, [value]);
- // ====================== Update ======================
- var triggerChange = (0, _useEvent.default)(function (updater, ignoreDestroy) {
- setInnerValue(updater, ignoreDestroy);
- setPrevValue([mergedValue], ignoreDestroy);
- });
- return [postMergedValue, triggerChange];
- }
|