UNPKG

ahooks

Version:
53 lines (52 loc) 2.16 kB
"use strict"; 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;