Das Buchungsformular
Die Platzwahl hat jetzt ihr Formular unter der Zusammenfassung: die Felder Name und E-Mail und den Button Buchen, in JSX umgewandelt (wo aus for htmlFor und aus novalidate noValidate geworden ist). Erwecke es zum Leben wie in der Lektion Formulare: Die Felder sind kontrolliert, mit den States name und email, und das Formular ruft absenden auf, das mit event.preventDefault() beginnt.
Prüfen. Dann prüft absenden das Formular, eins nach dem anderen, wie in der Übung Fehlermeldungen: einen leeren Namen, eine E-Mail ohne @, keinen ausgewählten Platz. Das erste Problem kommt in den State fehler, den das Formular zeigt, und return beendet den Handler, sodass nichts gebucht wird. Der Besucher behebt das Problem und klickt noch einmal auf Buchen. Die alte Seite zeigte alle drei Meldungen auf einmal. So gibt es eine einzige Meldung unter dem Button, und der Code ist kürzer.
Buchen. Wenn alles stimmt, macht die Platzwahl ein Ticket: ein Objekt mit einer id aus Date.now(), der Vorstellung, den Plätzen, dem Namen und der E-Mail. Aber wohin damit? Die Tickets braucht die Platzwahl, um die gebuchten Plätze als belegt zu zeigen, und die Liste Deine Tickets in Programm. Also sind sie State von Programm, tickets, und die Platzwahl bekommt sie in ihren Props, zusammen mit einer Funktion, die eins hinzufügt, wie das Formular für eigene Wörter im Abschlussprojekt des React-Kurses:
beiBuchung({
id: Date.now(),
vorstellung: vorstellung,
plaetze: ausgewaehlt,
name: name.trim(),
email: email.trim(),
});Ein Ticket behält die ganze Vorstellung, damit die Liste ihren Tag, ihre Uhrzeit und ihren Film zeigen kann. Dann leert die Platzwahl ausgewaehlt und beide Felder. Die gebuchten Plätze sind von nun an belegt: istBelegt() prüft mit some() auch, ob eines der Tickets für diese Vorstellung den Platz hat, wie es das alte Skript getan hat:
return tickets.some(
(ticket) =>
ticket.vorstellung.id === vorstellung.id && ticket.plaetze.includes(platz),
);Schließlich sagt die Platzwahl, welche Plätze gebucht wurden, Gebucht! Deine Plätze: A3, A4, in einem weiteren State, bestaetigung. Ihr Text kann auch nach setAusgewaehlt([]) noch aus ausgewaehlt kommen: Wie du aus der Lektion State weißt, kommt der neue Wert erst mit dem nächsten Rendern.
So schreibst du es:
Anweisungen
- 1
Füge in
Platzwahldie Statesname,emailundfehlerhinzu, alle am Anfang"", und mache beide Felder kontrolliert. Gib dem FormularonSubmit={absenden}.absenden(event)ruftevent.preventDefault()auf und setzt dannfehlerund beendet die Funktion mitreturn, wenn der Name leer ist (name.trim() === ""):Gib deinen Namen ein., wenn die E-Mail kein@hat:Gib eine gültige E-Mail-Adresse ein., und wenn kein Platz ausgewählt ist:Wähle mindestens einen Platz.Zeige den Fehler unter dem Button in<p className="mt-4 text-sm text-red-700">, wenn es einen gibt. Klicke bei leeren Feldern auf Buchen. - 2
Füge in
Programmden Stateticketshinzu, ein leeres Array, und den Handlerbuchen(ticket), der das Ticket ans Ende vonticketsanhängt. Gib der Platzwahl die Propstickets={tickets}undbeiBuchung={buchen}. Setze inPlatzwahl, wenn alles stimmt,fehlerzurück auf"", rufebeiBuchung()wie oben auf und leereausgewaehltund beide Felder. LassistBelegt()auch die Tickets prüfen, wie oben. Buche einen Platz: Er wird grau. - 3
Setze nach dem Buchen
Gebucht! Deine Plätze: A3, A4in den neuen Statebestaetigung, mit den Plätzen ausausgewaehlt.join(", "), und zeige ihn unter dem Formular in<p className="mt-4 font-semibold text-green-700">. Zeige in der Liste Deine Tickets (ihr Abschnitt mit der Überschrift steht inProgrammschon bereit) für jedes Ticket einlimit seinem Schlüssel, den Klassenrounded-lg border border-stone-200 bg-white px-4 py-2und dem TextFreitag 17:30, Roboter im Urlaub: A3, A4, austicket.vorstellungundticket.plaetze.join(", ").