@Boris007

Как типизировать обработку мультиформы?

Как правильней работать с типизированной реакт формой?
Она так должна выглядеть или можно сделать лучше/правильней?

Есть форма
<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}))
  }
  • Вопрос задан
  • 80 просмотров
Решения вопроса 1
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы