linkmore-design
Version:
π πlmη»δ»ΆεΊγπ
46 lines β’ 1.91 kB
JavaScript
import { useMemo, useRef } from 'react';
import { isFunction } from 'ahooks/lib/utils';
import { useMemoizedFn, useUpdate } from 'ahooks';
function useControllableValue() {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var defaultValue = options.defaultValue,
_options$defaultValue = options.defaultValuePropName,
defaultValuePropName = _options$defaultValue === void 0 ? 'defaultValue' : _options$defaultValue,
_options$valuePropNam = options.valuePropName,
valuePropName = _options$valuePropNam === void 0 ? 'value' : _options$valuePropNam,
_options$trigger = options.trigger,
trigger = _options$trigger === void 0 ? 'onChange' : _options$trigger;
var value = props[valuePropName];
var isControlled = props === null || props === void 0 ? void 0 : props.hasOwnProperty(valuePropName);
var isControlledOnChange = props[trigger];
var initialValue = useMemo(function () {
if (isControlled) {
return value;
}
if (props !== null && props !== void 0 && props.hasOwnProperty(defaultValuePropName)) {
return props[defaultValuePropName];
}
return defaultValue;
}, []);
var stateRef = useRef(initialValue);
if (isControlled && isControlledOnChange) {
stateRef.current = value;
}
var update = useUpdate();
function setState(v) {
var r = isFunction(v) ? v(stateRef.current) : v;
if (!isControlledOnChange) {
stateRef.current = r;
update();
}
if (props[trigger]) {
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
props[trigger].apply(props, [r].concat(args));
}
}
return [stateRef.current, useMemoizedFn(setState)];
}
export default useControllableValue;