Управление несколькими полями ввода в формах
Когда у вас в форме несколько контролируемых полей ввода, их состоянием можно управлять двумя основными способами:
- Отдельным вызовом useState для каждого поля ввода.
- Одним вызовом useState с объектом, содержащим значения всех полей формы.
Чаще всего используется второй подход, так как он удобнее и компактнее.
Правила:
- Каждое поле ввода должно иметь уникальное значение атрибута
name. - При инициализации состояния используйте объект вместо строки. Если поля ввода не имеют начальных значений, можно использовать пустой объект.
Пример
Используем хук useState, чтобы управлять полями ввода:
import { useState } from 'react';
import { createRoot } from 'react-dom/client';
function MyForm() {
const [inputs, setInputs] = useState({}); // состояние для всех полей
const handleChange = (e) => {
const name = e.target.name; // получаем имя поля
const value = e.target.value; // получаем значение поля
setInputs(values => ({
...values, // сохраняем предыдущие значения
[name]: value // добавляем новое значение по имени поля
}));
};
return (
<form>
<label>Ваше имя:
<input
type="text"
name="firstname"
value={inputs.firstname}
onChange={handleChange}
/>
</label>
<label>Фамилия:
<input
type="text"
name="lastname"
value={inputs.lastname}
onChange={handleChange}
/>
</label>
<p>Текущие значения: {inputs.firstname} {inputs.lastname}</p>
</form>
);
}
createRoot(document.getElementById('root')).render(
<MyForm />
);
Объяснение примера:
Первое, что бросается в глаза, — при использовании единого вызова useState мы храним начальные значения в объекте. Поскольку у нас пока нет начальных значений, мы используем пустой объект:
const [inputs, setInputs] = useState({});
Далее функция handleChange обновлена для обработки нескольких полей ввода. Внутри неё мы обращаемся к каждому полю ввода через атрибуты e.target.name и e.target.value.
Для обновления состояния используются квадратные скобки [ ], чтобы динамически добавлять свойства объекта:
setInputs(values => ({
...values, // сохранение предыдущих значений
[name]: value // добавление нового значения
}));
При обращении к значениям полей ввода мы ссылаемся на объект состояний inputs, указывая имена полей:
<input
type="text"
name="firstname"
value={inputs.firstname}
onChange={handleChange}
/>
Начальные значения
Чтобы задать начальные значения для полей ввода, заполните объект в вызове useState соответствующими ключами и значениями:
Пример
Задаем начальные значения для имени и фамилии:
function MyForm() {
const [inputs, setInputs] = useState({
firstname: 'Иван',
lastname: 'Петров'
});
...