ahooks
Version:
react hooks library
37 lines (36 loc) • 1.36 kB
JavaScript
import { useMemo, useRef } from 'react';
import { isFunction } from '../utils';
import useMemoizedFn from '../useMemoizedFn';
import useUpdate from '../useUpdate';
function useControllableValue(defaultProps, options = {}) {
const props = defaultProps !== null && defaultProps !== void 0 ? defaultProps : {};
const { defaultValue, defaultValuePropName = 'defaultValue', valuePropName = 'value', trigger = 'onChange', } = options;
const value = props[valuePropName];
const isControlled = Object.prototype.hasOwnProperty.call(props, valuePropName);
const initialValue = useMemo(() => {
if (isControlled) {
return value;
}
if (Object.prototype.hasOwnProperty.call(props, defaultValuePropName)) {
return props[defaultValuePropName];
}
return defaultValue;
}, []);
const stateRef = useRef(initialValue);
if (isControlled) {
stateRef.current = value;
}
const update = useUpdate();
function setState(v, ...args) {
const r = isFunction(v) ? v(stateRef.current) : v;
if (!isControlled) {
stateRef.current = r;
update();
}
if (props[trigger]) {
props[trigger](r, ...args);
}
}
return [stateRef.current, useMemoizedFn(setState)];
}
export default useControllableValue;