主要用于: Input Select Radio Switch 等

    1. import { useState, useCallback } from 'react';
    2. /** 默认为 value */
    3. type EventValueType<T = any> = 'value' | 'checked' | ((evt: T) => void) | boolean;
    4. function getValueByType(evt: any, type?: EventValueType) {
    5. /** 适用于: Input Checkbox */
    6. if (type === 'value' || type === 'checked') {
    7. return evt.target[type];
    8. }
    9. /** Switch */
    10. if (typeof type === 'boolean') {
    11. return type ? evt.target.value : evt;
    12. }
    13. if (typeof type === 'function') {
    14. return type(evt);
    15. }
    16. /** Tabs Select */
    17. return evt;
    18. }
    19. const useChange = <T, E = any>(defaultValue?: T, type?: EventValueType<E>) => {
    20. const [value, setValue] = useState(defaultValue);
    21. const onChange = useCallback(
    22. (evt) => {
    23. const val = getValueByType(evt, type);
    24. setValue(val);
    25. },
    26. [value],
    27. );
    28. const reset = useCallback(() => {
    29. setValue(defaultValue);
    30. }, [defaultValue]);
    31. return [value as T, onChange, { reset, setValue }] as const;
    32. };
    33. export default useChange;