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

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

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

Сообщество

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

Сообщество

Войти

Выбор мест

Нажатие на «Выбрать места» открывает выбор мест. Это отдельный компонент, SeatPicker, и он уже ждёт вас в SeatPicker.jsx: карточка с заголовком и пустой сеткой. Он получает выбранный сеанс в пропе showtime. Какой сеанс выбран — это состояние Showtimes, chosen: сначала null, то есть сеанса нет, а после нажатия на кнопку — объект сеанса. Выбор мест показывается, только когда сеанс есть, с помощью &&:

{chosen !== null && (
    <SeatPicker key={chosen.id} showtime={chosen} />
)}

Ключ нужен по той же причине, что и у карточек в итоговом проекте курса React. Выбор мест запоминает, какие места выбрал посетитель. Когда посетитель выберет другой сеанс, React оставил бы тот же SeatPicker с другими пропсами, и места, выбранные на пятницу, остались бы выбранными на субботу. С отдельным ключом для каждого сеанса React создаёт новый компонент, в котором ничего не выбрано.

Места. В начале SeatPicker.jsx массив seats содержит названия всех 40 мест, от A1 до E8, созданные двумя циклами, как в старом скрипте. В сетке map() превращает их в кнопки. Проданное место, то есть то, что есть в showtime.taken, отключено и получает класс taken. Место, которое выбрал посетитель, получает класс selected. У места может быть несколько классов, поэтому на этот раз className — шаблонная строка: seat всегда, а каждый из двух других классов — или ничего, с условным оператором:

className={`seat ${isTaken(seat) ? "taken" : ""} ${selected.includes(seat) ? "selected" : ""}`}

Для свободного места, которое не выбрано, получится "seat " с двумя пробелами на конце, и это не мешает: пробелы только разделяют классы.

Выбранные места — массив в состоянии, selected, сначала пустой. Нажатие на место добавляет его с помощью spread или убирает через filter(), если оно уже выбрано, как в упражнениях «Добавление в массив» и «Удаление из массива» урока «Состояние». Под сеткой выбор мест показывает, сколько мест выбрано и сколько они стоят. Обратите внимание на запись итого: {selected.length * showtime.price} ₽: фигурные скобки в JSX вставляют значение, а ₽ — просто символ текста после них. Это не шаблонная строка: шаблонные строки бывают только между обратными кавычками.

Задание

  1. 1

    В Showtimes добавьте состояние chosen, сначала null, и пусть каждая кнопка «Выбрать места» записывает в него свой сеанс: onClick={() => setChosen(showtime)}. Под таблицей покажите выбор мест, как в первом примере (импортируйте SeatPicker). Выберите сеанс: в заголовке выбора мест будет его название.

  2. 2

    В SeatPicker.jsx напишите функцию isTaken(seat), которая возвращает showtime.taken.includes(seat). В сетке покажите для каждого места button с ключом и текстом seat, с классом seat и, когда isTaken(seat) равно true, ещё с классом taken и disabled={isTaken(seat)}. Пока напишите className без selected: {`seat ${isTaken(seat) ? "taken" : ""}`}.

  3. 3

    Добавьте состояние selected, пустой массив (импортируйте useState), и обработчик handleToggleSeat(seat), который добавляет место в selected или убирает его. Дайте каждому месту onClick={() => handleToggleSeat(seat)} и класс selected, как в примере выше. Под сеткой покажите <p>Мест: {selected.length}, итого: {selected.length * showtime.price} ₽</p>. Выберите несколько мест, а потом выберите другой сеанс.

Назад

6/9

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

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

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

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