in packages/bui-utils/src/hooks/useValue.ts [13:48]
export default function useValue<T>(options: Options<T>) {
const { value, defaultValue, onChange, config = {} } = options;
const { state, name } = config;
const [internalValue, setInternalValue] = useState(defaultValue);
const initialDefaultValue = useRef(defaultValue);
const isControlled = value !== undefined;
// 异常情况
useEffect(() => {
if (
!isControlled &&
JSON.stringify(defaultValue) !==
JSON.stringify(initialDefaultValue.current) &&
state &&
name
) {
console.error(
[
`BUI: A component is changing the default ${state} state of an uncontrolled ${name} after being initialized. ` +
`To suppress this warning opt to use a controlled ${name}.`,
].join('\n'),
);
}
}, [defaultValue]);
const triggerChange = useCallback(
(e, val) => {
setInternalValue(val);
onChange?.(e, { value: val });
},
[onChange],
);
return [isControlled ? value : internalValue, triggerChange] as const;
}