Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Формы и управляемые поля

В React значение поля ввода обычно хранят в состоянии. Такое поле называют управляемым: что лежит в состоянии, то и показано в поле, а каждое нажатие клавиши обновляет состояние. Так текст всегда под рукой — его можно проверить, очистить или отправить.

Управляемое поле

Создайте src/components/AddTodoForm.jsx:

// src/components/AddTodoForm.jsx
import { useState } from 'react';
 
export default function AddTodoForm() {
  const [text, setText] = useState('');
 
  return (
    <>
      <input value={text} onChange={(event) => setText(event.target.value)} />
      <p>Вы ввели: {text}</p>
    </>
  );
}

Выведите <AddTodoForm /> в App. Текст под полем меняется вместе с вводом: value берётся из состояния, а onChange его обновляет.

Отправка формы

Событие onSubmit вешают на форму, а не на кнопку — тогда сработает и клавиша Enter. Метод preventDefault() отменяет стандартную перезагрузку страницы:

// src/components/AddTodoForm.jsx
import { useState } from 'react';
 
export default function AddTodoForm({ onAdd }) {
  const [text, setText] = useState('');
 
  function handleSubmit(event) {
    event.preventDefault();
    onAdd(text);
    setText('');
  }
 
  return (
    <form onSubmit={handleSubmit}>
      <input value={text} onChange={(event) => setText(event.target.value)} />
      <button type="submit">Добавить</button>
    </form>
  );
}

Форма передаёт текст родителю через onAdd и очищает поле.

Подключение к списку

В src/App.jsx задача создаётся из текста формы:

// src/App.jsx
function handleAdd(text) {
  setTodos([...todos, { id: crypto.randomUUID(), text, done: false }]);
}
 
// в разметке:
<AddTodoForm onAdd={handleAdd} />
<TodoList todos={todos} onToggle={handleToggle} onDelete={handleDelete} />

Введите «Полить цветы» и нажмите Enter — задача появится в конце списка, а поле опустеет.

Проверка ввода

Ошибку вычисляют из состояния, отдельное состояние для неё не нужно:

// src/components/AddTodoForm.jsx
const trimmed = text.trim();
 
// в разметке:
<button type="submit" disabled={trimmed === ''}>Добавить</button>
{text.length > 100 && <p>Не больше 100 символов</p>}

Пока поле пустое или в нём одни пробелы, кнопка неактивна.

Другие типы полей

ПолеАтрибут значенияЧто брать в onChange
input, textareavalueevent.target.value
selectvalueevent.target.value
input type="checkbox"checkedevent.target.checked

У textarea и select в React тоже есть атрибут value — не нужно писать текст внутрь тега или selected у варианта.

Частая ошибка

Поле с value, но без onChange становится доступным только для чтения — в него нельзя ничего ввести, а в консоли появится предупреждение:

// Неправильно: текст в поле не меняется.
<input value={text} />
 
// Правильно:
<input value={text} onChange={(event) => setText(event.target.value)} />

Если поле не нужно контролировать, используйте defaultValue вместо value.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.