Как правильней работать с типизированной реакт формой?
Она так должна выглядеть или можно сделать лучше/правильней?
Есть форма
<form onSubmit={handleSubmit}>
<label>Enter your name</label>
<input type="text" name="name" value={data.name || ''} onChange={handleChangeInput} />
<textarea name="text" value={data.text || ''} onChange={handleChangeTextArea} />
<input type="checkbox" name="check" checked={data.check} onChange={handleCheck} />
<label htmlFor="vehicle1">CheckBox</label>
<select name="cars" onChange={handleChangeSelect}>
<option value="volvo">Volvo</option>
<option value="saab">Saab</option>
<option value="mercedes">Mercedes</option>
<option value="audi">Audi</option>
</select>
<input type="submit" />
</form>
Описал интерфейс
interface FormData {
name: string;
text: string;
cars: string;
check: boolean;
}
Создал хук данных
const [data, setData] = useState<FormData>({
name: '',
text: '',
cars: '',
check: false
})
Если с обработкой кнопки все просто, т.к. она одна, то...
async function handleSubmit(event: FormEvent) {
event.preventDefault()
await fetch...
}
Как быть с обработкой разных типов полей?
У меня выходит типизировать обработку только каждого типа по отдельности, хотя у всех, кроме
checkbox
одинаковые свойства
name
и
value
function handleCheck(event: ChangeEvent<HTMLInputElement>) {
const key = event.target.name
const value = event.target.checked
setData(data => ({...data, [key]: value}))
}
function handleChangeInput(event: ChangeEvent<HTMLInputElement>) {
const key = event.target.name
const value = event.target.value
setData(data => ({...data, [key]: value}))
}
function handleChangeTextArea(event: ChangeEvent<HTMLTextAreaElement>) {
const key = event.target.name
const value = event.target.value
setData(data => ({...data, [key]: value}))
}
function handleChangeSelect(event: ChangeEvent<HTMLSelectElement>) {
const key = event.target.name
const value = event.target.value
setData(data => ({...data, [key]: value}))
}