mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-29 22:06:38 +08:00
40eee778ac
Result: {"status":"keep","total_issues":8,"golint_canonicalheader":0,"golint_errname":0,"golint_errorlint":1,"golint_exhaustive":0,"golint_forcetypeassert":0,"golint_gosec":0,"golint_intrange":0,"golint_modernize":3,"golint_nilnil":3,"golint_perfsprint":0,"golint_prealloc":0,"golint_recvcheck":1,"golint_usestdlibvars":0,"golint_wastedassign":0,"golint_total":8,"golint_test_testifylint":0,"golint_test_thelper":0,"golint_test_usetesting":0,"golint_test_total":0,"golint_vetx_total":0,"eslint_problems":0,"eslint_errors":0,"eslint_warnings":0,"tsc_errors":0,"vitest_failed":0,"vitest_total":121,"measure_s":0}
42 lines
1005 B
TypeScript
42 lines
1005 B
TypeScript
import * as React from 'react';
|
|
|
|
interface CommonControlledStateProps<T> {
|
|
value?: T;
|
|
defaultValue?: T;
|
|
}
|
|
|
|
/**
|
|
* 受控状态 Hook
|
|
* 用于处理受控和非受控组件的状态管理
|
|
*
|
|
* @example
|
|
* ```tsx
|
|
* const [value, setValue] = useControlledState({ value: propValue, onChange: console.log })
|
|
* ```
|
|
*/
|
|
export function useControlledState<T, Rest extends unknown[] = []>(
|
|
props: CommonControlledStateProps<T> & {
|
|
onChange?: (value: T, ...args: Rest) => void;
|
|
},
|
|
): readonly [T, (next: T, ...args: Rest) => void] {
|
|
const { value, defaultValue, onChange } = props;
|
|
|
|
const [state, setInternalState] = React.useState<T>(
|
|
value !== undefined ? value : (defaultValue as T),
|
|
);
|
|
|
|
React.useEffect(() => {
|
|
if (value !== undefined) setInternalState(value);
|
|
}, [value]);
|
|
|
|
const setState = React.useCallback(
|
|
(next: T, ...args: Rest) => {
|
|
setInternalState(next);
|
|
onChange?.(next, ...args);
|
|
},
|
|
[onChange],
|
|
);
|
|
|
|
return [state, setState] as const;
|
|
}
|