@td-design/rn-hooks
Version:
从ahooks里面抽取的一些在rn项目里可以使用的hooks。提高开发效率
48 lines (44 loc) • 1.77 kB
JavaScript
;
var _tslib = require('../_virtual/_tslib.js');
var react = require('react');
var index$1 = require('../useMemoizedFn/index.js');
var index = require('../useUpdate/index.js');
var index$2 = require('../utils/index.js');
function useControllableValue(props, options) {
if (props === void 0) { props = {}; }
if (options === void 0) { options = {}; }
var defaultValue = options.defaultValue, _a = options.defaultValuePropName, defaultValuePropName = _a === void 0 ? 'defaultValue' : _a, _b = options.valuePropName, valuePropName = _b === void 0 ? 'value' : _b, _c = options.trigger, trigger = _c === void 0 ? 'onChange' : _c;
var value = props[valuePropName];
var isControlled = props.hasOwnProperty(valuePropName);
var initialValue = react.useMemo(function () {
if (isControlled) {
return value;
}
if (props.hasOwnProperty(defaultValuePropName)) {
return props[defaultValuePropName];
}
return defaultValue;
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
var stateRef = react.useRef(initialValue);
if (isControlled) {
stateRef.current = value;
}
var update = index();
function setState(v) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
var r = index$2.isFunction(v) ? v(stateRef.current) : v;
if (!isControlled) {
stateRef.current = r;
update();
}
if (props[trigger]) {
props[trigger].apply(props, _tslib.__spreadArray([r], _tslib.__read(args), false));
}
}
return [stateRef.current, index$1(setState)];
}
module.exports = useControllableValue;