import { useState, useEffect, FC } from 'react'
interface UseControlledProps<Value, ChangeHandler> {
defaultValue: Value
onChange: ChangeHandler // (...args: any) => any
// вот как мне задать это значение?
}
function useControlled<Value, ChangeHandler>({
defaultValue,
onChange
}: UseControlledProps<Value, ChangeHandler>) {
//
const [state, setState] = useState(defaultValue)
useEffect(() => {
if (defaultValue !== state) {
setState(defaultValue)
}
}, [defaultValue])
type Params = Parameters<ChangeHandler> // Type 'ChangeHandler' does not satisfy the constraint '(...args: any) => any'
return [
state,
//
(value: Value, ...params: Params) => {
setState(value)
onChange(...params)
},
] as const
}
interface CustomInputProps {
defaultValue: string
}
// пример использования
const CustomInput: FC<CustomInputProps> = ({ defaultValue }) => {
const onChange = (str: string, ggg?: boolean) => {
console.log(str) // бульбульбуль
}
const [value, setValue] = useControlled({ defaultValue, onChange })
const handleInput = (event) => {
setValue(event.target.value, 'бульбульбуль') //
}
return <input value={value} onChange={handleInput} />
}