Информация о файлах cookie на этой странице

Наш сайт использует файлы cookie, чтобы обеспечивать его работу, а также собирать и анализировать данные о работе и использовании сайта. Политика конфиденциальности

  • Курсы
    • Discord
    • Twitter
    • Linkedin
    • Facebook
    • Instagram
  • Тарифы
  • English
  • Čeština
  • Deutsch
  • Русский
ВойтиНачать бесплатно
  • Курсы
  • Тарифы

Сообщество

Войти
  
  • Курсы
    • Discord
    • Twitter
    • Linkedin
    • Facebook
    • Instagram
  • Тарифы
  • English
  • Čeština
  • Deutsch
  • Русский
ВойтиНачать бесплатно
  • Курсы
  • Тарифы

Сообщество

Войти

Форма бронирования

В выборе мест теперь есть форма, под итогом: поля «Имя» и «Email» и кнопка «Забронировать», переписанные на JSX (где for стал htmlFor, а novalidate — noValidate). Оживите её, как в уроке «Формы»: поля управляемые, с состояниями name и email, а форма вызывает handleSubmit, которая начинается с event.preventDefault().

Проверка. Затем handleSubmit проверяет форму, шаг за шагом, как в упражнении «Сообщения об ошибках»: пустое имя, email без @, не выбрано ни одного места. Первая найденная проблема попадает в состояние error, которое показывает форма, а return завершает обработчик, так что ничего не бронируется. Посетитель исправляет ошибку и снова нажимает «Забронировать». Старая страница показывала все три сообщения сразу. Здесь сообщение одно, под кнопкой, и код короче.

Бронирование. Когда всё верно, выбор мест создаёт билет: объект с id из Date.now(), сеансом, местами, именем и email. Но куда он попадёт? Билеты нужны выбору мест, чтобы показывать забронированные места занятыми, и списку «Ваши билеты» в Showtimes. Поэтому это состояние Showtimes, tickets, а выбор мест получает билеты в пропсах вместе с функцией, которая добавляет билет, как форма для ваших слов в итоговом проекте курса React:

onBook({
    id: Date.now(),
    showtime: showtime,
    seats: selected,
    name: name.trim(),
    email: email.trim(),
});

Билет хранит сеанс целиком, чтобы список мог показать его день, время и фильм. Затем выбор мест очищает selected и оба поля. С этого момента забронированные места заняты: isTaken() тоже проверяет через some(), есть ли это место в одном из билетов на этот сеанс, как делал старый скрипт:

return tickets.some(
    (ticket) =>
        ticket.showtime.id === showtime.id && ticket.seats.includes(seat),
);

Наконец, выбор мест сообщает, какие места забронированы, — Забронировано! Ваши места: A3, A4, — ещё одним состоянием, confirmation. Его текст можно составить из selected даже после setSelected([]): как вы знаете из урока «Состояние», новое значение появляется только при следующей отрисовке.

Задание

  1. 1

    В SeatPicker добавьте состояния name, email и error, сначала все "", и сделайте оба поля управляемыми. Дайте форме onSubmit={handleSubmit}. handleSubmit(event) вызывает event.preventDefault(), а затем записывает сообщение в error и завершается, когда имя пустое (name.trim() === ""): Введите имя., когда в email нет @: Введите корректный адрес электронной почты., и когда не выбрано ни одного места: Выберите хотя бы одно место. Если ошибка есть, показывайте её под кнопкой в <p className="mt-4 text-sm text-red-700">. Нажмите «Забронировать» при пустых полях.

  2. 2

    В Showtimes добавьте состояние tickets, пустой массив, и обработчик handleBook(ticket), который добавляет билет в конец tickets. Передайте выбору мест пропсы tickets={tickets} и onBook={handleBook}. В SeatPicker, когда всё верно, верните в error значение "", вызовите onBook(), как выше, и очистите selected и оба поля. Пусть isTaken() проверяет и билеты, как выше. Забронируйте место: оно станет серым.

  3. 3

    После бронирования запишите Забронировано! Ваши места: A3, A4 в новое состояние confirmation, с местами из selected.join(", "), и покажите его под формой в <p className="mt-4 font-semibold text-green-700">. В списке «Ваши билеты» (раздел с заголовком уже готов в Showtimes) покажите li для каждого билета, с ключом, классами rounded-lg border border-stone-200 bg-white px-4 py-2 и текстом Пятница 17:30, Роботы в отпуске: A3, A4, составленным из ticket.showtime и ticket.seats.join(", ").

Назад

7/9

  1. 1. Кинотеатр как приложение на React
  2. 2. Две страницы в одном приложении
  3. 3. Фильмы из данных
  4. 4. Загрузка расписания
  5. 5. Выбор дня
  6. 6. Выбор мест
  7. 7. Форма бронирования
  8. 8. Запоминаем билеты
  9. 9. Поздравляем!
Далее

Начните программировать бесплатно

Регистрируясь, вы принимаете Условия использования и Политику конфиденциальности.

Или зарегистрируйтесь через: