@geezee/react-ui
Version:
Modern and minimalist React UI library.
33 lines (25 loc) • 1.12 kB
JavaScript
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import { useState, useCallback } from 'react'; // https://github.com/react-component/util/blob/4045d568885d65a5491ab22347682f5e31da31dc/src/hooks/useMergedState.ts
export default function useControlledState(defaultValue, option) {
var _ref = option || {},
value = _ref.value,
onChange = _ref.onChange,
postState = _ref.postState;
var _useState = useState(value !== undefined ? value : defaultValue),
_useState2 = _slicedToArray(_useState, 2),
innerValue = _useState2[0],
setInnerValue = _useState2[1]; // controlled take priority of uncontrolled
var calcualteValue = value !== undefined ? value : innerValue;
if (postState) {
calcualteValue = postState(calcualteValue);
} // do not change the identity of setValue
var setValue = useCallback(function (newValue) {
if (!value) {
setInnerValue(newValue);
}
if (calcualteValue !== newValue && onChange) {
onChange(newValue, calcualteValue);
}
}, [onChange, calcualteValue]);
return [calcualteValue, setValue];
}