ahooks
Version:
react hooks library
53 lines (52 loc) • 2.16 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _react = require("react");
var _utils = require("../utils");
var _useMemoizedFn = _interopRequireDefault(require("../useMemoizedFn"));
var _useUpdate = _interopRequireDefault(require("../useUpdate"));
function useControllableValue(defaultProps) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var props = defaultProps !== null && defaultProps !== void 0 ? defaultProps : {};
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 = Object.prototype.hasOwnProperty.call(props, valuePropName);
var initialValue = (0, _react.useMemo)(function () {
if (isControlled) {
return value;
}
if (Object.prototype.hasOwnProperty.call(props, defaultValuePropName)) {
return props[defaultValuePropName];
}
return defaultValue;
}, []);
var stateRef = (0, _react.useRef)(initialValue);
if (isControlled) {
stateRef.current = value;
}
var update = (0, _useUpdate["default"])();
function setState(v) {
var r = (0, _utils.isFunction)(v) ? v(stateRef.current) : v;
if (!isControlled) {
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, (0, _useMemoizedFn["default"])(setState)];
}
var _default = exports["default"] = useControllableValue;