Das vollständige React-Bootcamp 2023 (aktualisiert) | Arash Ahadzadeh | Skillshare
Suchen

Playback-Geschwindigkeit


1.0x


  • 0.5x
  • 0.75x
  • 1x (normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Das vollständige React-Bootcamp 2023 (aktualisiert)

teacher avatar Arash Ahadzadeh, UI/UX Designer | University Lecturer

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Einheiten dieses Kurses

    • 1.

      Einführung

      3:34

    • 2.

      Anforderungen

      1:29

    • 3.

      Updates und Probleme

      0:57

    • 4.

      Einführung in den ersten Abschnitt

      0:14

    • 5.

      Installieren von Git + Git Bash (Windows)

      14:18

    • 6.

      Ändern des Git Bash-Erscheinungsbilds (nur Windows)

      3:46

    • 7.

      Installiere Git (macOS)

      1:09

    • 8.

      Installieren von VSCode (Windows)

      3:27

    • 9.

      Installieren von VS-Code (macOS)

      0:42

    • 10.

      VSCode-Konfiguration und Erweiterungen

      9:50

    • 11.

      Arbeiten mit Git – Teil 1

      12:52

    • 12.

      Arbeiten mit Git – Teil 2

      10:58

    • 13.

      Arbeiten mit Git – Teil 3

      12:54

    • 14.

      Installieren von Node.js (Windows)

      4:44

    • 15.

      Installieren von Node.js (macOS)

      1:08

    • 16.

      Node.js und NPM – Teil 1

      9:38

    • 17.

      Node.js und NPM – Teil 2

      14:39

    • 18.

      Was sind Prettier und ESLint?

      20:04

    • 19.

      Was sind Server, JSON, REST-API und GraphQL?

      12:31

    • 20.

      Client-Side-Rendering (SPA) VS. Serverseitiges Rendering (dynamisch und statisch)

      13:06

    • 21.

      VS-Code-Shortcuts

      2:25

    • 22.

      Einführung in JavaScript

      0:23

    • 23.

      Var VS. Lass VS. Const

      9:26

    • 24.

      Wofür wird Array.map verwendet?

      7:05

    • 25.

      Wofür wird Array.duce verwendet?

      13:34

    • 26.

      Funktionsdeklaration VS. Ausdruck

      5:24

    • 27.

      Pfeilfunktionen und Standardfunktionsargumente

      10:01

    • 28.

      String-Interpolation

      7:51

    • 29.

      Objekt- und Array-Destrukturierung

      16:37

    • 30.

      Operatoren für die Verbreitung und Pause

      13:07

    • 31.

      Async-Code, Callstack und Event-Loop

      20:01

    • 32.

      Async und Sync-Code – Versprechen und Async Await

      21:09

    • 33.

      ECMAScript-Module

      9:42

    • 34.

      ECMAScript oder JavaScript

      1:56

    • 35.

      Was ist React?

      2:46

    • 36.

      Komponentenbasierter Ansatz

      3:48

    • 37.

      Funktionen vs. Klassen

      1:12

    • 38.

      Reagieren unter der Haube

      4:55

    • 39.

      Boilerplates und Projektbundlers

      3:07

    • 40.

      TicTacToe-Projektübersicht

      0:53

    • 41.

      Erstellen und Konfigurieren eines neuen Projekts mit Vite

      24:11

    • 42.

      Eslint und Prettier-Erweiterungen

      1:45

    • 43.

      Was sind React-Komponenten und Requisiten

      26:42

    • 44.

      Wie du CSS-Stile anwendest. Konfigurieren von SASS

      15:50

    • 45.

      React State mit useState-Hook, React-Events

      23:57

    • 46.

      Erstellen eines Spielbrettzustands

      21:12

    • 47.

      Hinzufügen von Spielern X und O

      7:09

    • 48.

      Zeige den nächsten Spieler- und Gewinnernachrichten

      17:26

    • 49.

      Zeigen der Spielzeichnung

      20:13

    • 50.

      Implementieren von Spielhistorie

      35:25

    • 51.

      Hinzufügen von Spiel-Reset-Schaltfläche

      3:54

    • 52.

      Hervorheben des Spielgewinners (Gewinnkombination)

      10:26

    • 53.

      Letzter Schliff. Korrigieren von Stilen, Hinzufügen von Schriftart und Inline-Styling

      8:19

    • 54.

      Bereitstellung zum Surgen

      9:53

    • 55.

      Zusammenfassung

      4:24

    • 56.

      Extra. Hinzufügen von CSS-Hintergrundkreisen.

      1:10

    • 57.

      Box Office-App-Übersicht

      3:36

    • 58.

      Erstellen des Projekts mit Create React App

      23:31

    • 59.

      Bereinigen redundanter Dateien

      5:31

    • 60.

      React Router v6 Einführung. Erstellen von Seiten

      15:52

    • 61.

      Layouts und Navigation zwischen Seiten

      17:39

    • 62.

      Eingaben. Einweg- und Zweiweg-Datenbindung

      9:53

    • 63.

      Formulareinreichung. Abrufen von Show-Daten aus der TV Maze-API

      13:36

    • 64.

      Rendern von Showdaten von der TV Maze-API

      21:01

    • 65.

      Korrigieren von Prettier funktioniert nicht

      3:38

    • 66.

      Optionsfelder. Suche nach Schauspielern hinzufügen

      12:37

    • 67.

      Verschieben von Suchformularlogik in seine eigene Komponente

      9:41

    • 68.

      Anzeigen von Karten für Shows und Schauspieler

      25:04

    • 69.

      Seiten mit dynamischen Inhalten. Erstellen der Seite anzeigen

      11:21

    • 70.

      Einführung in useEffect-Hook

      16:06

    • 71.

      Abrufen von TV Maze-API-Daten mit useEffect

      12:54

    • 72.

      Benutzerdefinierte Reaktionshooks. Extrahieren und Wiederverwenden von Hook-Logik

      6:58

    • 73.

      Datenabruf mit Bibliotheken. React-Abfrage

      13:32

    • 74.

      Aufgabe React-Abfrage auf der Startseite

      2:01

    • 75.

      Verwenden von React-Abfrage zum Suchen nach Daten auf der Startseite

      9:01

    • 76.

      Anzeigen von Informationen auf der Seite Anzeigen

      32:45

    • 77.

      Hinzufügen der Schaltfläche „Zurück“ auf der Seite „Anzeigen“

      7:57

    • 78.

      Einführung in useReducer als Alternative zu useState

      15:50

    • 79.

      Mit Sternen versehene Shows p1. Erstellen eines Zustands mit useReducer

      24:44

    • 80.

      Mit Sternen versehene Shows p2. Extrahieren mit Sternchen zeigt Logik in einem benutzerdefinierten Hook

      8:56

    • 81.

      Mit Sternen versehene Shows p3. Anzeigen aus der API auf der Seite Starred abrufen

      19:55

    • 82.

      Aufgabe Benutzerdefinierter Hook usePersistedState über useState

      2:02

    • 83.

      Implementieren eines benutzerdefinierten Hooks usePersistedState

      7:40

    • 84.

      Einführung in gestaltete Komponenten. CSS-IN-JS als Alternative zum Styling

      23:47

    • 85.

      Stylen der App p1. Globale Stile, Thema, aktiver Link des React-Routers

      27:57

    • 86.

      Stylen der App p2. Dynamische Stile der Stile von Styled Components auf der Grundlage von Requisiten

      26:39

    • 87.

      Stylen der App p3. FlexGrid-Animation und useRef-Hook

      15:15

    • 88.

      Bereitstellung auf Github-Seiten

      17:06

    • 89.

      PWA (Progressive Web App). Service-Mitarbeiter

      19:01

    • 90.

      Fixieren der Basis-URL zum korrekten Auflösen von Bildern auf Github-Seiten

      5:38

    • 91.

      Letzter Schliff. Erstellen von Favicons

      9:07

    • 92.

      Zusammenfassung. Erhaltenes Wissen

      7:46

    • 93.

      Was ist Firebase?

      1:47

    • 94.

      Übersicht über Firebase-Services

      5:05

    • 95.

      Firebase-Sicherheit

      1:50

    • 96.

      Firebase-Preise

      1:02

    • 97.

      Projektübersicht

      8:47

    • 98.

      Chat-App-Updates stehen vor der Tür!!

      3:12

    • 99.

      Gerüste des Projekts

      7:55

    • 100.

      Erstellen und Konfigurieren des Firebase-Projekts

      11:09

    • 101.

      Erstellen von Seiten – Private und öffentliche Routen

      7:56

    • 102.

      Anmeldeseite – Interaktion mit Firebase

      21:24

    • 103.

      Erstellen von Profilkontext – Kontext-API und globales Staatsmanagement

      9:27

    • 104.

      Globale Profilstatusverwaltung mit Kontext

      12:34

    • 105.

      Beginne mit dem Erstellen der Sidebar und des Dashboards

      7:43

    • 106.

      Responsive Sidebar mit Medienabfrage

      3:16

    • 107.

      Erstellen von Dashboard – Teil 1

      5:42

    • 108.

      Erstellen von Dashboard – Wiederverwendbare und editierbare Komponenten (Teil 2)

      12:42

    • 109.

      Erstellen des Dashboards – Aktualisieren des Benutzer-Nicknamens (Teil 3)

      4:10

    • 110.

      Erstellen eines Dashboards – Verknüpfe Social-Media-Anbieter (Teil 4)

      16:42

    • 111.

      Erstellen von Dashboard – Erstellen von Avatar (Teil 5)

      13:10

    • 112.

      Erstellen des Dashboards – Hochladen des Avatars auf Firebase (Teil 6)

      12:27

    • 113.

      Erstellen des Dashboards – Anzeigen von Benutzeravataren und Namensinitialen (Teil 7)

      7:37

    • 114.

      Hinzufügen der Create-Room-Schaltfläche und Funktionalität

      17:36

    • 115.

      Erstellen von Chatrooms-Listen – Teil 1

      8:49

    • 116.

      Erstellen von Chatrooms-Liste – Kontext der Räume (Teil 2)

      5:47

    • 117.

      Erstellen von Chatrooms-Liste – Räume anzeigen und als Links verwenden (Teil 3)

      6:11

    • 118.

      Erstellen eines verschachtelten Layouts für die Startseite

      6:41

    • 119.

      Erstellen von Chat-Seitenlayout/Komponente

      5:06

    • 120.

      Kontext-API-Problem und eine potenzielle Lösung

      2:41

    • 121.

      Problem der Kontext-API in der Praxis – Erstellen des aktuellen Raumkontexts

      7:54

    • 122.

      Erstellen des ersten Chats – Oberer Teil

      6:44

    • 123.

      Denormalisierung von Daten – Erstellen von Chat-Unterseite

      14:30

    • 124.

      Letzte Nachricht in der Zimmerliste anzeigen

      3:23

    • 125.

      Arbeiten mit denormalisierten Daten

      10:21

    • 126.

      Anzeigen von Chat-Nachrichten

      7:16

    • 127.

      Anzeigen von Benutzerprofildaten

      4:53

    • 128.

      Hinzufügen von Echtzeit-Präsenz – Teil 1

      8:32

    • 129.

      Hinzufügen von Echtzeit-Präsenz – Teil 2

      7:42

    • 130.

      Hinzufügen von Raumschublade bearbeiten

      8:33

    • 131.

      Rollenbasierter Zugriffs- und Sicherheitsregeln

      9:56

    • 132.

      Rollenbasiertes Zugriffsmanagement

      8:43

    • 133.

      Hinzufügen von programmgesteuertem Hover mit Hooks

      2:50

    • 134.

      Erstellen einer IconControl-Komponente – Likes (Teil 1)

      6:20

    • 135.

      Likes-Funktionalität (Teil 2)

      7:20

    • 136.

      Löschvorgang behandeln

      6:22

    • 137.

      Hinzufügen der Upload-Komponente – Teil 1

      12:39

    • 138.

      Hochgeladene Dateien in der Datenbank speichern – Teil 2

      4:16

    • 139.

      Anzeigen und Herunterladen von hochgeladenen Dateien – Teil 3

      6:10

    • 140.

      Audio-Nachrichten aufzeichnen und hochladen – Teil 4

      8:40

    • 141.

      Audio anzeigen und Datei löschen – Teil 5

      4:50

    • 142.

      Gruppenchat-Feed nach Daten

      6:56

    • 143.

      Paginierung und Kontrolle der gescrollten Position

      12:52

    • 144.

      Bereitstellung auf Firebase Hosting

      2:09

    • 145.

      Firebase-Projektplan

      1:15

    • 146.

      Was sind Serverless und Containers?

      3:31

    • 147.

      Cloud Messaging – Wie ist alles verbunden?

      1:28

    • 148.

      Speichern von Gerätetoken in der Datenbank

      8:06

    • 149.

      Hinzufügen von Service Worker

      3:17

    • 150.

      Einrichten von Cloud-Funktionen und Node Version Manager (NVM)

      6:35

    • 151.

      Benachrichtigungsfluss in unserer App – Arten von Cloud-Funktionen

      1:56

    • 152.

      Erstellen der FCM-Cloud-Funktion

      19:55

    • 153.

      Beheben von Cloud-Funktionsfehlern

      1:15

    • 154.

      Senden und Anzeigen von Benachrichtigungen mit Cloud-Funktionen

      15:01

    • 155.

      Verwalten von FCM-Benutzern

      11:27

    • 156.

      Hauptmerkmale von React

      0:28

    • 157.

      React-Portale

      4:41

    • 158.

      Fehlergrenzen

      5:52

    • 159.

      Code-Splitten

      4:40

    • 160.

      Schlussbemerkung

      0:34

    • 161.

      Zusammenfassung – Wissen, das du erworben hast

      2:19

    • 162.

      Deine zukünftigen Bewegungen

      3:54

  • --
  • Anfänger-Niveau
  • Fortgeschrittenes Niveau
  • Fortgeschrittenes Niveau
  • Jedes Niveau

Von der Community generiert

Das Niveau wird anhand der mehrheitlichen Meinung der Teilnehmer:innen bestimmt, die diesen Kurs bewertet haben. Bis das Feedback von mindestens 5 Teilnehmer:innen eingegangen ist, wird die Empfehlung der Kursleiter:innen angezeigt.

3.470

Teilnehmer:innen

7

Projekte

Über diesen Kurs

Erstellt mit aktuellen Versionen von React, React Hooks, Node.js, JavaScript und Firebase.

------

Worum es bei diesem Kurs geht?

In diesem Kurs geht es um React – eine Bibliothek, die Entwicklern bei der Erstellung von Benutzeroberflächen im Web hilft. Aber React ist nicht nur auf Benutzeroberflächen beschränkt, es gibt viel mehr.

Hast du dich jemals gefragt, wie Facebook-, Twitter- oder Netflix-Websites erstellt werden und warum sie sich überhaupt nicht wie Websites anfühlen? React kann all das beantworten. In diesem Kurs zeigen wir, wie du Websites mit Mobile-Feeling (Single Page Apps) erstellen kannst, bei denen React die Grundlage ist.

Zuerst führen wir dich durch die Grundlagen der Webentwicklung, bevor du zu React übergehst. Hier sprechen wir über die neuesten JavaScript, Node.JS, Git, APIs und wesentlichen Tools, damit du dich in jeder Phase des Entwicklungsprozesses so wohl wie möglich fühlst.

Dann gehen wir ein wenig zum Reagieren mit einem kleinen Teil der Theorie. An dieser Stelle lernst du wissen, woraus React besteht und wie es funktioniert.

Unser erstes Projekt ist ein Tic-Tac-Toe-Spiel. Hier lernst du die Grundlagen, Hooks und die Kernfunktionalität von React kennen. Am Ende dieses Projekts kannst du eine einfache Web-App erstellen, die deine starken React-Grundlagen zeigt. Hier erlebst du den Entwicklungsablauf einer React-App im Allgemeinen.

Das zweite Projekt ist eine Web-App zur Filmsuche namens Box Office. Mit diesem Projekt bewegen wir uns zu komplexeren React-Anwendungsfällen und wir arbeiten mit externen APIs, dynamischem Layout und Seiten in Kombination mit verschiedenen Ansätzen für das Styling einer React-App. Hier arbeiten wir mit fortgeschritteneren und benutzerdefinierten React-Hooks. Am Ende dieses Projekts werden wir die App mit React-Hooks analysieren und optimieren, um sie noch schneller und zuverlässiger zu machen. Wir werden sie sogar in eine Progressive Web-App verwandeln, die offline funktioniert!

Das Abschlussprojekt wird eine Chat-App sein. Es enthält die folgenden Funktionen: Logins für soziale Medien, Kontoverwaltung, rollenbasierte Berechtigungen, Echtzeitdaten und viele andere. In diesem Projekt werden wir React mit Firebase kombinieren – einer Backend-Lösung in der Cloud, die auf der NoSQL-Datenbank basiert. Du beherrschst das globale Zustandsmanagement mit der Context-API und schärfst deine Kenntnisse über React-Hooks. In der letzten Phase werden wir die App um ein benutzerdefiniertes Backend in Form von serverless erweitern.

Alle unsere Projekte verfügen über eine benutzerfreundliche und gut gestaltete Benutzeroberfläche, die reaktionsschnell und für alle Geräte optimiert ist.

Ist dieser Kurs genau das, wonach du suchst?

Wenn...

  • ... du die Front-End-Entwicklung mit React von Grund auf lernen möchtest ...

  • ... du hast etwas Erfahrung mit React, aber du fühlst dich nicht sicher ...

  • ... du hast erst begonnen, Webentwicklung zu erlernen und möchtest dich zu modernen Tools und Technologien bewegen ...

  • ... du das Gefühl hast, dass du nur HTML, CSS und etwas JS gemacht hast ...

... dann ist dieser Kurs definitiv für dich!

Was benötigst du, um in diesem Kurs erfolgreich zu sein?

  • HTML und CSS ist absolut erforderlich

  • Allgemeines/Grundverständnis der Programmierung oder JavaScript

  • Keine Vorkenntnisse mit React- oder JS-Frameworks

  • Leidenschaft, neue Dinge zu lernen :)

Nach diesem Kurs hast du:

  • Drei reale React-Projekte unterschiedlicher Komplexität, die in deinen Lebenslauf eingefügt werden können

  • Totales React-Verständnis

  • Erfahrung mit beliebten React-Bibliotheken

  • Kenntnisse darüber, wie du React-Apps erstellen und bereitstellen kannst

  • Kenntnisse über benutzerdefiniertes serverloses Backend und Firebase

Themen, die behandelt und erklärt werden:

  • React-Grundlagen (Syntax, Kernkonzepte, Theorie)

  • Gerüstvorlagen (create-react-app, nano-react-app /w Parcel)

  • Styling von React-Apps (CSS, SASS, UI-Komponentenbibliothek, CSS-IN-JS /w Styled-Komponenten)

  • Bedingtes Rendering (dynamische Inhalte und Stile)

  • Staatsverwaltung, lokal + global (/w React Hooks, Context API)

  • Komponentenanalyse und Optimierung (/w React-Hooks)

  • Komplexes Layoutmanagement

  • Dynamische Seiten mit React Router

  • Progressive Web-Apps und Service-Mitarbeiter

  • Echtzeit-Abonnements in React

  • Verwenden externer APIs zum Abrufen von Remote-Daten

  • Bereitstellung von React-Apps

  • Serverloses Backend mit Cloud-Funktionen

  • Neuestes und modernes JavaScript (ES6 – ES2020)

Nicht Teil von React, aber enthalten:

  • Git, Node.js, APIs, ESLint und Prettier Kurzanleitungen

  • Firebase (/w NoSQL Echtzeitdatenbank, Cloud-Funktionen, Cloud-Messaging, Cloud-Speicher)

  • Idee und Konzept für serverlose Cloud Computing + Erklärung über Docker-Container

Was ist, wenn du während des Kurses stecken geblieben bist?

Stecken zu bleiben ist das Schlimmste und unvermeidlich. Gleichzeitig ist es eine häufige Sache für einen Entwickler. Wir verstehen das und sind immer bereit, dir so schnell wie möglich bei deinen Fragen zu helfen.

Worauf wartest du noch? Beginne den Kurs noch heute!

Für wen ist dieser Kurs geeignet:

  • Jeder, der skalierbare Web-Apps mit React entwickeln möchte
  • Programmierer, die ihren Wert als Webentwickler erhöhen möchten
  • Menschen, die lernen möchten, wie moderne Web-Apps funktionieren und wie alles verbunden ist
  • Jeder, der Anwendungen wie Facebook oder Twitter entwickeln möchte
  • Jeder, der ein Freelancer oder unabhängiger Web-App-Entwickler werden möchte

Triff deine:n Kursleiter:in

Teacher Profile Image

Arash Ahadzadeh

UI/UX Designer | University Lecturer

Kursleiter:in

I am a UI/UX Designer & an iOS developer with almost seven years of experience in application development and also ten years of graphic design and UI/UX design.
My passion is helping people to learn new skills in a short-term course and achieve their goals. I've been designing for over ten years and developing iOS apps for four years. It would be my honor if I could help you to learn to program in a simple word. I currently teach Figma, Sketch, Illustrator, Photoshop, Cinema 4D, HTML, CSS, JavaScript, etc.

Vollständiges Profil ansehen

Level: All Levels

Kursbewertung

Erwartungen erfüllt?
    Voll und ganz!
  • 0%
  • Ja
  • 0%
  • Teils teils
  • 0%
  • Eher nicht
  • 0%

Warum lohnt sich eine Mitgliedschaft bei Skillshare?

Nimm an prämierten Skillshare Original-Kursen teil

Jeder Kurs setzt sich aus kurzen Einheiten und praktischen Übungsprojekten zusammen

Mit deiner Mitgliedschaft unterstützt du die Kursleiter:innen auf Skillshare

Lerne von überall aus

Ob auf dem Weg zur Arbeit, zur Uni oder im Flieger - streame oder lade Kurse herunter mit der Skillshare-App und lerne, wo auch immer du möchtest.

Transkripte

1. Einführung: Willkommen im kompletten React Bootcamp. Hallo, mein Name ist Andrew und ich bin React-Entwickler. Hallo, mein Name ist unser Ash und ich kann UI UX Designer. Wollten Sie schon einmal eine App ähnlich wie Twitter oder Facebook erstellen? Bevorzugen Sie Praxis gegenüber Theorie? Wenn ja, sind Sie zusammen am richtigen Ort, wir werden drei separate Projekte von unterschiedlicher Komplexität von Grund auf neu erstellen, ein Tic-Tac-Toe Spiel und Film Search App und schließlich ein Geschwätz. Dieser Kurs richtet sich an Personen, die gerne Web-Apps entwickeln möchten. Wir Technologien, die heutzutage immer beliebter werden. Zuerst besprechen wir alle Grundlagen, die Sie kennen müssen, bevor Sie in React springen. Hier werden wir über keine GS, gute clientseitige und serverseitige Rendering-APIs und wichtige Tools sprechen, damit Sie sich in jeder Phase der Entwicklungsansätze wohl fühlen. Gleich danach haben wir einen dedizierten JavaScript-Abschnitt, aber wir haben die neuesten und aktuellen Funktionen der Sprache entdeckt. Dann bewegen wir uns leicht, um mit dem kleinen Teil der Theorie zu reagieren. An dieser Stelle werden Sie wissen, sobald Riak hergestellt ist und wie es funktioniert. Von hier aus starten wir mit unserem ersten Projekt, dem Tic-Tac-Toe Spiel. Es hat eine moderne Benutzeroberfläche mit coolen Animationen und nahtlose Funktionalität in diesem Projekt, lernen Sie zuerst reagieren kennen. Sie lernen, wie Sie Komponenten erstellen, dynamische Stile in Benutzeroberflächen. Aber wir werden über Statusverwaltungs- und Komponentenlebenszyklusereignisse mit Hooke's sprechen. Am Ende dieses Projekts werden Sie in der Lage sein, eine einfache Web-App zu erstellen, die Ihre starke Reaktion Basic zeigt, und Sie werden den Entwicklungsfluss im Allgemeinen erleben. Das zweite Projekt heißt „Kasse“. Es fungiert als Suchmaschine für TV-Filme und Shows. Sie können Informationen über jeden Film oder AG erhalten. Und darüber hinaus können Sie sie zu Favoriten hinzufügen, um sie in der Zukunft zu überprüfen, wir diese Projekt, Sie bewegen sich in Richtung einer komplexeren React-App oder Sie arbeiten mit externen APIs und verwalten nicht-primitive Szenarien mit Kostüm 3i-Hooks. Darüber hinaus erfahren Sie mehr über CSS und JS als Alternative für Styling und Anwendung, wir werden das Konzept der dynamischen Routen und Remote-Datenabruf zu erkunden. Sie werden auch verstehen, wie Sie React-Komponenten mithilfe von integrierten Reaktionswerkzeugen optimieren und analysieren können. Am Ende dieser Projekte werden wir unsere App sogar in eine progressive Web-App verwandeln, die offline funktioniert. Nach Abschluss der Abendkasse können Sie eine typische React-Anwendung erstellen, die umfassendere und erweiterte React-Kenntnisse erfordert. Unser abschließendes Projekt wird ein Chat mit den beliebtesten Funktionen sein, die von jeder Chat-Anwendung benötigt werden. Dazu gehören Social Media Logins, Account-Management, rollenbasierte Berechtigungen, Echtzeitdaten und viele andere coole Funktionen in diesem Projekt, werden Sie Firebase in erster Linie kennen lernen. Hier werden Sie die Benutzerauthentifizierung und das globale Zustandsmanagement beherrschen. In diesem Stadium wird React Hooks Ihre Hauptwaffe sein, um eine produktionsfähige React-App zu entwickeln , die Stile selbst verwaltet, ist nicht immer wünschenswert. Deshalb werden wir hier eine UI-Komponentenbibliothek verwenden, um ein vordefiniertes Designsystem zu verwenden. Schließlich werden wir unser eigenes Backend mit Cloud-Funktionen entwickeln, und wir werden die Echtzeit-Benachrichtigungsfunktion zu unserer Chat-Anwendung hinzufügen. Warte, du bist noch nicht fertig. Sie sind bereit, Ihnen in jeder Phase des Kurses zu helfen und Ihre Fragen so schnell wie möglich zu beantworten. Sind Sie bereit zu erforschen, reagieren Sie gemeinsam. Wir sehen uns in der Klasse. 2. Anforderungen: Hallo, mein Name ist Andrew. Ich werde dein Instruktor sein. Werfen Sie Dick Koers. Lassen Sie mich Ihnen von den Voraussetzungen erzählen, damit dieses Gericht anfangen kann, mit reagieren zu können. Zunächst einmal alles Wissen aus HTML und CSS unerlässlich. Ich werde keine zusätzliche Aufmerksamkeit geben, um zu erklären, was dif Tag ist. Dasselbe gilt für CSS. Ich erwarte, dass Sie über Klassen und Selektoren Bescheid wissen, aber keine Stopps machen, um HTML- und CSS-Grundlagen zu erklären . Aber Sie können immer Fragen in den Commons stellen. Es gibt definitiv ein paar Schlüsselmomente von HTML und CSS, und das wird erklärt. Aber die meiste Zeit werden wir mit JavaScript arbeiten. Ich erwarte nicht, dass Sie ein gutes JavaScript sein oder einige anständige Erfahrung haben. Ich wollte über Programmierung im Allgemeinen wissen, Sie müssen grundlegende Dinge verstehen, wie was verfügbar ist oder ein Krieg ist ein Vier-Look. Du wirst es bekommen, du weißt es heute. JavaScript-Syntax. Während des Kurses ist es sehr benutzerfreundlich Herz zu verstehen. Teile werden erklärt, also mach dir keine Sorgen darüber. Es gibt auch einen speziellen Abschnitt, der Onley zu JavaScript gewidmet ist. Es deckt die wichtigsten Aspekte der Sprache ab, um sicherzustellen, dass Sie genug wissen, um mit Reaktionseilen zu beginnen , und ich versuche, alles so glatt wie möglich zu machen. Trotzdem wollte ich so viele Fragen stellen, wie Sie können. Und sei nicht schüchtern, dumme Fragen zu stellen, die immer da waren, um dir zu helfen. Lassen Sie uns schnell zusammenfassen. Sie müssen sich bewusst sein, HTML CSS und einige allgemeine Programmierkenntnisse. Das war's. Wir sehen uns im nächsten Video. 3. Updates und Probleme: Hey, in diesem Video möchte ich auf eine Datei verweisen, die Ihnen über die Updates und Änderungen erzählt , die Menschen während des Kurses machen. Im Web ändert sich alles ständig. Und um mit aktuellen Inhalten auf dem Laufenden zu bleiben, haben wir diese Datei erstellt. Bitte finden Sie Updates und Probleme dot pdf-Datei im Bereich Projekte und Ressourcen innerhalb Sie zwei wichtige Kapitel, wichtige Updates und häufige Probleme zu sehen . Wichtige Updates betreffen alle, die den Kurs besuchen. Bitte lesen Sie dieses Kapitel, um Inkonsistenzen während der Videos zu vermeiden. Häufige Probleme beziehen sich auf potenzielle Fehler, die möglicherweise auftreten, und deren Lösungen zusammen. Bitte beziehen Sie sich auf diese Datei an erster Stelle, wenn Sie ein Problem haben. Im schlimmsten Fall lesen Sie bitte Kapitel drei. Wir möchten Sie immer auf dem neuesten Stand halten. Nur. Viel Glück bei den Projekten. 4. Einführung in den ersten Abschnitt: Hey, willkommen zum Kurs in der Rubrik Mobile Abdeckung Alle Dinge, die wir wissen müssen, bevor wir anfangen Mit der React-Entwicklung. Dazu gehören Werkzeuge, ein wenig Theorie und ein paar andere Dinge. Ich hoffe, Sie genießen sie. Wir sehen uns dort. 5. Git + Git Bash (Windows): Hey, in diesem Video werden wir installieren und bekommen was gut ist und warum brauchen wir es? All das werden wir im kommenden Video behandeln. In diesem Video dreht sich alles um die Installation. Lass uns gehen. Wie immer öffnen wir zuerst Google und dann werden wir danach suchen und dies wird uns auf die offizielle Website bringen. In einem neuen Tab öffne ich nicht geladen. Und auf der aktuellen Registerkarte suche ich nach Git, der vor Ort installiert ist. Dies bringt uns zu mindestens one.com. Warum brauchen wir es? Wenn Sie Unstimmigkeiten bei der Git-Installation feststellen oder wenn Sie wegen der Git-Installation verloren gehen. Dies ist das neueste, aktuelle Tutorial zur Sonneneinstrahlung. Das empfehle ich. Wenn Sie also unter macOS, Linux, Windows sind , spielt das keine Rolle. Navigieren Sie einfach hierher und es ist sehr einfach und unkompliziert. Alles klar, jetzt gehen wir zurück zu Downloads. Dieses Video richtet sich an Windows-Benutzer, aber wenn Sie von Linux oder macOS stammen, ist es auch völlig in Ordnung. Wenn Sie also unter Linux sind, klicken Sie einfach hier und wählen Sie je nach Distribution einfach den Befehl aus. Es ist sehr einfach zu machen, okay? Wenn Sie aus der macOS-Welt kommen, haben Sie ein paar Möglichkeiten. Sie können Abschied mit einem Paketmanager wie Homebrew installieren einem Paketmanager wie Homebrew oder direkt ein Installationsprogramm verwenden. In diesem Tutorial wird empfohlen, ein Installationsprogramm zu verwenden, was der einfachste Weg unter macOS ist, okay? Da wir unter Windows sind, klicken wir auf Windows und wir werden das Installationsprogramm bekommen. Wenn Sie von einem anderen Betriebssystem kommen, empfehle ich Ihnen dennoch, dieses Video schnell durchzugehen da wir einige wichtige Fragen behandeln werden. In Ordnung, also haben wir das Installationsprogramm geöffnet und wir haben Weiter geklickt. Was brauchen wir hier? Zusätzliche Icons. Das liegt an Ihnen, Windows Explorer-Integration. Das ist also nur Windows Option. Und wir wollten Git Bash hier auswählen, und wir wollten die gute GUI deaktivieren. Niemand benutzt Gutes um zu gehen. Dies ist ein visuelles Werkzeug, um ein gutes darzustellen, Okay? Und Git Bash ist eine Kurzversion des Unix-Terminals namens Bash. Diese Kurzversion ist also nur unter Windows unter Git Bash Day verfügbar. Und ich denke, das ist sehr nützlich und praktisch. Unter Windows haben wir also cmd und PowerShell, und wir werden Git Bash installieren und es anstelle von CMD und PowerShell verwenden . Okay, dann wollten wir ein gutes L von c auswählen. Dies ist also nur für den Fall, dass wir wirklich große Dateien und unser gutes Projekt haben , diese Option ermöglicht es uns, diese Dateien zu platzieren. In einem guten Projekt wollten wir also grundsätzlich Assoziationen behalten. Ich brauche keine täglichen Updates und kein Git-Bash-Profil für Windows Terminal. Ich bin mir also nicht sicher, aber ich denke, dies hängt mit dem neuen Windows Terminal zusammen, das kürzlich veröffentlicht wurde. Okay, also will ich es auch nicht. Als nächstes, diesen Schritt, wählen wir einen Editor aus, bei dem Sie sich wohl fühlen. Ich weiß also, dass Sie noch nichts wissen, aber in gutem Zustand besteht die Möglichkeit, dass es einen Konflikt zwischen mehreren Dateien geben wird . Und um diesen Konflikt zu lösen, müssen Sie diese Dateien manuell durchgehen und bearbeiten. Wenn dieser Konflikt auftritt, öffnet get einen Editor , den Sie hier standardmäßig auswählen. Okay, wählen Sie also etwas aus, das Sie verwenden können, zum Beispiel Visual Studio-Code. Alles klar, als nächstes hier. Was haben wir hier, justieren, den Namen des ersten Zweigs auch den Namen des ersten Zweigs in Ihrem Repository. Das ist knifflig. Wir werden auswählen, wir werden auswählen, lassen, entscheiden. Aber worum es hier geht. Nun, ich verstehe, ich weiß, dass du noch nichts weißt, aber es gibt dieses Konzept von Zweigen in gutem Zustand. Vor etwa einem Jahr haben gute Community und GitHub Community beschlossen, gute Community und GitHub Community den Standard-Zweignamen zwei zu ändern, main kurz bevor er Master hieß. Jetzt heißt es offiziell main, aber es gibt immer noch viele Projekte , die weiterhin Master verwenden. Was ich also empfehle, ist einfach zu wählen, auszuwählen, zu lassen, zu bekommen, zu entscheiden. Dann lasst uns Weiter drücken. Und hier haben wir Ihre Pfadumgebung angepasst daher möchten wir Empfohlene zweite Option auswählen. Es ermöglicht uns, Git von jeder Terminal-Shell aus zu verwenden , sei es CMD, PowerShell oder Bash, oder von jeder anderen Software und Shells, die wir installieren und verwenden werden. Deshalb ist die zweite Option das, was wir wollen. In diesem Schritt. Wir wollen nichts ändern, behalten Sie einfach eine standardmäßige Verwendung gebündelt OpenSSH wird vier erhalten. Es sind Verbindungen könnten SSH-Tunnel verwenden. Okay. Deshalb wird es mit einer ausführbaren SSH-Datei gebündelt, die von OpenSSH stammt. Okay, als Nächstes, hier, https Transport Back-End. Verwenden Sie weiterhin OpenSSL. Wir wollen es auch nicht ändern. Weiter hier über Zeilenenden. Nun, gut ist ein plattformübergreifendes Tool. Es gibt jedoch einige spezifische Dinge, die irgendwie, irgendwie verwaltet oder kontrolliert werden müssen, um diese plattformübergreifende Verfügbarkeit zu erreichen. Und eines dieser Dinge sind Linienenden. Die Sache ist, dass Zeilenenden unter Windows und auf Unix-ähnlichen Systemen unterschiedliche Codierungen haben, okay? Und es könnte große Probleme verursachen, Projekte zu erhalten. Dies gibt uns die Möglichkeit unser Projekt problemlos plattformübergreifend zu halten. Dies ist eine sehr kleine Sache, aber es ist sehr wichtig, denn wenn Sie dritte Option auswählen und einige Änderungen vornehmen, um ein Projekt unter Windows zu erhalten , und dann öffnen Sie dieses Projekt auf einem mit verschiedenen Betriebssystemen werden Sie viele Probleme haben. Warum wollen wir es nicht. Für Windows wählen wir diese Option aus. Als Nächstes wurde der Terminalemulator für die Verwendung mit Git Bash konfiguriert . Okay, also wird Git Bash wieder unsere neue Shell sein, die wir als Alternative zu CMD und PowerShell verwenden werden. Also minzig ist dieses Terminalfenster, okay, also wenn ich CMD öffne, habe ich dieses Standard-Windows-Fenster, im Grunde das richtige, genau wie es sagt, die zweite Option hier, Standardkonsolenfenster. Mentee ist also, dass diese Software, die im Grunde die Trans-Terminal-Shell ausführt, darin Shells enthält. Es wird also das Fenster sein , das wir konfigurieren können, seine Farbe und Codierung ändern können, und andere Dinge können Schlüsselbindungen sein, all das. Das ist also nur das Fenster, das Terminal-Shells ausführt. Okay? Also möchten wir Mentee verwenden und dann das Standardverhalten einer guten Umfrage auswählen. Du weißt noch nichts davon, aber lass uns Standard wählen. Dies ist fast immer die bevorzugte Option. Und ich würde immer sagen. Wählen Sie als Nächstes einen Helfer für Anmeldeinformationen aus. Hier möchten wir Git Credential Manager Core auswählen. Dies ist spezifisch für Windows hier, aber verwenden Sie diese Option immer noch. Was es tut, wird es Zeiten geben, ich meine, immer so. Wir wollten unser gutes Projekt irgendwo veranstalten. Wir haben auf GitHub gehostet. Und um uns für GitHub zu autorisieren, müssen wir unsere Anmeldeinformationen für einen GitHub, unseren Benutzernamen und unser Passwort eingeben. Um sie nicht jedes Mal zu beantworten müssen diese Anmeldeinformationen sicher irgendwo in einem Cache-Speicher gespeichert werden. Unter Windows heißt dieser Cache-Speicher Git Credential Manager Core. Deshalb mussten wir unsere Anmeldeinformationen nicht jedes Mal eingeben. Wir möchten unsere Änderungen an GitHub weitergeben. Okay, als Nächstes wollten wir bei diesem Schritt System-Caching, symbolische Reinigungen aktivieren. Behalte es so wie es ist. Wir kommen als Nächstes und brauchen überhaupt keine experimentellen Funktionen. Also klicke einfach auf Installieren. Vorherige Version wird entfernt. Ja, ich meine, für mich weil ich es bereits installiert hatte. Warten wir eine Sekunde, bis es installiert ist und schauen wir uns an, was wir haben. Okay, gut. Abschluss des guten Setup-Assistenten. Ich möchte nicht, dass Versionshinweise fertig werden. Jetzt ist gut installiert. Wie können wir das überprüfen? Lass uns zu CMD gehen. Und in cmd möchten wir einfach Git Space Dash, Dash Version eingeben. Und wenn Sie sehen, dass die Version installiert ist, Glückwunsch, get ist jetzt installiert. Dies bezieht sich nur auf Windows-Benutzer, die installiert haben die Git Bash während der Installation ausgewählt haben. Wie können wir „Keep Bash“ überprüfen? Nun, wir können Git Bash direkt von einer anderen Shell aus ausführen, zum Beispiel Cmd sehen. Wenn ich also Git Bash mit Dash eintippe, sehe ich, dass Git Bash nicht erkannt wird. Nun, das ist ehrlich zu sein, erwartet. Und um das zu beheben, müssen wir erneut eine kleine Änderung unserer Pfadvariablen tun . Was müssen wir also tun, um Panel zu starten und auf der Suche mit Typ III und V. Dann bearbeiten wir die Systemumgebungsvariablen und Vitamingemüse. Und unter System werden Blasen nach Pfad suchen. Doppelklicken Sie darauf. Und hier am Ende der Liste sehen Sie C Program Files, good, CMD oder welchen Installationspfad Sie während der Installation gewählt haben. Okay, also wenn wir diesen Pfad öffnen, gehen wir zu Ordnern. Und lass uns hierher gehen. Ausführbare Dateien, die wir hier haben, sind gute, gute GUI, alles außer Git Bash. Wenn wir jedoch hier den Ordner holen , haben wir Git Bash ausführbar. In Ordnung? Um diese ausführbare Datei vom Terminal aus verwenden zu können, müssen wir der Pfadvariablen einen Ordnerpfad hinzufügen. Okay? Also gehen wir zurück zu dieser Liste. Wir klicken auf Neu und fügen C Program Files hinzu. Gut. Also haben wir OK geklickt, OK, OK. Jetzt starte ich das Terminal erneut. Und wenn ich jetzt Git Bash tippe, boom, bin ich in der Git Bash-Shell und es benutzt Minty. Wenn ich also hier auf Optionen klicke, siehst du das Logo von Minty. Es mag also sehr ähnlich aussehen, aber es wird tatsächlich wie die Windows-Standardkonsole verwendet. Aber das läuft im Minty Terminal Emulator. In Ordnung, wenn Sie möchten, können Sie hier verschiedene Optionen konfigurieren, Schlüsselauswahl, Windows Terminal. Das sind also alle Optionen und nur Fall, und das ist Git Bash. Wenn wir hier sehr einfache Linux-Befehle eingeben möchten, können wir dies beispielsweise tun, um alle Dateien in diesem Ordner aufzulisten. Okay, großartig, und das ist unsere Entropie der C-Benutzer. Das ist meins. Es wird dein Benutzername hier drüben sein. Wenn wir auf eine andere Festplatte gehen wollten, geben wir cd ein, um das Verzeichnis und dann den Namen der Festplatte zu ändern. Großartig, also geht es um Git Bash. Sie können es auch über das Ausführungsfenster im Start-Panel oder durch Drücken von Windows plus r ausführen und Git Bash eingeben. Und du bist drin. Das ist im Grunde genommen, das ist alles, was wir brauchen, um Git zu konfigurieren, okay, vielleicht ist eine weitere Option der Befehl Git config, oder? Wenn wir also bei Läsion zu Total gehen, spielt es keine Rolle, wann für Windows, für Linux spielt keine Rolle. Also hier müssen wir konfigurieren, unseren Namen und unsere E-Mail verwenden, oder? Kopieren Sie diesen Befehl einfach hier und fügen Sie ihn in Terminal ein. Und hier gib deinen Namen ein. Es kann dein richtiger Name sein, oder es kann dein Spitzname sein, was auch immer du tust. Drücken Sie also die Eingabetaste für Ihren Benutzernamen und dann dasselbe für E-Mail. Also was sind das? Diese werden in den Commit-Nachrichten sichtbar sein. In der guten Geschichte werden wir all das behandeln, aber das ist etwas, das andere Benutzer und Sie in Ihrer Projektgeschichte sehen werden, etwas Reales auswählen, das heißt, es wird im Grunde installiert Windows-Benutzer, Sie werden Bashes installiert. Im kommenden Video werden wir ausführlich darüber sprechen und wie es unser Leben erleichtern wird. Wir sehen uns dort. 6. Git sehen (Windows) ändern: Hey, zuerst möchte ich erwähnen, dass dieses Video nur für Windows-Benutzer gedacht ist. In diesem Video möchte ich mich mit dem Auftritt von Git Bash befassen. Lass mich dir zeigen, was ich meine. Wenn ich Git Bash starte. Ich mag es nicht, wie es aussieht. Ich möchte das heißt W 64 entfernen, ich möchte diesen Eintrag B in meinem Computernamen entfernen . Das brauche ich nicht alles. Dies ist völlig optional, aber es wird Ihre Entwicklererfahrung ein wenig angenehmer machen . Also lasst uns das ändern. Was wir tun müssen, müssen wir zuerst navigieren , um den Installationsordner zu erhalten. Also wird es für mich C sein, Programmdateien, gut. In diesem Ordner wollen wir ETC. Und Profil D wird hier nach einem guten Aufforderungspunkt SH suchen, und wir öffnen ihn mit jedem Texteditor. Ich öffne es mit Sublime Text. Und das wirst du sehen. Ich weiß, was völlig verwirrend sein wird und wir wissen nicht, was hier vor sich geht, aber keine Panik. Wir wollen sie nur entfernen oder vielleicht durch etwas anderes ersetzen. Um den Titel Ming W6 zu entfernen, Titel Ming W6 zu entfernen, werden wir anscheinend nach etwas mit Titel suchen. Dieses Dollarzeichen-Titelpräfix ist also genau für Ming W 64. Also entfernen wir es einfach von hier. Und wir entfernen auch den Doppelpunkt, entfernen dieses Semikolon aber nicht von hier, da dies Teil dieser Farbe ist , die im Grunde genommen als diese dargestellt wird. Also hier, lass mich meinen Spitznamen mit einem Pfeil setzen und lass mich die Datei speichern. Lassen Sie mich jetzt Git Bash neu starten. Also gehe ich wieder zum Run-Fenster Git Bash. Und jetzt boom, ich sehe meinen Spitznamen und und ich MACHE mich gerade ziemlich cool Jetzt möchte ich all das entfernen, was ich hervorgehoben habe. Also suche ich nach EMS-System. Ich entferne diese Zeile einfach komplett. Dann entferne ich den Benutzer beim Hostnamen. Und was ich gerne machen möchte, möchte ich den aktuellen Pfad hervorheben , der hier angezeigt wird. Wenn ich also zu sehen navigiere, habe ich es so, aber ich wollte es in Klammern stecken. Backslash w ist also das aktuelle Arbeitsverzeichnis. Also möchte ich es so in die Boxklammern stecken. Okay, und eine Klasse, was ich machen wollte, wollte ich vielleicht die Aufforderung vom Dollarzeichen auf einen Pfeil ändern . Also hier suche ich nach dieser Zeile. Okay, die Aufforderung wird immer ein Pfeil sein. Ich ändere es, ich habe die Datei gespeichert und jetzt sehen wir uns das Ergebnis an. Also starte ich noch einmal Git Bash neu. Und jetzt ist das unser letzter Auftritt. Wenn wir zu Disk D navigieren, haben wir es so. Ziemlich cool. Dies ist also auch völlig optional und das ist meine persönliche Präferenz, weil ich Einfachheit mag und mir gefällt, wie es aussieht. Und für mich sieht es aus meiner Sicht viel, viel besser aus als zuvor. Es liegt ganz bei dir, ob du es brauchst oder nicht. Aber das war's. Das wollte ich ansprechen. Wir sehen uns im nächsten. 7. Git (macOS) installieren: Hey, in diesem Video zeige ich dir, wie man Git unter Mac OS installiert. Navigiert zuerst zu Google und tippe git ein. Gehe zur ersten URL. Dies ist die offizielle Website. Klicken Sie auf Downloads und wählen Sie dann macOS aus. Sie werden einige Möglichkeiten sehen, wie Sie Git installieren können. Wir werden das mit Homebrew wählen. Homebrew ist Paketmanager. Es ermöglicht uns, verteilte Software mit einem einzigen Terminalbefehl herunterzuladen . Installieren Sie Homebrew, kopieren Sie den Installationsbefehl von der Website, gehen Sie dann zu Launchpad und führen Sie das Terminal aus, fügen Sie den Befehl ein und warten Sie, bis er installiert ist. Möglicherweise werden Sie auch zur Eingabe Ihres Passworts aufgefordert. Jetzt, da wir Homebrew haben, können wir Git einfach installieren, zurück zur Website navigieren und Homebrew installiert Git kopieren, das Terminal öffnen und den Befehl einfügen. Es dauert ein paar Sekunden, bis Homebrew installiert wird, in Ihr System gelangt. Wenn es heißt, dass Get bereits installiert ist, dann geht es Ihnen gut. Es liegt wahrscheinlich an Xcode. Und das war's. Tschüss. 8. VSCode (Windows) installieren: Hallo, In diesem Video werden wir den VS-Code und den Editor installieren , den wir während des gesamten Kurses verwenden werden. Warum zunächst VS Code oder Visual Studio-Code? Ich denke, ich persönlich denke, dass dies einer der besten Editoren und IDE ist , die für JavaScript-Projekte verfügbar sind. Wenn Sie mit einem anderen Editor, zum Beispiel Atom für die Entwicklung, vertraut sind , wenn Sie Vorkenntnisse haben, ihn gerne verwenden. Aber beim Training rate ich seinen Raketen aufgrund seines Plug-In-Systems Pseudocode und ist einfach bequem. Okay, also lasst es uns installieren. Was wir tun müssen, ist wie immer zu Google zu gehen und VS Code einzugeben. Und es bringt uns auf die offizielle Website. Also schlage ich vor, die Docs-Seite zu öffnen und nicht auf die Seite zu schauen. Auf der Download-Seite haben wir also Installer für drei verschiedene Betriebssysteme, Windows, Linux und macOS. Für Windows ist es also ziemlich einfach, oder? Sie klicken auf das Installationsprogramm und es startet den Download, okay, für Linux und macOS rate ich, zur Docs-Seite zu gehen und dann je nach Betriebssystem zum entsprechenden Abschnitt zu gehen. Für Linux ist es also auch ziemlich einfach. Abhängig von Ihrer Linux-Distribution gibt es Hunde, die Sie lesen und sehen können , wie Sie NodeJS installieren müssen. Ich meine, wie genau werden Sie das machen, weil die Befehle je nach Ihrer Distribution unterschiedlich sein werden. Okay, also behandle einfach die Hunde. Vertrauen Sie mir, das ist ziemlich einfach und im Grunde das Gleiche für Mac OS. Das ist ein einfacher Weg. Du bekommst das Installationsprogramm und ziehst es einfach in dein Launchpad. Das war's. Und VS Code gilt als installiert. Okay, also für Windows haben wir den Installer. Wir starten es. Dieser Benutzer wollte uns erden und sagte: Oh zahlen. Also in Also ja, ich möchte weiterlaufen. Okay. Ich schließe es. wirst du nicht sehen. Okay. Also bin ich hier. Ich wollte akzeptieren. Sie können den Pfad ändern, wenn Sie dies als Standardinstallation wünschen. Dies ist auch in Hunde geschrieben. Du kannst hier darüber nachlesen. Also wo ist es? Okay, es ist hier. Jetzt klicken wir auf Weiter. Als Nächstes. Jetzt müssen wir hier zwei Pfad auswählen, die standardmäßig ausgewählt sind, aber stellen Sie sicher, dass er vorhanden ist. Registrieren Sie Code als Zusatzstoff für unterstützende Dateitypen. Ja, dies wird empfohlen, ausgewählt zu werden. Dies ist optional und wenn Sie ein Desktop-Element erstellen müssen, dann klicken Sie auf Installieren. Danach dauert es einige Zeit und boomt, Sie sehen VS-Code auf Ihrem Desktop. Danach starten Sie es und landen in einem solchen Fenster, das Thema wird anders sein, aber es spielt keine Rolle. Vscode ist jetzt installiert. Wie konfiguriere ich mit SQL-Code und wie installiere ich Plugins. Alles wird im nächsten Video behandelt. Wir sehen uns dort. 9. VS-Code (macOS) installieren: Hallo, In diesem Video zeige ich Ihnen, wie Sie VS-Code auf macOS installieren, zur Google-Suche gehen und Fiasko eingeben, dann auf den Download-Button klicken und Sie zur Download-Seite gelangen. Klicken Sie auf das macOS-Installationsprogramm. Es wird automatisch mit dem Download für Sie gestartet, warten Sie, bis es fertig ist. Und das hat die Datei geöffnet, in der Sie den VS-Code sehen. Ich kann eine Verknüpfung ausführen, einfach das Symbol auf Anwendungen direkt danach ziehen und ablegen , VS-Code gilt als installiert und Sie können darauf zugreifen, indem Sie zum Mittagessen gehen, aber dann nach VS-Code suchen, öffnen und überprüfe, dass alles in Ordnung ist. Und das ist alles. Siehst du im nächsten. 10. VSCode und Erweiterungen: Hey, in diesem Video möchte ich über VS-Code sprechen, wie wir den VS-Code konfigurieren und was wir tun müssen, um uns während der Entwicklung wohl zu fühlen. Lass uns gehen. Das erste, was ich vorstellen möchte, ist die VS-Code-Suchleiste, da es erstaunlich ist, die Suchleiste zu öffnen. Ich drücke Control P. Und es bringt mich hierher. Ich kann hier alles eingeben, was ich will, aber es wird keine übereinstimmenden Ergebnisse liefern, da es versucht, Defiles im aktuellen Projekt nachzuschlagen. Aber da wir im Moment, in dem ich geöffnet habe, kein Projekt haben , gibt es keine übereinstimmenden Ergebnisse. Was ich stattdessen tippen möchte, ist Pfeil nach rechts. Indem Sie ganz am Anfang den Pfeil nach rechts eingeben. Es bedeutet, dass ich integrierte VS-Code-Befehle oder VS-Code-Optionen verwenden möchte integrierte VS-Code-Befehle oder VS-Code-Optionen , um möglicherweise düster zu navigieren. Wenn ich zum Beispiel Pfeil und dann Einstellungen JSON eintippe, gibt es mir Einstellungen geöffneten Einstellungen chasten. Lassen Sie mich darauf klicken und es bringt mich zu den Einstellungen JSON-Datei. Einstellungen JSON-Datei ist also im Grunde genommen als Code-Benutzerkonfigurationsdatei. Hier müssen wir nur verschiedene Befehle eingeben, um Erweiterungen zu konfigurieren, einige Tools oder was auch immer zu konfigurieren. Als erstes wollte ich hier platzieren, lass mich den Browser öffnen. Und hier habe ich diese Datei, diese Codekonfiguration. Sie haben diese URL und vielleicht schon, wie sie geteilt wird. Also öffne es einfach. Und von hier aus nehme ich das Fenster des IS-Sicherheitsvertrauens. Und ich werde es einfach so hier platzieren. Und was es tut, deaktiviert das Sicherheitsfenster, aber keine Panik. Was ist ein Sicherheitsfenster? Nun, VS-Code wird Sie oft fragen, vertrauen Sie dieser Umgebung oder vertrauen Sie diesem Ordner? Und vertrau mir, das ist sehr nervig, dieses Fenster zu deaktivieren. Kopieren Sie einfach diese Option und Sie werden dieses Fenster nie sehen. Schon wieder. Wenn Sie neugierig sind, können Sie diese Codezeile jederzeit auskommentieren und selbst sehen. Aber ich behalte es so wie es ist. Jetzt für eine Sekunde. Ich werde die zweite Option verlassen und ich werde von hier aus einfach die allerletzte Option wählen, bei der es um Prediger geht. Was ist Prediger? Pre-Clear ist ein Tool, das wir im kommenden Video ausführlich behandeln werden . Prediger wird es unseren Code bilden, wenn wir Dateien speichern, diese Zeile stellt sicher, dass unser Code formatiert wird, wenn wir auf Speichern klicken . In diesem Schritt ist VS Code grundsätzlich bereits konfiguriert und Sie können sofort mit Entwicklungsversuchen beginnen. Aber eine Sache, die ich erwähnen möchte, ist das integrierte VSCode Terminal. Wenn ich also auf das Terminal klicke und auf ein neues Terminal klicke, öffnet es PowerShell für mich, weil ich unter Windows bin. Wenn Sie unter Linux oder macOS sind, sehen Sie Bash für Linux- und macOS-Benutzer, das ist in Ordnung. Aber für Windows-Benutzer wir seit der Installation von Git Bash verwenden wir seit der Installation von Git Bash Git Bash und nicht PowerShell oder Cmd, da VS Code und Windows standardmäßig PowerShell verwendet. Was müssen wir also tun? Wir müssen zu dieser Datei zurückkehren und diese Konfiguration kopieren und mich am Ende hier platzieren lassen. Was es also tun wird, wird VSCode anweisen, Git Bash als integriertes Terminal zu verwenden . Es ist nicht anders, als würden Sie es außerhalb von VSCode öffnen. Es ist einfach praktisch, alles an einem Ort zu verwenden, insbesondere Werkzeug wie Terminal. Ich habe alle diese Optionen kopiert, wenn der Pfad für Sie anders ist, ersetzen Sie ihn einfach nach demselben Muster. Und lass es uns schließen und dann lass es uns wieder öffnen. Und lasst uns überprüfen, dass wir jetzt Git Bash verwenden. Das heißt, Windows-Benutzer Glückwunsch, wir verwenden Git Bash. Nun, das Letzte, worüber ich in diesem Video sprechen möchte, und ich würde sagen, das Wichtigste VS-Code-Erweiterungen. In Ordnung? Was ist also VS-Code-Erweiterungen? Dies sind alles optionale Tools, die den VS-Code mit wirklich hervorragender Funktionalität ausdehnen . Um zu Extensions zu wechseln, klicken wir auf dieses Symbol im linken Bereich. Und hier habe ich schon 33 Erweiterungen installiert. Das ist viel, was ich weiß, aber keine Panik. Wir müssen nicht alle installieren. Was ich jetzt tun werde, werde ich schnell die Erweiterungen durchgehen, die meiner Meinung nach für unseren Kurs erforderlich sind. Und es liegt an Ihnen, ob Sie sie installieren möchten oder nicht. Um in der Suchleiste zu verkaufen und zu erweitern, geben Sie einfach den Erweiterungsnamen ein. Zum Beispiel bessere C Plus Plus-Syntax. Du klickst zum Beispiel auf die Erweiterung und klickst auf Installieren. Danach wird es installiert. Und es könnte Sie auffordern, den VS-Code neu zu starten, aber es ist sehr selten. Und übrigens brauche ich diese Erweiterung nicht, also werde ich sie einfach deinstallieren. Also gehe ich zurück zu Installierte Erweiterungen und lasst uns schnell nach ihnen suchen. Die erste Erweiterung, die ich erwähnen möchte , ist das Namensschild. Was es tun wird. Es wird einfach HTML umbenennen, Tag öffnen und schließen, während wir HTML eingeben. Das ist sehr nützlich. Ich empfehle dieses, Bracket Birne Color Riser. Ich denke, dies ist eine der Erweiterungen, die es installieren sollte da sie einfach die öffnende und schließende Klammer hervorhebt und dekodiert. Dies ist nützlich, weil es unseren Code lesbarer und unterscheidbarer macht . Ich kann diese Erweiterung nur wärmstens empfehlen. Als nächstes haben wir ES 7 React redux GraphQL React Native Snippets. Dies ist eine wichtige Erweiterung. Wir werden es oft nutzen , wenn wir React-Code schreiben. Also installiere es. Ich werde diese Verlängerung in Zukunft noch einmal erwähnen . Dann haben wir ES Fusseln. Wir werden ES Fusseln im kommenden Video ausführlicher behandeln . Stellen Sie jedoch sicher, dass Sie diese Erweiterung im Voraus installiert haben. Als nächstes haben wir Highlight-Matching-Tag. Genau wie es heißt, wird das passende HTML-Tag hervorgehoben, genau wie Sie darauf sehen. Vorschau. Ziemlich cool. Ich denke, es ist, es ist nützlich. Jetzt haben wir IntelliSense für CSS-Klassennamen. Nun, ja, es ist nützlich. Was es also tun wird, wird die automatische Vervollständigung für CSS-Klassennamen hinzugefügt , die in unserem Projekt definiert sind, ganz bei Ihnen. Als nächstes haben wir Material Icon Theme. Es wird nur diese Reihe von Symbolen zu den Dateien hinzufügen , die wir im Datei-Explorer hier im linken Bereich sehen werden. Ich benutze es und empfehle es jedem. Npm-Intelligenz. Dieser ist wichtig. Was es tun wird, wird eine äußere Vervollständigung für Pakete und Bibliotheken hinzufügen äußere Vervollständigung für Pakete und , die wir in Code importieren werden, dringend empfohlen. Als nächstes haben wir Pfadintelligenz. Im Grunde das Gleiche, aber für lokale Dateien. Daher importiert die automatische Vervollständigung für lokale Dateien. Dann haben wir Prediger, Prediger, ein Tool, das unsere Dateien formatiert. Also nochmal, wir werden das ausführlich behandeln, also stellen Sie einfach sicher, dass es installiert ist. Und die letzte Erweiterung wird in Anführungszeichen umgeschaltet. Das Zitat umschalten ist sehr einfach. Es schaltet im Grunde nur Anführungszeichen um. Wenn Sie beispielsweise hier lesen, müssen wir dies abhängig von Ihrem Betriebssystem drücken , um Anführungszeichen von Single zu Double, von Double auf Backticks umzuschalten . Lass es mich dir demonstrieren. Wenn Sie diese Tasten einfach irgendwo drücken, wird diese Meldung angezeigt, wird diese Meldung angezeigt dass das Ausführen des beigesteuerten Befehls fehlgeschlagen ist. Die Sache ist, dass Sie diesen Befehl nur in Anführungszeichen verwenden müssen. Ich muss meinen Cursor hier in einen Text mit Anführungszeichen setzen und dann die Kombination verwenden, um Anführungszeichen zu verdreifachen. Ich benutze es sehr persönlich und kann es jedem wärmstens empfehlen. Ich glaube, das war's. Ich habe alles abgedeckt, was ich wollte. Ich habe alle Erweiterungen erwähnt , die meiner Meinung nach wichtig sind. Ich habe dir alles über Einstellungen gegeben, JSON, weißt du, über integriertes Terminal. Ich persönlich öffne es mit Control plus J-Tastenbindung, nicht von hier aus. Und ja, das war's. Vielleicht ist noch eine Sache zu erwähnen das VSCode-Theme. Wenn Sie möchten, dass VS Code cool aussieht, suchen Sie nach einem Erweiterungsthema, okay, und wählen Sie etwas aus, das Ihnen gefällt. Ich persönlich mag das Firefox-Theme. Und ich habe es schon installiert. Also klicke ich einfach auf Farbthema einstellen, Firefox, dunkel und boom. Jetzt habe ich verschiedene Farben in meinem VS-Code. Ziemlich nett. Es hat auch ein leichtes Thema, wenn Sie interessiert sind. Okay, ich glaube, das ist alles. Wir sehen uns im nächsten. 11. Arbeiten – Teil 1: Hey, in diesem Video werden wir darüber reden, gut, los geht's. Zuallererst, was ist Git? Git ist ein Projektmanagement-Tool, das es uns ermöglicht , alle unsere Projektdateien im Auge zu behalten. Zum Beispiel werden wir viele Änderungen an unserem Quellcode vornehmen, wenn wir unsere Projekte entwickeln. Vielleicht dauert es ein Jahr. Vielleicht wird es zwei Jahre dauern, dieses Projekt zu entwickeln. Nach einem Jahr werde ich mich wahrscheinlich nicht erinnern, was ich in der Vergangenheit gemacht habe, wie Angst vor mir war. Und um diese Projektgeschichte zu haben, existiert Gutes. Es wird uns ermöglichen, zu sehen, welche Änderungen wir vorgenommen haben was genau bei diesem speziellen Schritt schief gelaufen ist. Vielleicht möchten wir etwas ändern. Vielleicht möchten wir mit anderen Menschen einen Beitrag leisten und um all das zu bewältigen, existiert Gutes. Lasst uns das alles in der Praxis sehen. Zuerst erstelle ich einen neuen Projektordner. Ich öffne bereits den VS Code. Jetzt müssen wir einen Projektordner öffnen. Ich klicke auf Ordner öffnen. Dann gehe ich zu einem Ordner, in dem ich einen anderen Ordner erstellen möchte. Dies wird mein Testprojekt sein und ich werde es in VS Code öffnen. Großartig. Öffnen wir nun das integrierte Terminal. Ich drücke Control plus j. Und es wird Git Bash für mich öffnen. Und wie Sie sehen können, befindet es sich bereits im Projektordner. Großartig. Jetzt müssen wir zuerst gut in diesem Projektordner initialisieren . Um das zu tun, müssen wir Git eintippen. Und Sie werden sehen, dass diese Nachricht ein leeres Git-Repository in diesem Ordner initialisiert hat. Und wichtiger Punkt hier, dass es einen versteckten Ordnerpunkt erstellt einen versteckten Ordnerpunkt , um den versteckten Ordner anzuzeigen Wir müssen ls minus a eingeben. Es werden alle Dateien und Ordner im aktuellen Ordner angezeigt plus versteckte Ordner. So gut. Und wir können tatsächlich zu diesem Ordner navigieren , indem wir CD verwenden, um das Verzeichnis zu wechseln. Und dann können wir wieder ls eingeben , um alle Dateien und Ordner anzuzeigen. Und Sie können hier eine Reihe von Dingen sehen, aber wir interessieren uns nicht für sie. Wichtiger Punkt hier, dass alle unsere guten Projektdetails gelöscht werden, wenn wir diesen Ordner löschen wollen. Wenn ich also zurück zum Hauptordner navigiere, verwende ich CD und zwei Punkte, und jetzt lösche ich sie. Also gebe ich einen RAM als unseren F- und Ordnernamen ein, um alle Dateien und Ordner in gutem Zustand zu löschen und den Ordner selbst zu erhalten. Jetzt können Sie diesen Master sehen, Meistertitel ist hier verschwunden. Dies bedeutet, dass get jetzt vollständig aus diesem Ordner gelöscht wird. Jetzt lass mich noch einmal Git eintippen. Und Boom, gut, wird jetzt noch einmal initialisiert. Großartig. Was ist mit diesem Meistertitel hier drüben? Was ist das? Dies ist unsere derzeitige Niederlassung. Wir werden später über Filialen sprechen. Gerade jetzt. Konzentriere dich nicht darauf. Wir sind daran interessiert, sich selbst zu besorgen, was es tut. Was sind die Vorteile? Erstellen wir zuerst eine Datei hier drüben. Wir nennen es einen Dateipunkt TXT. Hier tippen wir hallo. Vielleicht wird das unsere Hauptprojektdatei sein, ziemlich dump, aber es wird den Trick machen. Um nun gut zu verwenden, können wir zuerst den Git-Status eingeben, um zu verstehen, was in diesem bestimmten Moment in einem guten Projekt vor sich geht . Sie können also noch keine Commits sehen. Wir befinden uns derzeit im Zweigmaster und wir haben eine Reihe von nicht verfolgten Dateien, um spezifischer zu sein. Für eine Datei, einige file.txt, nichts hinzugefügt werden, aber nicht verfolgte Dateien, die in guten Projektdateien vorhanden kann nichts hinzugefügt werden, aber nicht verfolgte Dateien, die in guten Projektdateien vorhanden sind, in drei verschiedenen Zuständen sein. erste Status ist nicht nachverfolgter Zustand, zweite Status ist der Stufenstatus. Der dritte Status ist, wenn Dateien festgeschrieben werden. Moment befinden wir uns im unverfolgten Zustand. Was heißt das? Es bedeutet, dass wir erkannt werden, dass wir einige neue Dateien in unserem Projekt haben, aber sie sind noch nicht Teil dieses guten Projekts. Um diese Dateien hinzuzufügen, um sie wissen zu lassen, dass wir diese Dateien verfolgen möchten , um sie als Teil unseres guten Projekts aufzunehmen, müssen wir sie dem Stage-Status hinzufügen. Um das zu tun, müssen wir genau wie hier angegeben eingeben , git add file. Also können wir Git tippen, etwas file.txt hinzufügen. Ich habe die Tabulatortaste zur automatischen Vervollständigung Also tippe ich einfach eine Datei ein, etwas F, dann drücke die Tabulatortaste und es ermöglicht mir, den Dateinamen für mich zu vervollständigen. Aber ich kann auch git add dot machen, um alle Dateien in diesem Ordner zum Bühnenstatus hinzuzufügen . Der Punkt repräsentiert also alle Dateien im aktuellen Verzeichnis. Ich benutze diesen Befehl, weil er kürzer ist. Git fügt Punkt hinzu. Jetzt können Sie sehen, wie sich die Farbe in Blau geändert hat. Und was passiert. Geben wir noch einmal den git status ein, um zu sehen, was wir noch keine Commits haben, Änderungen, die übernommen werden müssen. Jetzt können Sie sehen, dass wir eine neue Datei haben, einige file.txt. Großartig. Das bedeutet, dass sich unsere Akte im Bühnenzustand befindet. Und da wir VS Code verwenden, hat VS Code die Git-Integration integriert und der Zerfall ist ein wirklich leistungsfähiges Werkzeug. Deshalb haben wir hier auf der linken Seite dieses Symbol mit einer Nummer darin. Lasst uns darauf klicken. Diese Registerkarte stellt also die Integration von Get dar. Sie können also sehen, dass wir hier zwei Dropdowns haben, inszenierte Änderungen und Änderungen. Sie können sehen, dass jetzt unsere Summe file.txt innerhalb von inszenierten Änderungen. So können Sie links sehen, was vorher war, und rechts mit Grün, was hinzugefügt wurde, da es sich um eine neue Datei handelt, sehen wir links nichts und Rot. Wenn Sie mit all diesen guten Befehlen zu kämpfen haben mit all diesen guten Befehlen oder ich es nicht weiß Aus irgendeinem Grund fällt es Ihnen schwer, sich an alle zu erinnern. Du könntest hier immer die Git-Integration nutzen. Wenn ich also hier auf Minus klicke, wird diese Datei aus dem Stagestatus gelöscht und sie wird wieder in den nicht verfolgten Zustand versetzt. Wenn ich nun den Git-Status, das Terminal erneut, tippe , können Sie nicht verfolgte Dateien sehen , einige file.txt. Wenn ich diese Datei nun zum Bühnenstatus hinzufügen möchte, klicke ich einfach auf das Pluszeichen. Boom, es ist, es ist, es ist wieder inszeniert. Großartig. Was ist der Stage-Status? Nun, dieser Stufenzustand ist im Grunde die vorbetriebliche Phase, in der Dateien übernommen werden können. Was ist ein Commit? Ein Commit ist nur ein Datensatz in der Git-Historie und stellt Änderungen dar, die am Projekt vorgenommen wurden. Jetzt verpflichten wir uns diese Datei in unsere gute Geschichte. Was wir also tun können, können wir git commit eingeben und dann müssen wir minus M für Commit-Nachricht eingeben. Und wir geben etwas file.txt hinzu. Ich führe diesen Befehl aus. Und Sie werden den behandelten Modus sehen, eine Datei geändert, eine Einfügung, großartig. Und alle Änderungen auf der linken Seite sind verschwunden. Das ist in Ordnung. Wenn wir nun erneut den git status eingeben wollen, werden Sie nichts sehen, was Sie verpflichten müssen. Das liegt daran, dass Commit eine Waffe ist. Es ist schon in der Vergangenheit. Good verfolgt alle unsere Commits, die wir in der Vergangenheit gemacht haben. Um den Git-Verlauf und das Terminal anzuzeigen, müssen wir Git-Log eingeben. Wir haben ein Commit, das wir edit some file.txt genannt haben. Datum ist dies und der Autor, mein Nickname und meine E-Mail und Commit Hash auf Master Branch. Nehmen wir an, ich möchte dieser Datei neue Änderungen hinzufügen. Ich werde einfach weitermachen und diese Datei ändern. Ich gebe etwas Dumped ein und speichere die Datei. Auf der linken Seite sehen Sie, dass wir wieder neue Änderungen an der Datei haben . Und das haben wir hinzugefügt, das hatten wir vorher. Jetzt sind die gleichen Schritte. Wir müssen zuerst diese Änderungen oder die Datei hinzufügen, die den Stage-Status geändert wurde, oder? Und danach können wir diese Datei festschreiben. Denn wenn ich jetzt Git Commit mache und etwas tippe, wird eine Fehlermeldung angezeigt. Nun, es ist keine Fehlermeldung, aber es wird nichts festschreiben, da Good nur inszenierte Dateien festschreiben kann. Zum Beispiel, wenn ich eine neue Datei erstelle, test.js und ich tippe, ich weiß nicht, sehr grundlegende Sache in JavaScript, Konsolenprotokoll. Hallo. Ich gehe zurück zu diesem Tab. Ich gebe den Git-Status ein. Sie werden sehen, dass eine Datei geändert wird, eine Datei wird nicht verfolgt. Jetzt möchte ich all diese Akten inszenieren. Ich werde Git Add Dot machen. Und Sie werden sehen, dass sie alle jetzt inszeniert sind. Und wenn ich git commit tippe, werden diese inszenierten Dateien dem neuen Commit hinzugefügt. Alles klar? Was ist jedoch, wenn ich nicht möchte, dass alle diese Dateien festgeschrieben werden? Vielleicht habe ich diese Datei erstellt, aber ich bin noch nicht bereit, sie zu verpflichten. Ich möchte nur diese Änderungen an der Geschichte übernehmen. Also was ich tun werde, werde ich test.js aus diesem Bühnenzustand entfernen und ich werde nur eine Datei in diesem Stadium belassen. Wie ich bereits sagte, begeht Git nur inszenierte Dateien. Wenn ich also git commit tippe und ich werde einige file.txt eingeben. Ich führe es aus. Sie werden sehen, dass der Test einfach bleibt, weil er immer noch nicht verfolgt und nicht festgeschrieben ist. Und wenn ich Git log tippe, werde ich jetzt sehen, dass ich die Note verpflichten muss. Wenn ich jetzt test.js hinzufügen möchte, tippe ich erneut git add dot, dann git commit. Und ich tippe edit, test. Ja, cool. Wieder viel Glück. Und ich habe meine Git-Geschichte da drüben. Das ist es, was gut tut. Es ermöglicht uns, diese Projekthistorie durch Commit-Nachrichten zu erstellen . Aber okay, das scheint nützlich zu sein, aber ich sehe hier nicht den Hauptpunkt, um alle Dateien zu sehen, alle Änderungen, die Sie vorgenommen haben um Projekt zu erhalten, oder verschiedene Befehle, wie zum Beispiel gute Show. So können wir git show eingeben und dann Hash festschreiben , um die an diesem bestimmten Commit vorgenommenen Änderungen anzuzeigen . Also werde ich das einfach kopieren und eine gute Show Cash-Nachricht abgeben. Wir haben dieses Commit. Das ist der Unterschied. In der Datei. Einige file.txt haben wir eine Zeile bearbeitet und die zweite Zeile bearbeitet. Das ist es. Jetzt stimmte ich zu, dass dies nicht bequem ist, alles durch das Terminal zu sehen. Aus diesem Grund gibt es viele VS-Code-Erweiterungen, die wir installieren können , um diesen Prozess zu visualisieren. Wenn ich also Git in der Erweiterungssuche eintippe, wirst du viele verschiedene Erweiterungen wie gute Geschichte sehen , Land bekommen, gutes Diagramm. Und alle von ihnen werden dir helfen, mit dem Guten zu arbeiten. Sie ermöglichen es Ihnen, Ihre Kit-Entwicklung so komfortabel wie möglich zu visualisieren, wiederzuverwenden und zu gestalten. Ich persönlich verwende keines davon, weil ich denke , dass diese Integration mehr als genug ist und der Rest auf GitHub weitergehen wird. Im zweiten Teil werden wir über den GitHub sprechen. Github ist damit verwandt, was GitHub ist. alles wirst du im nächsten Video wissen. Wir sehen uns dort. 12. Arbeiten – Teil 2: Hi, Willkommen im zweiten Teil der guten Serie. In diesem Video werden wir über GitHub sprechen. Was ist GitHub und warum brauchen wir es? Lassen Sie uns daran denken, ich habe das kleine gute Projekt aus dem ersten Teil, in dem ich zwei Dateien und ein paar Commits im Terminal Wenn ich Log bekomme, kann ich die Git-Geschichte dieses Projekts anzeigen. Nun, die Frage ist, was passiert, wenn ich diesen Testprojektordner von meinem PC lösche, wird mein Projekt komplett verschwunden sein? Und die Antwort auf diese Frage wird tatsächlich GitHub sein. Es wird uns zu Hilfe kommen. Github ist ein Hosting-Service für gute Projekte, genau wie wir Hosting für Websites haben, ist GitHub ein Hosting-Service oder Plattform für gute Projekte. Wenn ich zu Google gehe und nach einem GitHub suche, bringe ich das auf die offizielle Website. Wenn Sie noch kein GitHub-Konto haben, schlage ich vor, bereits eines zu erstellen . In diesem Moment habe ich mich bereits angemeldet. Ich möchte erwähnen, dass es einige andere beliebte Hosting-Dienste für gute Projekte gibt , wie zum Beispiel Git Lab oder vielleicht Bitbucket. Der Unterschied zwischen ihnen liegt in Funktionen und Integrationen, die sie Ihnen geben. Github ist der gebräuchlichste. In Ordnung, jetzt haben wir unser GitHub-Konto hier und möchten unser gutes Projekt, das wir lokal auf unserem PC haben, auf GitHub hosten das wir lokal auf unserem PC haben . Wie können wir das machen. Also müssen wir zuerst ein Remote-Repository auf GitHub erstellen. Wenn ich auf das Pluszeichen und die obere Ecke klicke und auf neues Repository klicke, wird ich aufgefordert, meine neuen Repository-Details einzugeben. Ein Repository ist im Grunde ein Projekt okay, das Sie auf GitHub setzen. Repository bedeutet also Projekt, aber auf GitHub, also wird mein Repository-Name mein Projekt sein. Ich lasse die Beschreibung leer Repository-Sichtbarkeit , dass es sich öffentliches und privates Repository handelt. Wenn Sie sich für öffentlich entscheiden, Ihr Repository für alle sichtbar, aber nur autorisierte Personen können zu diesem Repository beitragen wenn es privat ist, niemand wird es jemals erfahren und sehen dieses Repository. Wählen wir also privat aus klicken wir dann auf Repository erstellen. In diesem Schritt haben wir ein neues Projekt auf GitHub erstellt. Jetzt müssen wir stundenlanges lokales gutes Projekt, das wir auf unserem PC haben, mit einem Remote-Repository auf GitHub verknüpfen . Wir können es auf zwei Arten tun, entweder über HTTPS oder über den SSH-Tunnel. Ssh ist eine verfügbare Option, aber GitHub empfiehlt HTTPS, da es einfacher und einfacher einzurichten ist, verwenden wir HTTPS. Sie können bereits feststellen, dass GitHub einige Schritte vorschlägt, wie wir unseren lokalen Code oder unser lokales Projekt mit dem Remote-Repository verknüpfen können unseren lokalen Code oder unser lokales Projekt mit dem Remote-Repository verknüpfen . Wir werden dem zweiten Schritt folgen, um ein vorhandenes Repository zu verschieben, da unser lokales gutes Projekt als lokales Git-Repository bezeichnet werden kann . Kopieren wir einfach den ersten Befehl von hier und legen ihn ins Terminal. Was fügt Git Remote den Ursprung hinzu? Führen wir zuerst diesen Befehl und schauen wir uns an, was passieren wird. Nichts wird gedruckt und das ist vollkommen in Ordnung. Aber jetzt weiß unser lokales gutes Projekt über dieses Remote-Repository Bescheid. Wir können überprüfen, dass Sie durch Eingabe von git remote dash v Ursprung sehen und Sie sehen Repository-URL, die wir von hier kopiert haben. Es ist auch hier erhältlich. Schauen wir uns diesen Befehl noch einmal an. Also haben wir Git Remote Add. Dies ist der Befehl, unsere Repositorys zu verknüpfen. Origin ist der Name eines Alias , den wir dieser URL zuweisen, da es einfacher ist, immer auf Nickname oder Alias anstelle von URL zu verweisen , der Ursprung war. Dies ist der gebräuchlichste Name. Okay. Was müssen wir nun tun, um unsere lokalen Dateien beim Hosting zu applaudieren, wir müssen Git Push als den Alias machen, den wir mit unserer Repository-URL verknüpft haben , der Ursprung und der Name von Zweig, die wir bereitstellen möchten. Also Git Push Ursprungs Master. Wenn wir wieder öffnen und Git Hub, werden wir sehen, dass es einen guten Zweig Main und dann Git Push Origin main vorschlägt , da ich diese Aufregung bereits vor etwa einem Jahr erwähnt habe, dass die Community sich verschieben möchte Standard-Zweigname von Master zu Main, aber wir werden jetzt weiterhin Master verwenden. Also werden wir Git Push Origin Master anstelle von Git Push Origin Main verwenden . Ich führe es aus. Und Sie werden sehen, dass ein neuer Zweig für diese URL-Rate erstellt wurde . Kommen wir zurück zu GitHub, aktualisieren die Seite und boomen, wir können sehen, dass hier alles sichtbar ist. Was wir also auf GitHub machen können. Github, wir können unsere völlig gute Geschichte sehen. Wir können alle Dateien sehen und wir können zu dem Zeitpunkt sehen, als dieser Befehl für diese Datei erstellt wurde, okay, also vor drei Stunden war das neueste Commit für diese Datei und für diese Datei auch für Tests, ja, wir können klicken auf Dateien, um den Inhalt anzuzeigen. Wir können tatsächlich auf Commits klicken, um zu sehen, welche Änderungen an diesem Commit vorgenommen wurden. Für die Bearbeitung einer Datei, die erneut festgelegt werden soll, haben wir diese Zeile geändert oder entfernt und diese beiden Zeilen hinzugefügt. Grün ist das, was hinzugefügt wurde. Rot bedeutet etwas, das entfernt wurde. Kommen wir zurück zum Repository. Wir können auch die vollständige gute Historie anzeigen , indem wir auf diesen Button klicken. Und wir können sehen, dass wir drei Commits haben. Wir können das Repository an dieser Stelle im Verlauf durchsuchen . Wenn wir klicken, können wir an dieser Stelle sehen dass es nur eine Datei gab. Kommen wir noch einmal zum Hauptrepository zurück und beantworten die Hauptfrage, warum brauchen wir GitHub? Wir brauchen GitHub, um mit anderen Menschen zusammenzuarbeiten oder unser Projekt tragbar zu machen. Was ich meine ist, dass wir diesen Testprojektordner versehentlich auf unserem lokalen PC verlieren. Aus irgendeinem Grund existiert es einfach nicht. Unser Projekt existiert jedoch auf GitHub. Was wir also tun können, können wir unser Projekt nicht von GitHub laden und es in unseren lokalen PC legen, indem wir auf diesen grünen Button klicken, wir haben hier ein paar Möglichkeiten. Wir können zip herunterladen oder klonen. Wenn wir also auf Zip herunterladen klicken und wenn wir diese Zip öffnen, sehen Sie alle darin enthaltenen Dateien. Das ist also eine Möglichkeit. Die zweite Möglichkeit besteht darin, dieses Repository mit der CLI zu klonen. Also wählen wir eine HTTPS-Verbindung. Wir werden diese URL kopieren. Und nun nehme an, dass mein Testprojekt hier nicht auf dem PC existiert. Ich hab es verloren. Wenn ich es also wiederherstellen oder zurückholen wollte, mache ich Git-Klon und dann die URL, die ich kopiert habe. Also wird es kopiert, es wird einen neuen Ordner namens mein Projekt erstellen und alle Dateien darin ablegen. Wenn ich meinen Projektordner inspiziere, siehst du etwas file.txt und test, ja. Aber auch wenn ich in meinen Projektordner gehe und wenn ich leider F mache, um versteckte Dateien anzuzeigen, wird es hier einen weiteren Git-Ordner geben. Dies liegt also daran, dass beim Klonen eines Repositorys bereits ein guter Ordner mit Git-Setup geliefert wird. Stellen Sie sich vor, dass Testprojekt auf diesem PC nie existiert hat. Ich klone das Repository mit HTTPS und Git-Clon. Und jetzt ist mein Git-Setup bereits abgeschlossen. Ich kann einfach zu diesem Projektordner navigieren und alles ist bereits vorhanden. Setup für mich. Ich kann jetzt weiterhin neue Commits machen, einige Änderungen vornehmen und dann erneut auf GitHub hochladen, lass mich meinen Projektordner löschen. Ich brauche es eigentlich nicht. Ich navigiere zurück. Jetzt. Wie kann ich mich tatsächlich weiterentwickeln, sobald ich mein Projekt auf GitHub habe? Das ist eine gute Frage. Nun, genau wie zuvor, wenn ich neue Änderungen am Projekt vornehmen muss, werde ich einfach meine Änderungen vornehmen. Vielleicht füge ich eine weitere Zeile mit Hallo zwei hinzu und speichere sie. Jetzt, wie Sie sich erinnern, habe ich Änderungen nicht verfolgt. Wenn ich den git status eintippe, sehen Sie, dass diese Datei geändert wurde. Also muss ich diese Datei wieder zum Bühnenstatus hinzufügen. Ich werde Git Add Dot setzen. Sie werden es hier sehen, es erscheint jetzt in inszenierten Änderungen und jetzt kann ich es verpflichten. Also hat Git Commit Hallo zwei hinzugefügt. Wenn ich jetzt Git log tippe, kann ich oben ein neues Commit sehen. Jetzt habe ich vier Commits, aber wenn ich zurück zu GitHub gehe, sehe ich es hier nicht, weil GitHub und Git nicht magisch miteinander synchronisiert sind. Wann immer Sie neue Änderungen an Ihrem PC vornehmen, sind diese lokal. Sie sind nur auf Ihrem PC verfügbar. Und wenn Sie sie beim Hosting sehen möchten, müssen Sie sie zum Hosting hochladen. Und um das zu tun, verwenden wir erneut Befehl git, push, Good Push und den Namen von LES und unseren Alias. Wir können überprüfen, dass mit git remote dash v unser Ls Ursprung ist, was zu diesem Repository führt, was korrekt ist. Also werde ich Git Push Origin machen und dann den Namen des Zweigs beherrschen. Jetzt sehe ich, dass meine Änderungen hochgeladen werden. Ich aktualisiere die Seite. Und vor einer Minute wurde hier ein anderes Komitee hinzugefügt , was richtig ist. Wenn ich auf diese Commit-Nachricht klicke, werden Sie sehen, dass diese beiden Zeilen genau das bearbeiten, was ich gerade getan habe. Und noch einmal die Hauptfrage beantwortet, was GitHub macht? Warum brauchen wir es? Github wird benötigt, um die Zusammenarbeit zwischen Menschen zusammenzuarbeiten und unser Projekt so portabel wie möglich zu gestalten. Im nächsten Video werden wir über Filialen und darüber sprechen , wie Menschen mit GitHub zusammenarbeiten. Wir sehen uns dort. 13. Arbeiten – Teil 3: Hi, willkommen im dritten Teil der guten Serie. Im letzten Teil haben wir unser lokales gutes Projekt erfolgreich auf GitHub eingesetzt . Und wir wissen, was GitHub ist. Es ist eine Hosting-Plattform für die Zusammenarbeit und wir verwenden GitHub, um das obere Projekt so portabel wie möglich zu gestalten. In diesem Teil werden wir diese Hauptkonzepte guter kalter Zweige entdecken . Und wir werden darüber reden, wie wir an GitHub zusammenarbeiten können . Lass uns gehen. Lasst uns zuerst über Zweige sprechen. Dieser geheimnisvolle Meisterzweig war von Anfang an hier. Aber was heißt das? Wenn wir Git Branch im Terminal eingeben, werden wir sehen, dass Sie nur Master haben, aber wir können so viele Zweige erstellen, wie wir möchten. Zweig ist also nur eine weitere Kopie unseres Projekts. Schauen wir uns das an einem Beispiel an. Lasst uns also einen neuen Zweig erstellen. Um einen neuen Zweig zu erstellen, müssen wir Git Checkout als minus b eingeben und dann den Namen des Zweigs, den wir erstellen möchten, nennen wir es mein Dash-Feature. Sie können sehen, dass Sie zu einem neuen Zweig wechseln. Mein Feature, ich tippe wieder Git Branch ein. Ich habe Master und ich habe mein Feature und eine Reihe von Master. Ich sehe jetzt mein Feature, das liegt daran, dass dies in diesem Moment mein aktiver Zweig ist. Was Sie hier sehen, ist Ihre derzeit aktive Niederlassung. Nun, was ist der Unterschied gerade, diese beiden Zweige sind gleich, aber nehmen wir an, ich möchte eine neue Funktion in meine App entwickeln, aber ich möchte meinen Hauptcode nicht berühren. Mein Hauptcode bleibt unverändert, aber ich wollte eine neue Funktion entwickeln. Hier kommen Niederlassungen ins Spiel. Mein Master-Zweig enthält also meine neueste App für den Code, der für die Produktion bereitgestellt wird. Es funktioniert gerade. Und gleichzeitig wollte ich ein neues Feature entwickeln. Also erstelle ich einen neuen Zweig namens mein Feature, und jetzt fange ich an, mich für diesen neuen Zweig zu entwickeln. Angenommen, ich bin in meinem Feature-Branch, ich erstelle ein neues Commit. Meine neue Funktion wird ein neues Konsolenprotokoll sein, das Hallo drei sein wird. In Ordnung? Jetzt übernehme ich diese Änderungen. Zuerst schiebe ich in den Stage-Status und dann mache ich ein neues Commit. Ich nenne es entwickelte mein neues Feature. Großartig. Wenn ich ein Git-Log mache, um den Verlauf anzuzeigen, kann ich meinen vorherigen Verlauf und dann mein neues Commit sehen, meine neue Funktion entwickeln. Großartig, aber wie ist es nützlich? Nun, wenn ich aus irgendeinem Grund zurück zu meinem Hauptcode wechseln und sehen muss, was da war. Ich kann jetzt zwischen Zweigen wechseln. Also setze ich Git Branch, um zu sehen welche Zweige eine Hälfte machen, und dann kann ich Git Checkout-Master machen, um zwischen Zweigen zu wechseln, aber diesmal ohne Minus B Flag. Jetzt bin ich zum Zweigmaster umgestellt. Und Sie können sehen, wie diese Änderung, die Dr. in meinem Feature-Branch vorgenommen hat, verschwunden ist. Dies liegt daran, dass diese Änderung Teil meines Feature-Branchs ist. Es hat keine Beziehung zum Master, denn wenn ich ein Git-Log einfüge, werden Sie sehen, dass ich dieses Commit nicht habe , dass ich es in meinem Feature-Branch freigegeben habe, im Master-Zweig, es ist völlig anders. Wie Sie sehen können, sind Master und mein Feature eine Art Kopien meines Projekts, die gleichzeitig existieren. Ich kann diese Zweige manipulieren, Ich kann diese Zweige manipulieren um verschiedene Funktionen zu entwickeln. Wie kann ich dieses Zweigkonzept tatsächlich nutzen, um es für mich oder für Leute, mit denen ich zusammenarbeite, nützlich zu machen . Angenommen, es gibt 10 Personen, die an demselben Projekt arbeiten und Personen in ein Repository einladen und zu Einstellungen gehen und den Zugriff verwalten müssen . Und hier laden Sie normalerweise Mitarbeiter ein. Personen, die Zugriff auf dieses private Repository haben, können also dieses private Repository haben, können Änderungen an diesem Repository vornehmen. Aber wenn das, alles, wenn alle Leute, die an einem Projekt arbeiten, in denselben Master-Zweig oder Hauptzweig drängen . Das wird ein bisschen durcheinander sein. Wir wollen es so strukturiert wie möglich gestalten, um unsere gute Geschichte sauber, lesbar und wartbar zu halten . Und um das zu tun, werden wir Filialen nutzen. Angenommen, unser Hauptcode befindet sich im Master Branch, der das neueste Commit hinzugefügt hat Hallo zu Ich bin eine andere Person, die irgendwo da draußen sitzt. Ich bin Mitarbeiter und erstelle einen neuen Zweig, mein Feature, das ich bereits erstellt habe, und ich habe etwas geändert. Ich möchte diese Änderungen an GitHub übertragen, und ich möchte diese Änderungen in den Hauptcode zusammenführen, sich wieder im Master-Zweig befindet. Was ich also tun muss, muss ich zuerst diesen Zweig schieben. Auf GitHub. Um das zu tun, werde ich Git Push Origin machen , weil dies unsere Aliens für das Repository sind. Wir erinnern uns an diesen Git Push-Ursprung, mein Feature. Warten wir eine Sekunde. Und jetzt ist es gedrängt und es schlägt sogar vor, dass wir eine Pull-Anfrage für mein Feature auf GitHub erstellen , indem wir sie besuchen. werden wir in einer Sekunde sprechen. Aber wenn wir zu GitHub zurückkehren, sehen wir bereits, dass mein Feature vor weniger als einer Minute kürzlich Pushs hatte. Vergleichen und ziehen Sie Request. Wenn ich die Seite aktualisiere, sehe ich jetzt zwei Zweige. Wenn ich hier klicke, habe ich den Standard-Zweigmaster und ich habe Ihre Zweige, meine Funktion aktualisiert es vor Minuten von mir und dem Hauptzweig der CEU vor Stunden von mir. Und hier kann ich sehen, ob ich schwebe, ich sehe ein Commit vor dem Master. Um diese Änderungen, die ich in meinem Feature-Branch habe, in den Master zu übertragen diese Änderungen, die ich in meinem Feature-Branch habe , muss ich eine Pull-Anfrage direkt auf GitHub erstellen. Ein Pull-Request ist diese Entwickleranfrage, wenn Sie Projektbetreuer bitten , Ihren Zweig in den Hauptzweig zusammenzuführen . Im Grunde möchten Sie also einen Beitrag leisten und möchten diese Änderungen in den Hauptcode übertragen. Wir klicken auf neuen Pull-Request. Wir werden es als entwickelt bezeichnen. Mein neues Feature wird einen Kommentar hinterlassen, dass ich gerade diese großartige Änderung vorgenommen habe. Und hier wählen wir das aus. Wir wollen pushen, wir wollen meinen Feature-Branch in Master zusammenführen. Dies sind alles die Commits, die ich in diesem Zweig gemacht habe. Ich kann so viele Commits wie möglich erstellen. Zum Beispiel, wenn ich ein anderes Commit hinzufüge, vielleicht console.log, hallo, nochmal, ich inszeniere diese Änderungen, ich verbinde sie erneut, neue Änderung. Wieder drücke ich, Good Push Origin, mein Feature. Die Zweigstelle wird aktualisiert. Selbst wenn ich bereits eine Pull-Request erstellt habe, habe ich sie noch nicht erstellt. Aber wie auch immer, also klicke ich auf Create, Pull, Anfrage. Und mal sehen, was wir hier haben. Zuerst sehen wir die Fähigkeit zum Zusammenführen überprüfen da es zu Konflikten bei diesen Änderungen kommen kann. Aber da wir keine Konflikte haben, ist es in Ordnung. Wir werden also unsere Pull-Requests hier sehen. Also was wird jetzt passieren? Ich bin die Person, die dort drüben sitzt und diese Pull-Anfrage erstellt, dann kommt Projektleiter oder Projektbetreuer herein und die Person, die für die Pull-Anfrage verantwortlich ist, geht hierher und es sieht das, hey, diese Person wollte diese Änderungen zusammenführen. Also klickt er auf diese Pull-Anfrage. Okay, großartig, dieser Typ hat diese großartige Veränderung gemacht. Oh mein Gott. Ich möchte diese Änderungen zusammenführen. Also führt diese Person diese Pull-Anfrage zusammen. Also wählt er hier eine der Optionen aus. Lassen Sie mich auf Merge Pull Request klicken und sehen, was passieren wird. Also füge Pull-Anfragen dieser Person zusammen, dieser Zweig hat meine neue Funktion entwickelt, Zusammenführung, Zusammenführung, Umfrageanfrage, erfolgreich aufgetaucht und Löschzweig geschlossen. Wir klicken auf diesen Zweig wurde gelöscht, Anfragen abrufen, zusammenführen. Wenn ich hier zu meinem Projekt zurückkehre, sehe ich Zusammenführungs-Pull-Anfragen von Sherlock 16, meinem Feature, und es ist jetzt Teil einer guten Geschichte. Wenn ich auf Commits klicke, sehe ich, dass ich zuerst diese beiden Commits habe , die ich in meinem Feature-Branch hatte. Und darüber hinaus habe ich eine weitere Commit-Merge-Pull-Anfrage. Jetzt wurden all diese Änderungen in meinem Feature-Branch dem Hauptcode zusammengeführt und sind hier verfügbar. So tragen Menschen normalerweise durch Pull Request One bei, all diese Änderungen sind auf GitHub. Wir werden Diskrepanzen haben, da wir sieben Commits im Master-Branch, in unserem lokalen Projekt sieben Commits im Master-Branch, im Remote-Repository, auf GitHub Wir haben immer noch meinen Feature-Branch. Und wenn wir mit Git Checkout Master zum Master gehen. Und wenn wir Git-Log machen, sehen wir, dass das neueste Commit hier hinzugefügt wird hallo zwei, während hier Pull-Anfragen zu eins zusammenführen. Um das zu beheben, müssen wir die neuesten Änderungen von GitHub in unseren lokalen Code herunterladen die neuesten Änderungen von GitHub in , um den Verlauf zu synchronisieren. Um dies zu tun, ist der Befehl Git Push sehr ähnlich, aber anstelle von git push verwenden wir git pull. Also wieder bekommen wir Pull als die Repository-Bereiche und dann den Namen des zu ziehenden Zweigs. Also wollen wir den Meister aus dem Ursprung ziehen. Ich führe es aus. Und du wirst das Tolle sehen, dass etwas passiert ist. Und wie Sie sehen können, sind jetzt alle meine Änderungen hier. Das neueste Commit wurde vorgestellt, hallo vier und ich, und jetzt habe ich Hallo in meinem Code. Ziemlich cool, um zu überprüfen, dass ich wieder git log. Und Sie sehen, dass ich übrigens mehrere Anfragen Bombe von Sherlock 16 habe mehrere Anfragen Bombe von Sherlock 16 , um diesen Zustand zu verlassen, wenn Sie, wenn die gute Geschichte überläuft, einfach q eingeben können und Sie zum Terminal bringen. In Ordnung, ich würde sagen, dass dies wahrscheinlich der Fall ist, so nutzen die Leute GitHub, um zusammenzuarbeiten. Das Modell wäre ein bisschen anders, wenn es sich ein öffentliches Repository handelt und Sie zu einem Open-Source-Projekt beitragen möchten . Aber das werden wir in dieser Serie nicht behandeln. Dies ist mehr als genug für uns, um zu verstehen, wie Git funktioniert und wie Menschen miteinander zusammenarbeiten. Also nochmal, ich werde den Flow normalerweise noch einmal wiederholen . Und wenn Sie eine neue Änderung erstellen möchten und an einem Projekt arbeiten. Zuerst erstellen Sie einen neuen Zweig, indem Sie git Checkout minus b und den Namen des Zweigs verwenden, es kann alles sein. Okay, also diese Kopie, dieser neue Zweig wird aus dem Zweig erstellt , der zum Zeitpunkt der Ausführung dieses Befehls aktiv war. Dieser Zweig enthält jetzt alle Commits, die Sie beim Ausführen dieses Befehls hatten . Okay, Sie entwickeln weiter Conduct Branch, führen Sie so viele Commits aus, wie Sie zum Vervollständigen der Funktion benötigen. Dann schieben Sie diesen Zweig mit gutem Push zu GitHub. Dann erscheint es im Repository. Dann gehen Sie zu Ihren Pull-Requests und erstellen eine neue Pull-Anfrage, um Zweig, den Sie gerade auf GitHub veröffentlicht haben, mit dem Hauptcode in den Hauptzweig zusammenzuführen gerade auf GitHub veröffentlicht haben, mit dem Hauptcode . Und dann wird eine verantwortliche Person kommen und das sehen, Hey, der Typ möchte diesen Zweig mit dem Hauptcode zusammenführen. Und sobald diese Pull-Anfrage zusammengeführt oder akzeptiert wurde, werden Ihre Änderungen in den Hauptcode zusammengeführt. Danach muss jeder, der an einem Projekt arbeitet, die neuesten Änderungen aus dem Hauptzweig ziehen neuesten Änderungen aus dem , indem er den Befehl git pull verwendet. Und das war's. Dies ist der grundlegende Fluss von Git und GitHub Zusammenarbeit Glückwunsch. Ich denke, das ist unsere fertige für gute Serie, und wir sehen uns in der nächsten. 14. Node.js (Windows) installieren: Hi, In diesem Video werden wir Node.js unter Windows installieren. Was ist NodeJS und warum brauchen wir es, wird im nächsten Video erklärt. Was wir tun müssen, ist einen beliebigen Browser zu öffnen und zu Google zu gehen. Und Google wird nach keiner GS suchen. Der erste Link wird die offizielle Website sein. Hier müssen zwei Versionen heruntergeladen werden, LTS und aktuelle Version. aktuelle Version ist die neueste Version, die zum Download zur Verfügung steht, und LTS ist die neueste stabile Version. Wir müssen es nicht zu kompliziert machen. Darum kriegen wir LTS. Klicken Sie auf diesen und öffnen Sie dann das Installationsprogramm. Warte ein bisschen und klicke auf „Weiter“. Ja, ich akzeptiere Next, ändere den Pfad, wenn nötig. Als nächstes brauchen wir bei diesem Schritt keinen GS-, NPM- und Einstellungspfad. Als Nächstes haben wir in diesem Schritt Tools für native Module, und wir möchten diese Option auswählen. Was ist das und warum brauchen wir es? Genau wie es heißt, müssen einige NPM-Module bei der Installation von CC plus plus kompiliert werden . Was heißt das? Dies bedeutet, dass es einige Bibliotheken, Module oder Pakete gibt, die wir während unserer Entwicklung installieren werden , die einige native Binärdateien erfordern , die spezifisch für das Betriebssystem sind, in unserem Fall Windows. Die Tools, mit denen diese glatten Muskeln kompiliert werden , sind Python- und Visual Studio-Build-Tools. Diese Option wird sie also einfach installieren wenn sie jetzt fehlen, oder? auf Weiter und klicken Sie auf Installieren. Ich klicke nicht auf Installieren, da ich bereits kein GS installiert habe. Aber für dich wird das passieren. Wenn Sie auf diese Schaltfläche klicken, wird ein neues CMD-Fenster angezeigt. Und es wird so etwas sehen , wie wir es tun werden und diese Reihenfolge installieren , dass wir diese Anzahl an Speicherplatz benötigen. Schließen Sie einfach dieses Fenster und danach wird ein anderes Fenster geöffnet, nämlich das PowerShell-Fenster. Und es wird das gesamte Installationsprotokoll geben. Warte also einfach etwas, bis es fertig ist und dann geht's dir gut. wird kein JS als installiert angesehen. Lassen Sie uns das jetzt überprüfen. Wie macht man das. Klicken Sie auf Start-Panel und suchen Sie nach cmd. Dann öffnen wir das. Und in CMT geben wir Node Space, Dash, Dash Version ein. Drücken Sie Enter und Sie sollten die Version sehen , die Sie gerade installiert haben. Es ist möglicherweise möglich, dass beim Eingeben von Node Dash, Dash Version, etwas wie der Knoten nicht als interner oder externer Befehl erkannt wird . Wir müssen also einen anderen Weg finden , um unsere Installation zu überprüfen. Um dies zu tun, müssen wir erneut zum Start des Panels gehen als zur Systemsteuerung. Und dann suchen wir nach Programmen und Funktionen, okay? Hier müssen wir überprüfen, dass wir keine GS in der Liste haben. Wenn Sie also kein GS in der Liste haben, werden Sie feststellen, dass Sie nicht als interner zusätzlicher Befehl erkannt werden. Dann müssen Sie eine kleine Anpassung Systemkonfiguration vornehmen. Was Sie also tun müssen, ist erneut auf das Startfeld im Suchtyp ENV zu klicken das Startfeld im Suchtyp ENV und die Systemumgebungsvariablen bearbeiten auszuwählen. Klicken Sie dann auf die Umgebungsvariablen. Und hier müssen Sie unter Systemvariablen die Pfadvariable finden. Doppelklicken Sie darauf. Und in der Liste sehen Sie keine C-Programmdateien. Kein JS, was mein Installationspfad für keinen Jazz ist. Da Sie es also nicht hier in der Liste haben, sehen Sie, dass der Knoten nicht erkannt wird, okay? Was Sie also tun müssen, müssen Sie auf Neu klicken und Ihren Installationspfad für keine GS hinzufügen. Wenn Sie die Option in der Installation nicht geändert hätten, wären es auch C-Programme, NodeJS. Also klicke auf Neu, füge den Pfad hier ein, okay? Okay, okay, dann starte einfach das Terminal neu. Versuchen Sie es dann mit Node Dash, Dash Version. Schon wieder. Danach solltest du die Version sehen. Und das ist es im Grunde. Herzlichen Glückwunsch, Sie haben gerade NodeJS unter Windows installiert. Wir sehen uns im nächsten. 15. Node.js (macOS) installieren: Hallo, In diesem Video zeige ich dir, wie man NodeJS auf macOS installiert. Lass uns gehen. Wie immer gehen Sie zuerst zu Google und geben NodeJS ein, gehen zur ersten URL, der offiziellen Website, navigieren dann zur Download-Seite und klicken auf das macOS-Installationsprogramm. Der Download startet automatisch. Öffnen Sie die heruntergeladene Datei. Sie sehen, dass der Installationsassistent auf Weiter klicken, dann die Bedingungen akzeptieren, dann den Installationspfad überprüfen und auf Installieren klicken. Es wird Sie zur Eingabe Ihres Passworts auffordern und das ist in Ordnung. Warten Sie, bis kein GS direkt nach dem Installationsvorgang installiert , bis kein GS direkt nach dem Installationsvorgang Sie haben kein GS und NPM in Ihrem System, um die Installation zu überprüfen. Lass uns zum Terminal gehen und schlecht essen gehen. Suchen Sie dann nach dem Terminal, um den NodeJs-Typknoten dash V zu überprüfen , der für Version steht. Es sollte die Version drucken, die Sie installiert haben. Und auf die gleiche Weise müssen wir auch NPM überprüfen. Geben Sie also npm dash v ein, und das war's. Wir sehen uns im nächsten. 16. Node.js und NPM – Teil 1: Hi, Willkommen zu wissen GS-Einführungsvideo. Im Moment werden wir darüber sprechen, was kein GS ist. Warum brauchen wir es und wie können wir es benutzen? Lassen Sie uns zuerst das Wichtigste gehen, was ist keine GS weiß, ist eine JavaScript-Laufzeitumgebung. Es bedeutet, dass es uns ermöglicht, JavaScript auszuführen. Und du wirst wahrscheinlich denken, warum brauchen wir keine GS? Weil wir JavaScript im Browser laufen lassen und das ist der Punkt. Heutzutage können wir JavaScript mit Hilfe von NodeJS außerhalb des Browsers ausführen , wir können JavaScript verwenden, um mobile Anwendungen zu schreiben. Wir können JavaScript verwenden, um Desktop-Anwendungen zu schreiben. Wir können im Grunde alles mit JavaScript machen. Dank der Notiz ja, denn es ermöglicht uns, JavaScript außerhalb des Browsers auszuführen . Wenn ich zum Beispiel den Browser hier öffne, klicke ich auf Inspect, dann gehe ich zur Konsole. Das ist also eine Browserumgebung. Ich kann hier jedes gewünschte JavaScript schreiben. Wenn ich zum Beispiel console.log 5 plus 2 eingeben möchte, wird es sechs für mich ausgeben. Das ist großartig, aber das ist im Browser. Wenn ich es woanders ausführen wollte, dürfte ich das nicht tun. Aber mit Hilfe von Knoten, ja, das kann ich tun. Gehen wir zum VS-Code und lassen Sie mich einen neuen Projektordner erstellen. Ich gehe in den Ordner „Meine Projekte“ und hier werde ich GS testen. Ich wähle diesen Ordner aus. Und jetzt erstellen wir hier eine neue Datei , wir nennen sie test.js. Bevor wir etwas schreiben, wir zuerst sicher, dass kein JS installiert ist. Wir können darauf zugreifen. Dafür öffne ich mein integriertes Terminal. Und um auf NodeJS zugreifen zu können, muss ich nur den Knoten eingeben. Sobald sie den Knotenbefehl ausgeführt haben, gehe ich in die Umgebung Node.JS ein. Also hier kann ich JavaScript ausführen. Zum Beispiel das Gleiche, was ich im Browserkonsolenprotokoll 2 plus 4 gemacht habe . Ziemlich genial. Dies ist der Beweis dafür, dass JavaScript außerhalb des Browsers ausgeführt wurde. Dies ist jedoch nicht sehr praktisch für uns, immer JavaScript in das Terminal zu schreiben. Um diesen Modus zu beenden, der mehrmals die Strg plus C drücken wird. Großartig. Und jetzt schreiben wir stattdessen ein paar JavaScript-Dateien , die wir später als ohne JS ausführen werden , bevor wir in Dateien springen, ich möchte nur erwähnen, dass jede Datei, jede JavaScript-Datei, die ausgeführt wird innerhalb der Node.JS Umgebung wird ein Modul sein. Ein Modul ist eine JavaScript-Datei, die in sich geschlossen ist. Es bedeutet, dass es nicht nur über die Außenwelt weiß , was darin geschrieben ist. Lasst uns zuerst erstellen, vielleicht bin ich hörbar? Const fünf ist gleich fünf. Und jetzt konsolen wir Dot Log 5 und klicken Sie auf Speichern. Das war's. Wir haben gerade unser erstes Skript erstellt. Nun führen wir es aus, um eine Datei auszuführen, wir müssen node und dann den Namen des Skripts eingeben , das wir ausführen möchten. Also das wird Test-GS sein. Ich führe diesen Befehl aus und du kannst fünf in der Konsole sehen , weil ich nur Log 5 konsolen kann. Wenn ich diese Zeile entferne, werde ich sie auskommentieren. Und ich werde versuchen, das Skript erneut auszuführen. Nichts wird gedruckt. Und das ist offensichtlich, weil wir im Inneren nichts tun. Lassen Sie uns unsere Aufgabe ein bisschen schwerer machen. Was ist, wenn wir zwei Dateien zu Modulen haben? Lassen Sie sich hier einen zweiten Punkt erstellen und lassen Sie uns hier eine Zeichenfolge setzen. Vielleicht mein Name, ich drucke Andrew. Und was ich tun möchte, möchte ich irgendwie Informationen zwischen diesen beiden Modulen austauschen . Also wollte ich meinen Namen von der zweiten Gs in den Test geben . Ja. Und das kann ich durch Import und Export tun. Um also etwas aus einem Modul zu exportieren, verwenden wir das Modul. Unsere Experten exportieren also ein Objekt. Und in diesem Objekt setze ich meine Namensvariable so ein. Also kann ich es tatsächlich so machen. Mein Name, dann ruf meinen Namen an. Aber in JavaScript können wir eine Kurzschrift verwenden. Wir können es einfach so ausdrücken und es wird großartig funktionieren. Jetzt wird mein Name aus dem zweiten Gs exportiert. Versuchen wir das zu importieren. Wenn ich zurück zu Ts gehe, gs, lass mich das alles entfernen. Ich werde eine Const setzen, dass ich meinen Export so benennen werde. Ich habe meinen Namen importiert, egal. Und um das zu importieren, was ich von hier exportiert habe, muss ich erforderlich eingeben. Und drinnen muss ich den Weg zu diesem Modul legen, das nur eine zweite GS sein wird. Ich muss die Erweiterung nicht angeben. Also lege ich Punkt und Schrägstrich hier drüber, um anzugeben, dass sich diese Datei in diesem Ordner befindet. Nun, was ich tun werde, werde ich einfach konsolenlog importiert meinen Namen importiert. Ich speichere die Datei, gehe zurück zum Terminal und dann wieder Knoten, Test, GS. Boom, was ich sehe, ich habe ein Objekt. Und dieses Objekt enthält meinen Namensschlüssel. Genau das, was ich von Sekunde exportiert habe, ja, tatsächlich können wir das in importiertes zweites Modul umbenennen. Und dann kann ich auf den importierten zweiten Modulpunkt meinen Namen verweisen , weil dies ein Objekt ist und es Schlüssel meinen Namen hat. Ich speichere es, führe das Skript erneut und ich habe gedruckt in die Konsole eingegeben. So funktioniert NodeJS, indem es einfach verschiedene Module erstellt , die Daten untereinander teilen. Dieses System mit einem Required und mit Modulexporten wird als gemeinsames GS bezeichnet, das so geschrieben wird. Komma gs. Dies ist ein natives Import-Exportsystem in Node.JS. Derzeit arbeitet die NodeJS-Community jedoch aktiv an einem System, arbeitet die NodeJS-Community jedoch aktiv an das als ECMO Script-Module bezeichnet wird. Diese Module sind also Teil der Browserumgebung und sind derzeit in einer Node.JS Umgebung experimentell. Sie unterscheiden sich also geringfügig von Bedarf- und Modulexporten, sind jedoch einfacher und intuitiver zu bedienen. Probieren wir sie aus. Was denken Sie, um ACML Script-Moleküle in der Umgebung Node.JS verwenden zu können, müssen wir unseren Modulen eine weitere Erweiterung hinzufügen. Anstelle von js müssen wir also MGS verwenden, das Modul GS, MGS sein wird und diese Datei auch umbenennen, was mgs sein wird. Anstatt erforderlich, kommentiere ich diese Zeile durch Drücken von Strg. Und stattdessen verwende ich Import. Da wir dann ein Objekt exportieren, setze ich wieder geschweifte Klammern. Und ich gebe an, dass ich meinen Namen importieren muss. Es ist wichtig, denselben Namen anzugeben , denn wenn ich etwas anderes angeben möchte, existiert es für das exportierte Objekt nicht, oder? Also werde ich meinen Namen aus dem zweiten Modul angeben. Großartig. Und jetzt werde ich meinen Namen konsolenprotokollieren. Und im zweiten MGS anstelle von Modulexporten ich anstelle von Modulexporten einfach meinen Namen exportieren. Das war's. Und es sieht viel, viel sauberer aus als CommonJS. Versuchen wir nun einen ausgeführten Knotentest. Ja, und wir werden haben, kann das Modul aha IC nicht finden. Dies liegt daran, dass ich wahrscheinlich die Erweiterung angeben muss. Lass es mich ausprobieren. Ja, genau. Es gibt also einen weiteren Nachteil beim Verwenden des ECMO-Skript-Moduls im aktuellen Status von NodeJS, ich muss immer die Erweiterung mit CommonJS angeben, ich kann zugeben, dass ich die Erweiterung angeben wenn a Importieren Sie verschiedene Module wie diese, aber mit dem ECMO-Skript-Modul muss ich das tun. Das Ergebnis ist das gleiche. Ich führe das Drehbuch aus. Ich habe Andrew, aber Sie können sehen, dass es das ECMO-Skript-Modul in unserem Projekt verwendet. Wenn wir all diese Entwicklungssachen erledigen, verwenden wir die Umgebung Node.JS und verwenden Achmat Script-Module. Sie können sehen, dass dies ein sehr einfaches Beispiel ist. Es verwendet hier einzelne Skripte, nichts Kompliziertes. Wir brauchen jedoch offensichtlich etwas komplexeres und dies ist unser Thema für das nächste Video. Wir sehen uns dort. 17. Node.js und NPM – Teil 2: Hey, willkommen zum zweiten Teil der NodeJs-Einführung und dem letzten Teil wir besprochen haben, was nicht ja ist und wie wir einzelne Skripte ausführen können. In diesem Video werden wir über NPM sprechen und wie wir npm verwenden können, um Projekt- und Projektabhängigkeiten zu verwalten. Lass uns gehen. Zuallererst, was ist npm? Npm steht für Node Package Manager und ist bereits mit NodeJS gebündelt. Wenn Sie also kein JSON installiert haben, haben Sie bereits NPM, um zu überprüfen, dass Sie im Terminal einfach npm eingeben. Es gibt eine Dash-Version und es wird die derzeit installierte NPM-Version drucken. Wie können wir npm benutzen oder was tut es für uns? Nun, die Sache ist, dass es in echten JavaScript-Projekten Abhängigkeiten oder Projektpakete gibt. Dies sind also diese Bibliotheken, verschiedene Module aus dem Internet oder verschiedene Tools, die wir in unser Projekt installieren. Und npm ist das Tool, das uns das ermöglicht. Um diese Pakete zu installieren, aber zuerst, wie man npm in unserem Projektordner initialisiert. Um dies zu tun, müssen wir den Befehl npm init verwenden. Und sobald Sie diesen Befehl ausgeführt haben, werden Sie nach einigen Dingen wie Paketnamen, Version und einigen anderen Dingen aufgefordert . Überspringen Sie das einfach, indem Sie ständig die Eingabetaste drücken. Sobald der Befehl beendet ist. In der Projektroute sehen Sie package.json-Dateipaket Jason ist die Manifestdatei, die unser Projekt beschreibt, in dem wir den Projektnamen sehen können, vielleicht die Beschreibung der Projektversion. Wenn wir diese Autorenlichter setzen und sehen, ob wir Skripte und ein paar andere Abschnitte haben Skripte und ein paar andere Abschnitte über die wir in einer Sekunde sprechen werden. Die Frage ist, welches Paket JSON für uns macht? Wie kann es nützlich sein? Nun, lass uns zum Browser gehen. Lassen Sie uns in Google nach NPM suchen und wir werden auf der offiziellen npm-Website landen. Npm hat die NPM-Registrierung. Node Package Manager ist also ein Tool, mit dem wir Pakete in unserem Projekt verwalten können. Aber woher stammen diese Pakete? Sie stammen aus der NPM-Registrierung. Die NPM-Registrierung ist der Ozean verschiedener Pakete, Tools und Bibliotheken, die wir mit npm in unser Projekt installieren können . Auf dieser Website können Sie also nach verschiedenen Paketen suchen. Es gibt Millionen, Milliarden verschiedener Bibliotheken, die wir verwenden können. Aber jetzt suchen wir einfach nach dem, den ich vorbereitet habe, nämlich Cowsay. Lasst uns das anklicken. Und jetzt können wir die offizielle Webseite für diese auf dieser Seite sehen , wir finden ihre Dokumentation, wie wir dieses Paket installieren können, was es tut, wie wir es verwenden können und alle anderen Dinge. Wir können sehen, dass es für Abhängigkeiten ist. Die Sache ist, dass Pakete, die in der NPM-Registrierung veröffentlicht werden, Abhängigkeiten haben und diese Abhängigkeiten auch veröffentlichte Pakete sind. Und diese Pakete könnten auch Abhängigkeiten haben. Abhängigkeiten, Abhängigkeiten und Abhängigkeiten von Abhängigkeiten werden als Peer-Abhängigkeiten bezeichnet. Auf dieser Seite finden wir auch einige wichtige Informationen wie Version, wie viele wöchentliche Downloads der Autor zuletzt veröffentlicht hat , und einige andere Dinge. Lasst uns die Dokumentation lesen. Was sehen wir hier? Zuallererst, was macht dieses Paket? Nun, dieses Paket ist im Grunde sehr einfach. Sein einziger Zweck besteht darin, diese Kuh einfach ins Terminal zu drucken . Also schauen wir uns den Installationsteil an, npm installieren minus g Cowsay. Kopieren wir diesen Befehl und legen wir ihn in unser Terminal. Mal sehen, was passieren wird. So können wir sehen, dass etwas passiert. Können wir sehen, dass die Installation bereits erfolgreich war. Wir können Edit 41-Pakete und die Version sehen , die wir installiert haben, die 1.5 ist. Warum 41 Paket? Genau wie ich bereits erwähnt habe, haben Pakete ihre eigenen Abhängigkeiten, und diese Abhängigkeiten haben ihre eigenen Abhängigkeiten. Und schließlich haben wir diesen Abhängigkeitsbaum. Deshalb haben wir am Ende insgesamt 41 Pakete. Wir haben npm Cowsay installiert. Was hat es gemacht? Nun, es hat gerade Cowsay als globales Paket in unser System installiert . Als globales Paket, weil wir das g Flag minus, um zu überprüfen, ob wir npm list minus g eingeben können, dann Strich, Strichtiefe gleich 0. Führen wir diesen Befehl aus und schauen wir uns an, was gedruckt wird. Ich habe hier bereits ein paar Pakete weltweit installiert, aber in Ihrer Liste sehen Sie Cowsay. Was heißt es also? Was gibt es uns? Das bedeutet, dass wir das Paket jetzt weltweit als CLI in unserem System verwenden können . Mal sehen wir den Nutzungspark Cowsay JavaScript. Lassen Sie es uns kopieren. Und lasst uns versuchen, es im Terminal auszuführen. Ich habe diese kleine hübsche Kuh hier, die JavaScript sagt. Genau das macht dieses Paket und wir können es als CLA in unserem Terminal verwenden. Und es spielt keine Rolle , von wo es weltweit verfügbar ist. Wenn ich hier eine andere Git Bash-Instanz öffne, kann ich immer noch Cowsay verwenden. Weil wir Cowsay wieder als globales Paket installiert haben. Es bedeutet, dass wir es überall benutzen können. Es gibt zwei Arten von Paketen, oder ich würde auf zwei Arten sagen, wie wir ein Paket installieren können. Erstens können wir es global installieren, genau wie Sie hier sehen. Wenn also ein Paket global installiert wird, ist es nicht an ein Projekt gebunden, sondern wird nur global in Ihrem System installiert. Die zweite Möglichkeit besteht darin, ein Paket als Projektabhängigkeit zu installieren . Wenn ein Paket als Projektabhängigkeit installiert , ist es zunächst nicht global verfügbar. Es wird nur in dem Projekt verfügbar , in dem es installiert wurde Lassen Sie uns zuerst Cowsay als globales Paket deinstallieren und stattdessen als Projektabhängigkeit installieren. Also geben wir zuerst npm install minus g Kuh Sake ein. Sie werden am Ende sehen, dass 41 Paketnote entfernt wurde. Um nun Cowsay als Projektabhängigkeit zu installieren, müssen wir npm Cowsay installieren, aber dieses Mal ohne minus g Flag, führen wir diesen Befehl aus und mal sehen, was passieren wird. Was ist neu im Seiten-Datei-Explorer. Wenn wir also das Paket Jason öffnen, sehen wir zuerst einen neuen Abhängigkeitsabschnitt. Da das Paket Jason also unsere Manifestdatei ist, wird es alle Abhängigkeiten auflisten, die wir installiert haben. Also haben wir nur einen Abhängigkeits-Cowsay dieser Version installiert . Jetzt sehen wir auch package.json. Und package.json erscheint, wenn Sie Abhängigkeitspaket installieren. JSON Zweck ist es, Versionen der installierten Abhängigkeiten und Abhängigkeiten von Abhängigkeiten zu suchen der installierten Abhängigkeiten und Abhängigkeiten . Auf diese Weise können wir verschiedene Probleme mit Versionsauflösungen vermeiden . Und wir haben auch Node Modules Ordner. Der Node-Modulordner ist der Ordner, in dem alle Pakete installiert wurden. Wenn wir diesen Ordner öffnen, sehen wir hier eine Reihe verschiedener Pakete zusammen mit Cowsay. Dies sind diese 41 Pakete, die wir gesehen haben, dass sie installiert wurden. Sie befinden sich hier unter Node-Modulen. Wenn wir diesen Ordner löschen, werden sie gelöscht. Gehen wir nun zurück zu Cowsay und schauen wir uns an, wie wir dieses Paket tatsächlich verwenden können. Wenn wir also nach unten scrollen, können wir die Verwendung als Modul sehen. Denken Sie daran, dass ich denen gesagt habe, dass alle Dateien in Node.JS, unsere Module gleich mit Paketen sind. Da Pakete in der NPM-Registrierung auch JavaScript-Dateien sind, bedeutet dies, dass es Module gibt. Mal sehen, wie wir es als Modul verwenden können. Und wenn ich mir dieses Code-Snippet ansehe, kann ich sagen, dass dieses Beispiel require verwendet, was bedeutet, dass es CommonJS-Importsystem verwendet. Aber jetzt wissen wir, dass es CommonJS gibt und es auch ECMO Script-Module gibt. Stattdessen werden wir atmosphärische Module verwenden. Also lassen Sie uns dieses Beispiel kopieren. Und lasst es uns in unsere Test-Mgs legen. Aber anstatt zu benötigen, verwende ich bei meinem Skriptimport. Also geben wir den Import Cowsay aus Cowsay ein. Und hier muss ich den Paketnamen angeben, wobei der Abhängigkeitsname vom Paket JSON. Ich muss den Pfad nicht angeben, in dem ich keine Knotenmodule referenzieren muss. Ich muss nur den Abhängigkeitsnamen eingeben , der Cowsay sein wird. Lassen Sie uns das jetzt löschen und löschen wir es und speichern wir es. Und lasst uns versuchen, dieses Skript auszuführen. Ich gebe den Knoten test.js ein. Und mal sehen, wieder haben wir diese Kuh, die sagt, dass ich ein Moodle bin, aber jetzt ist Cowsay Teil unseres Projekts. Als wir es global installiert haben, war es unabhängig. Es war nur ein Tool in unserem System, das wir über das Terminal verwenden können. Aber da Cowsay jetzt Teil unseres Projekts ist, sind wir in diesem speziellen Projekt an Cowsay gebunden. Wenn ich den Ordner der Knotenmodule entfernen möchte, gehen wir weiter und löschen sie vollständig. Und wenn ich versuche, diese Datei erneut auszuführen, werden Sie sehen, dass das Paket Cowsay nicht gefunden werden kann , weil wir gerade alle erforderlichen Dateien gelöscht haben, die zum Ausführen von Cowsay erforderlich sind. Um also Pakete neu zu installieren im Paket Jason aufgeführt sind, das in unserem Projekt aufgeführt ist, müssen wir einfach npm installiert eingeben, wenn wir keinen Node-Modulordner haben, aber wir müssen die Pakete installieren. Wir geben einfach npm install ein. Also was es tun wird, es wird in das Paket Jason schauen. Es wird nach dem Abschnitt „Abhängigkeit“ suchen und fehlende Pakete installieren. Das war's. Jetzt kann man es wieder sehen 41 Paket, wenn ich das Skript noch einmal ausführe, war die Kuh da. Großartig. Schauen wir uns das Paket JSON und lassen Sie uns den Abschnitt „Skripte“ hier finden. Ich möchte jetzt über diesen Abschnitt sprechen, die Sache ist, dass es in den Projekten ein paar projektspezifische Skripte gibt. Dieser Abschnitt heißt also NPM-Skripte. Normalerweise werden projektspezifische Skripte durch NPM-Skripte definiert. Wir haben hier bereits ein Testskript definiert, aber lassen Sie es uns entfernen und definieren wir unser eigenes Skript. Es kann alles sein, wir können es nennen, wie wir wollen. Zum Beispiel mein Testskript. Und hier müssen wir eingeben, was das Skript tun wird. Wenn ich zum Beispiel im Terminal etwas in die Ausgabe drucken möchte , würde ich den echo-Befehl verwenden, echo, hallo, und hallo wird gedruckt. Also gut, hier können wir dasselbe definieren. Zum Beispiel wird mein Testskript Echo hallo ausführen, zum Beispiel bei Code hallo. Um dieses NPM-Skript auszuführen, muss ich nun npm run und den Namen des Skripts eingeben, das mein Testskript sein wird. Sobald sie diesen Befehl ausgeführt haben, sucht dieser Befehl in diesem Ordner nach Paket JSON, und er wird in diesen Skriptabschnitt schauen und mein Testskript finden, und dann wird es einfach alles ausführen, was geschrieben wurde hier. Probieren wir es aus. Du kannst sehen, ich habe Hallo, im Grunde das gleiche Ergebnis. Deshalb könnte es nützlich sein. Nun, es gibt einige Situationen, in denen wir hier vielleicht ein wirklich, sehr langes Drehbuch haben. Stell dir vor, es läuft so. Und jetzt, anstatt all das zu schreiben, können wir die ganze Zeit einfach npm ausführen, mein Testskript ausführen und es wird das Ding machen. Das war's. Wir werden ausführlicher über NPM-Skripte sprechen sobald wir vorerst ein echtes React-Projekt gerüstet Lassen Sie es uns einfach leer. Eine weitere Sache, die ich hier erwähnen möchte, ist, dass Projektabhängigkeiten von zwei Arten sein können. Eigentlich gibt es regelmäßige Abhängigkeiten , die wir in unserem Quellcode verwenden, und es könnte Entwicklerabhängigkeiten geben. Dev-Abhängigkeiten sind also ebenfalls Teil des Projekts, werden jedoch nicht im Quellcode referenziert. Sie werden nur für die Entwicklung verwendet. Diese Pakete, die wir für die Entwicklung installieren werden, werden also Prediger und ES Flusen sein. Und wir werden sie als taube Abhängigkeiten installieren. Wir werden in den kommenden Videos darüber sprechen. Sie werden verwendet, um unsere Entwicklung zu erleichtern, sind aber optional. Wenn wir Dev-Abhängigkeiten entfernen, kann das Projekt weiterhin ausgeführt werden. Wenn wir diese Abhängigkeit jedoch von hier entfernen Knotenmodule entfernen, kann das Projekt nicht ausgeführt werden da es von Cowsay abhängt. Wenn wir also Dev-Abhängigkeiten entfernen, kann das Projekt weiterhin ausgeführt werden. Wenn wir jedoch die Hauptabhängigkeit entfernen, wird das Projekt nicht ausgeführt, da jetzt die Abhängigkeit fehlt weil unser Projekt davon abhängt. Dev-Abhängigkeiten sind jedoch nur Abhängigkeiten für unsere Entwicklungsumgebung. Es hat keinen direkten Einfluss auf den Quellcode. Wir werden noch einmal darüber reden Sobald wir über den Prediger im Benzin sprechen werden. Aber im Moment denke ich, dass es genug ist. Alle JavaScript-Projekte werden mit npm, den NPM-Registrierungspaketen, verwaltet den NPM-Registrierungspaketen, Sie werden JSON in Ihrem Stammordner gepackt haben. Sie werden Abhängigkeiten aus der NPM-Registrierung installiert haben. Dann verweisen Sie auf diese Abhängigkeiten in Ihrem Quellcode. Am Ende des Tages, wenn Sie das Projekt entweder entwickeln müssen oder das Projekt erstellen müssen, haben Sie hier NPM-Skripte im Paket Jason definiert. Und das war's. So sehen alle JavaScript-Projekte aus. Das war's für NodeJS. Und wir sehen uns im ES-Fusseln- und Prediger-Video. 18. Was sind Prettier und ESLint?: Hey, in diesem Video möchte ich über Prediger in ES Flusen sprechen. Was sind das für Tools? Warum interessiert es uns und wie werden sie uns helfen? Lasst es uns gemeinsam herausfinden. Als erstes möchte ich erwähnen, dass ich in diesem Video dasselbe Projekt wiederverwenden werde, das ich im Einführungsvideo Node.JS erstellt habe . Wie Sie sich erinnern, enthält es nur eine Abhängigkeit, nämlich Cowsay, und wir verwenden es nur in MGS. Fangen wir damit an. Preachers ist ein Tool, das alle unsere Dateien formatiert. Es hat nur einen Zweck, Dateien zu formatieren. Es gewinnt den vordefinierten Konflikt. Lasst uns also herausfinden, wie wir Prediger benutzen können. Wenn wir zu Google gehen und nach einem Prediger suchen, landen Sie auf der offiziellen Website. Gehen wir zur offiziellen Installationsdokumentation und folgen wir ihr einfach. Zuerst installierte Prediger lokal. Kopieren wir diesen Befehl und legen wir ihn ins Terminal. save-dev-Flag innerhalb des Befehls bedeutet also , dass dieser Paketprediger als Entwicklungsabhängigkeit installiert wird . Wenn wir package.json öffnen, sehen wir hier einen neuen Abschnitt, Dev-Abhängigkeiten, bei denen es sich um Entwicklerabhängigkeiten handelt. Und wir werden den Prediger hier sehen. Jetzt. Lass uns mit den Hunden fortfahren. Und hier haben wir eine leere Konfliktdatei erstellt. Auch hier kopiere ich einfach den Befehl. Legen Sie es in das Terminal, und es wird einen leeren Prediger RT JSON für mich erstellen, jeder Werkzeugprediger und Eastland, erfordert eine Konfigurationsdatei, um zu verstehen, was wir von diesem Tool wollen. Und wir können all diese Konfliktoptionen für Prediger in der Dokumentation unter Optionen-Link sehen . Wenn wir hierher gehen, werden wir hier verschiedene Optionen sehen, die wir im Bild RC Jason verwenden können, zum Beispiel Tab mit. Also werde ich einfach die Tab-Breite von hier aus verwenden. Ich kopiere es einfach lege es in die Konfiguration. Und wir können sehen, dass der Standardwert zwei ist. Also lass mich vielleicht 10 hier rüber stellen und mal sehen, was passieren wird. Ich habe die Akte gespeichert. Ich gehe zurück, um MGS zu testen. Ich drücke Control S, um die Datei zu speichern. Und Boom, du siehst, dass sich die Einrückung geändert hat. Jetzt. Es verwendet die Tippbreite von 10 leeren Zeilen. Sie denken wahrscheinlich darüber nach, wie es automatisch so ist , als würde man diese Datei formatieren. Die Sache ist, dass das, was wir gerade in unserem Projekt unter Entwicklerabhängigkeiten installiert haben, Prediger als Tool installiert haben, aber außerhalb der Formatierung ist die Funktion, wie wir sehen, über den VS-Code verfügbar ist -Erweiterung, die Sie bereits hätten installieren sollen. Wenn Sie das nicht getan haben, gehen Sie zur Registerkarte Erweiterungen. Sucht hier nach Predigt. Dies ist die Erweiterung und installieren Sie sie und stellen Sie sicher, dass sie bereits konfiguriert ist. Wenn Sie das nicht getan haben, möchten Sie den Prediger wiederverwenden, um das Video zur VS-Code-Konfiguration von Projekt zu Projekt anzusehen , um das Video zur VS-Code-Konfiguration von Projekt . Sie möchten hier nicht immer verschiedene Optionen angeben. Glaub mir, es wird nur ein paar geben. Aus diesem Grund werde ich Ihnen dieses Geschenk mitteilen und Sie können einfach kopieren und einfügen Predigerkonflikt , den ich überall verwende, einfach kopieren und einfügen. Also lass es mich hierher legen und lass mich die Akte speichern. Wie Sie sehen können, verwende ich fünf Befehle und das reicht aus, damit ein Prediger arbeiten kann. Du siehst, ob ich es speichern werde. Es nutzt diesen Konflikt jetzt. Großartig. Beantwortung der Frage, warum brauchen wir Prediger? Zuallererst müssen Sie verstehen, dass Prediger ein optionales Werkzeug ist, aber es wird dringend empfohlen, dass Sie Prediger in Ihrem JavaScript-Projekt haben . Der Grund dafür ist, dass wir unseren Code so lesbar und wartbar wie möglich machen wollten . Und der Prediger wird uns dabei helfen. Welches bevorzugst du? Diese seltsame Formatierung? Weil Sie aus irgendeinem Grund die manuelle Einrückung nicht beendet oder bevorzugen Sie sehr sauberen Code, der mit Prediger erreicht wurde? Ich schätze, es wird die zweite Option sein. Betrachten Sie schließlich eine Situation, in der Sie viele Dateien im Projekt haben und diese nicht formatiert sind. Prediger. Was ist in diesem Fall zu tun? Nun, die erste Option besteht natürlich darin, zu jeder Datei zu wechseln, Control S zu drücken, um jede Datei manuell zu speichern, und dann wird sich der Prediger an ihnen bilden. Aber das ist nicht sehr praktisch. Es wäre besser, ein Skript zu erstellen , das alle unsere Dateien gleichzeitig formatiert. Und dieses Skript werden wir Prediger benutzen, und hier kommen NPM-Skripte ins Spiel. Lassen Sie uns ein NPM-Skript erstellen, das Prediger verwendet, um alle unsere Dateien innerhalb des Projekts mit Prediger RC JSON zu formatieren . Wenn wir also zur Prediger-Dokumentation zurückkehren, gehen wir zur Installationsseite. Scrollen wir nach unten und hier können wir sehen, dass jetzt alle Dateien mit Prediger formatiert werden und wir haben diesen Befehl und px-Preacher-Strich, Bindestrich rechts. Lass es mich kopieren. Und navigieren wir zurück zu den NPM-Skripten. Also lassen Sie uns hier definieren und Ihr NPM-Skript , das wir formatieren werden. In diesem Skript setze ich n px, Prediger Strich, Strich, rechten Punkt. Wir brauchen jedoch nicht wirklich und Px hier können Sie lesen, was n px in dieser gelben Warnung ist. Sind wir uns sicher? Also ist n px im Grunde ein Tool, das ohne JS ausgeliefert wird, mit dem Pakete ohne Installation direkt aus der NPM-Registrierung ausgeführt werden können. Wenn ich Prediger nicht installiert habe und dann würde ich n px Preacher Dash verwenden, Dash Reidar. Es würde funktionieren, weil NP x Prediger ohne Installation direkt aus der NPM-Registrierung verwenden wird Prediger ohne Installation direkt , aber wir brauchen es überhaupt nicht. Wir haben Prediger installiert. Und wenn wir Prediger hier im NPM-Skript schreiben, wird der Prediger verwendet, der in Knotenmodulen installiert ist. Probieren wir den Befehl aus, den wir gerade definiert haben. Ich gehe zurück zu meinem Terminal und führe das npm run-Format aus. Du wirst sehen, dass etwas passiert. Und jetzt sind einige Dateien betroffen, im Grunde alle von ihnen. Schütteln wir sie aus. Also haben wir diese Datei formatiert, diese Datei formatiert, diese Datei formatiert. Also ist im Grunde alles jetzt mit einem Prediger formatiert. Gehen wir zurück zum Prediger RC Jason und ändern wir es vielleicht auf 10 Tablette. Und lassen Sie uns den Befehl erneut ausführen npm run format. Und Sie werden sehen, dass alle Dateien jetzt gegen Predigerkonflikte formatiert sind gegen Predigerkonflikte formatiert , die wir gerade definiert haben. Das war's. Jetzt weißt du was Prediger macht und warum brauchen wir ihn? Lassen Sie uns schnell zusammenfassen. Preacher ist ein Tool, das Dateien in unserem aktuellen Projekt formatiert , hübscher hat eine Konfigurationsdatei die Dot Preacher RC JSON ist. Wir können Prediger über die NPM-Skripte verwenden oder wir können Prediger über die VS-Code-Erweiterung verwenden, die wir installiert haben. Also diese Erweiterung, das einzige, was sie tut, ermöglicht es uns nur, Dateien zu formatieren. Wenn wir auf die Schaltfläche „Speichern“ klicken, wenn wir diese Erweiterung deaktivieren oder wenn wir sie nicht haben, wird der Prediger nicht in unseren Dateien gebildet, wenn wir auf Speichern klicken, die einzige Möglichkeit für uns, die Dateien werden über unser benutzerdefiniertes NPM-Skript erstellt, das wir Format genannt haben. Aber mit der Erweiterung ist es viel, viel bequemer. Lassen Sie uns nun zu ES Lint übergehen, bevor wir nach Eastland springen, lassen Sie mich einfach schnell auf unsere vorherige Einstellung zurückgreifen und den Formatbefehl erneut ausführen. Großartig. Was ist Eastland? Eastland ist auch ein optionales Tool, mit dem wir JavaScript anhand einiger vordefinierter Code-Richtlinien auf einige häufige Probleme prüfen JavaScript anhand einiger vordefinierter Code-Richtlinien auf einige häufige Probleme können. Wir benötigen ES Flusen, um zu überprüfen, dass wir keine sehr einfachen Fehler in unserem Code haben, z. B. undefinierte Variablen, nicht verwendete Variablen, oder vielleicht haben wir einen Code, der falsch verwendet wird, und ES Fusseln wird lass es uns darüber wissen. Also nochmal, genau wie bei Druck, lass uns zu Google gehen und nach ES-Fusseln suchen. Lasst uns hier klicken. Sie können sehen, dass ES-Fusseln ein lineares ist. Linear ist also ein Werkzeug, das den Code tatsächlich auf Fehler überprüft. Klicken wir auf Erste Schritte und folgen wir noch einmal der Dokumentation. Also npm installiere ES lint save-dev, copy. Lasst es uns wieder ins Terminal legen. Dash, dash save dev-Flag wird sicherstellen, dass ES Lint als Entwicklerabhängigkeit im Paket Jason installiert wird , wiederum sind Wasser-Entwickler-Abhängigkeiten, Dev-Abhängigkeiten jene Tools die wir in der Entwicklung verwenden umgebung. Sie sind nicht Teil des Quellcodes. Wenn ich also Island und Prediger entfernen will, wird mein Projekt weiterhin laufen können. Großartig. Wir haben ES Lint installiert. Folgen wir nun der Dokumentation. Es schlägt also vor, den Befehl init zu verwenden , um die Konfigurationsdatei zu initialisieren. Lassen Sie es uns stattdessen manuell erstellen. Also werde ich hier eine neue Datei erstellen, und ich nenne sie dot ES lint RC. Das wird also meine ES-Lint-Konfigurationsdatei sein. Um ES Flusen zu konfigurieren, müssen wir genau dem gleichen Muster folgen wie beim Prediger. Sie müssen eine Konfigurationsdatei erstellen und wir müssen ein paar Befehle eingeben , damit Yes Lint verstehen kann, was wir davon wollen. Kommen wir zurück zur Website und hier haben wir eine Konfiguration. Also lasst es uns einfach kopieren. Aber wir werden hier ein paar Optionen ändern. Ich lege es hier hin. Ich werde das entfernen und wir enden mit dem Regelabschnitt. Im Regelabschnitt in Island, RC, definieren wir ES-Fusselregeln, die wir in unserem Projekt verwenden möchten, nach in unserem Projekt denen unser Code überprüft wird. Zum Beispiel kann ich eine Regel eingeben, die kein unbenutzter Virus genannt wird, und wir müssen hier einige Optionen angeben. Und Sie können sehen, dass es mir sogar den automatischen Vervollständigungseditor abgenutzt und abgenutzt gibt . Also was sind das? Wenn ich also aufschiebe, wird diese Regel deaktiviert und mein Code wird nicht mit dieser Regel verglichen. Wenn ich mich als Option für eine ES-Fusselregel einsetze . Es bedeutet, dass es Flusen mich warnt, wenn ich gegen diese Regel verstöße. Und ich habe eine dritte Option, was ein Fehler ist. Das bedeutet, dass Lint, wenn ich gegen diese Rolle gehe , einen Fehler erzeugen wird. Es gibt also einige, sagen wir mal, entscheidende Regeln, die ich für mich als andere melden möchte . Und es gibt einige vielleicht kleinere Regeln, die ich mir als Warnungen melden möchte . All diese Regeln finden wir in der Dokumentation. Ich schlage immer vor, dass Sie sich die Dokumentation ansehen. Dort finden Sie alles, damit Sie hier sogar Warn-Fehleroptionen sehen können , genau das, was Ihnen gesagt wird. Jetzt können wir zum Benutzerhandbuch gehen und wir können zu Regeln gehen. Dies ist eine Regelreferenz. Alle Regeln findest du hier immer. Wenn ich zum Beispiel nach keinen unbenutzten Balken suche, kannst du es hier sehen. Lass uns danach suchen. Ja, nicht erlaube unbenutzte Variablen. Das ist es, was die Regel tut, ist dies die Verwendung unbenutzter Variablen zu ermöglichen. Probieren wir es also aus. Ich komme zurück zu meinem Code. Und hier was ich habe Parsing-Fehler, die Tasteneingabe ist reserviert. Nun, ja, zuerst müssen wir ES Lint verstehen lassen , dass wir die neueste JavaScript-Syntax verwenden . Um das zu tun, gehen wir zu ES Lint. Hier fügen wir eine weitere Option hinzu, die Parser-Optionen sein wird. Innerhalb der Parser-Optionen müssen wir also die AVMA-Version liefern. Und lassen Sie uns 2020 hierher stellen , wenn ich die Datei speichere und MGS erneut teste, und ich sehe einen weiteren Fehler, der besagt, dass Import und Export nur im Quelltyp-Modul angezeigt werden , das wieder von ES Lint kommt. Also gehe ich zurück zu ja Lind und ich kann hier eine andere Option bereitstellen , wird der Quelltyp, Modulgrad sein . Jetzt haben wir keine Fehler oder Warnungen, daher haben wir keine unbenutzte Virenregel definiert , die zu einem Fehler führt, wenn wir dagegen gehen, stimmt, lasst uns mgs testen. Und hier lassen Sie uns eine End-Use-Variable erstellen. Vielleicht nenne ich es Hallo. Und was sehen wir hier? Wir sehen, dass es mit einer roten Linie hervorgehoben ist. Wenn ich mit der Maus schwebe, siehst du, wie niedrig ein Wert zugewiesen wird, aber nie verwendet wird. Und es kommt, wie Sie aus ES-Fusseln sehen können , keine unbenutzten Variablen. Wenn ich zurück zu ES lint RC gehe und wenn ich diese Regel deaktiviere, deaktivieren Sie die Überprüfung gegen diese Regel. Du wirst jetzt sehen, ich habe keine Warnung oder einen Addierer. Also lasst uns wieder hierher kommen und lassen Sie es uns als Warnung ausdrücken. Und wir können sehen, dass es gelb ist, weil es jetzt eine Warnung ist. Und wenn ich es wieder zum Äußersten setze, wird es rot. Großartig. Lassen Sie uns vielleicht eine Warnung halten und gehen wir zurück zur Dokumentation. Kommen wir also zurück zur Installationsseite. Und hier können wir ganz unten sehen, dass wir die Extents Option auch in ES-Fusseln setzen können . Die Sache ist, dass ES Flusen viele verschiedene Regeln hat und all diese Regeln hier ständig manuell schreibt . Das ist nicht sehr praktisch, weil unsere ES Fusseln ziemlich, ziemlich lang sein wird. Das ist nicht praktisch. Um dieses Problem zu lösen, hat ES lint Konfigurationsdateien oder sagen wir vordefinierte Konflikte, die wir von ES-Fusseln erweitern können, kommt in ES-Fusseln empfohlenen Konflikten eingebaut. Also kopieren wir es einfach und legen es ganz oben. Jetzt benutzen wir den empfohlenen Sträfling. Wenn wir wieder MGS testen, sehen wir, dass wir die Konsole jetzt nicht definiert haben. Nun, das liegt daran, dass es Dinge fusselt , die wir in der Browserumgebung ausführen. Und dafür müssen wir noch einmal angeben, dass wir in keinem Jazz laufen. Dafür müssen wir die ENV-Optionen hier platzieren und geben an, dass wir drinnen sind. Notiz. Und wir werden es wahr machen, wir können tatsächlich viele verschiedene Optionen wie ES6 setzen , um erneut anzugeben, dass wir die neueste JavaScript-Syntax verwenden. Und es gibt viele verschiedene Möglichkeiten. Und vertrau mir, du musst sie nicht alle kennen. Weil Sie immer die erste Dokumentation haben , die Sie verwenden können, wenn Sie Probleme mit dem Verständnis von Eastland haben oder Sie können einfach ja kopieren und einfügen. Verknüpfen Sie Konflikte von irgendwo und passen Sie sie an Ihre Bedürfnisse an. Dies ist sehr einfach. Lassen Sie es uns so behalten, wie es ist. Eine wichtige Anmerkung, die ich betonen wollte , ist, dass man nur dieses gelbe Schweben sehen kann oder vielleicht sieht man das Rot hier drüben schwebt. Ich meine, direkte Berichterstattung innerhalb des VS Code, dank der Erweiterung. Also habe ich ES Lint Extension installiert. Das, das ES-Fusseln in VS-Code integriert. Deshalb sehe ich hier diese rote Linie. Wenn diese Erweiterung deaktiviert wäre würde ES Lint mir nicht wirklich gemeldet, genau wie ich es gerade sehe. Es würde nicht rot werden. Der einzige Weg, wie ich von diesem Fehler wissen würde , wäre, den Befehl ES lint auszuführen, genau wie wir es zuvor mit Prediger getan haben. Also lasst uns vielleicht ein anderes NPM-Skript erstellen und den Befehl für Eastland definieren. Gehen wir zurück zu package.json. Hier werde ich den Befehl vielleicht lint setzen und ich werde ES lint asterix dot JS aufrufen oder da wir die MGS-Erweiterung haben, werde ich hier drüben und gs setzen, wir zu ES Lint gegen alle Dateien mit der MGS-Erweiterung laufen . Gehen wir in das integrierte Terminal und lassen Sie uns das Skript ausführen, das wir definiert haben, npm run lint, und Sie werden sehen, dass ES Lint ein Problem meldet. Hallo wird ein Wert zugewiesen, der aber nie benutzt wird. Das ist also sehr praktisch, da wir im Produktionscode anscheinend keine Variablen haben und verwenden wollen. Und es gibt viele verschiedene Fehler und Warnungen, die wir möglicherweise erhalten. Aber vertrau mir, das ist zu unserem eigenen Besten. Es lint hilft uns, unsere Codebase mit weniger Fehlern wie möglich zu pflegen . Wir werden ES-Fusseln in Kombination mit Prediger oft verwenden . Es gibt jedoch ein Problem mit ES Flusen und Preacher. Die Sache ist, dass sich einige Predigerregeln mit den ES-Fusselregeln überschneiden. Und um diesen Fehler zu beheben, müssen wir zu ES lint navigieren. Wenn wir zu ES Flusen gehen scrollen wir hier zur Zusammenfassung, wir können sehen, wie es Flusen-Sträflingprediger Prediger verwendet um Prediger und ES-Link zusammen nett spielen zu lassen. Navigieren wir zum ES-Prediger des schlanken Konflikts. Und lass uns zum Installationsteil gehen. Wir werden es kopieren. Wir werden es hierher stellen. Und wieder, Dash, Dash, speichern Sie das Dev-Flag, um dieses Paket als Entwicklerabhängigkeit zu installieren. Wenn Sie sich die Abhängigkeiten von Entwicklern ansehen, werden Sie jetzt einen Prediger des östlichen Konflikts sehen. Und mal sehen, was wir bei Preacher für das umfangreiche Array in Ihrer Eastland RC-Datei tun müssen. So erstreckt sich einige andere Konfigurationen und den Druck. Alles klar, also sagen wir, lasst uns Prediger kopieren. Kommen wir zurück zu ES Fusselstrecken. Und Sie können aus dem Beispiel sehen, dass es ein Array verwendet. Es Fusseln unterstützt also beides. Verwandeln wir es in ein Array. Und lasst uns Prediger hierher stellen. Nett. Ohne dieses Paket, ohne diesen ESPN-Prediger, landen Sie in einer Situation, in der Sie Eastland-Fehler haben und nicht verstehen, warum Sie sie haben. Dieses Paket stellt sicher, dass Sie keine Konflikte haben. Und ich werde sehen, dass es das ist. Das ist alles, was ich über ES-Fusseln und Prediger erzählen wollte , um schnell zusammenzufassen, was ist Eastland? Eastland ist ein Tool, mit dem wir unseren Code, unseren JavaScript-Code, anhand einiger vordefinierter allgemeiner Richtlinien überprüfen unseren JavaScript-Code, anhand können. Es wird unseren Code letztendlich weniger fehleranfällig machen, und es wird sicherstellen, dass unsere Codebasis so sauber wie möglich ist. Preacher wird unsere Codebase so formatieren , dass sie so lesbar wie möglich wird. Nur noch einmal werde ich sagen, dass diese Tools optional sind, aber Sie werden Prediger und ES in fast jedem JavaScript-Projekt sehen ES in fast jedem JavaScript-Projekt weil die Leute möchten, dass ihre Projekte lesbar sind und weniger fehleranfällig zu sein. Das war's. Wir sehen uns im nächsten. 19. Was sind Server, JSON, REST API und GraphQL?: Hey, in diesem Video möchte ich über Server sprechen. Was ist ein Server? Was ist eine API? Was ist eine Rest-API? Was ist GraphQL? Lasst es uns gemeinsam herausfinden. Beginnen wir zuerst mit dem Server. Was ist ein Server? Ein Server, es ist nur ein Computer irgendwo im Internet. Es läuft etwas Software. Und diese Software auf diesem Computerunterricht für unsere eingehenden Anfragen. Wenn ich zum Beispiel zu einer Website navigiere auf diesen Link klicke, sendet mein Browser eine Anfrage an diesen Server. Auf der linken Seite ist dies mein Browser und er sendet diese Anfrage an diesen Server. Dieser Server verarbeitet die eingehende Anforderung und sendet HTML-, CSS- und JavaScript-Dateien zurück . Also wieder ein Server, es ist nur ein Computer, der eine Software ausführt , die unsere eingehenden Anfragen irgendwie bearbeitet und eine Antwort zurücksendet. Was ist, wenn ich nicht immer HTML-, CSS - und JavaScript-Dateien erhalten möchte , möchte ich vielleicht nur eine Abfrage auf der Website ausführen, wie in der Suchleiste. Muss ich wieder HTML zurückgeben? Nein, das tust du nicht. Sie müssen nur die Daten, das Ergebnis dieser Abfrage, in der Suchleiste abrufen. In diesem Fall müssen Daten in einem anderen Format übertragen werden. Ein anderes Format ist normalerweise JSON-Format oder XML-Format. Aber XML ist bereits veraltet, würde ich im Internet sagen, jeder benutzt JSON. Lassen Sie uns also nach JSON oder vielleicht sogar nach JSON-Platzhalter-Free Fake Rest API suchen. Okay, also müssen wir zuerst herausfinden, was JSON ist. Ich klicke hier einfach auf Script ausführen. Und ich erhalte dieses JSON ist nur ein Format, in dem Daten über das Internet übertragen werden. Es kann nicht nur im Internet, sondern in jedem anderen Szenario verwendet werden. Es ist einfach, Informationen in diesem Format zu übertragen. Es sieht einem JavaScript-Objekt sehr ähnlich. Kommen wir jetzt zurück zu unserer Leinwand. Wie passt es zu diesem Szenario? Stellen Sie sich vor, ich bin hier auf der Website und tippe etwas in die Suchleiste ein, die sich auf der Website befindet. Und ich möchte meine Suchergebnisse im JSON-Format zurückholen, ich würde eine weitere Anfrage an diesen Server senden, und dieser Server wird meine Anfrage, meine Anfrage, bearbeiten. Es wird nach der Datenbank suchen. Es wird die Ergebnisse abrufen und diese Daten im JSON-Format an mich zurücksenden, was genau so aussieht. Keine Notwendigkeit für HTML, CSS oder JavaScript. Diese Art von Server, der HTML-, CSS- und JavaScript-Dateien hostet , wird normalerweise als Hosting-Dienste bezeichnet. Sie werden also verwendet, um grundlegende HTML-Seiten zu hosten. Sie legen einfach Ihre Dateien, HTML und CSS auf ihren Computer und liefern diese Dateien einfach auf ihrem Computer. Das war's. Was ist mit API-Servern? Was ist also eine API in erster Linie, API steht für Anwendungsprogrammierschnittstelle, und sie passt normalerweise nur zu API-Servern weil API-Server meistens diesem Zweck eines Zwischenhändlern zwischen Sie und die zugrunde liegende Datenbank. Dies ist jedoch nicht nur der Fall. Nun, sie werden normalerweise als API-Server bezeichnet , weil sie Schnittstellen für alles sind , was hinter diesem Server steckt. Deshalb heißen sie APIs oder Interfaces oder wie auch immer er sie nannte. Werfen wir noch einmal einen Blick auf diesen JSON-Platzhalter. Also sende ich eine Anfrage an diese URL. Ich kopiere es einfach und lege es hier hin. Wenn ich darauf zugreife, werden Sie dies wahrscheinlich so im Rohformat sehen. Dieser Server fungiert als Rest-API, da er dem restlichen Format folgt. Es ist also eine API, weil es sich um eine benutzerdefinierte Serverimplementierung handelt. Es ist also diese benutzerdefinierte Software, die auf dem Server installiert ist, die meine Anfrage bearbeitet und Jason zurücksendet Dies ist der API-Teil. Was ist Ruhe? Rest bedeutet, dass es dem restlichen Entwurfsmuster bei der Restimplementierung folgt . Dies bedeutet, dass der Code des Server-JSON-Platzhalters , der ruhig ist, mehrere Endpunkte verfügbar macht , auf die wir zugreifen können , um Daten abzurufen. Zum Beispiel. Gehe zum Schrägstrich, um Dos Schrägstrich zu machen. Das ist Todo ID. Wir erhalten Daten, die mit der ID Nummer 1 zu tun haben. Wenn ich hier sieben tippe, wirst du sehen, dass ich jetzt Benutzer-ID eins, ID sieben und verschiedene Daten habe. Wenn es vier sein wird, werden es andere Daten sein. Wenn es so etwas sein wird, werden Sie nichts sehen, weil es ihren API-Server nicht existiert . Dieser, auf den wir gerade zugreifen, ist tatsächlich eine API für die zugrunde liegende Datenbank dass es unter der Haube benutzt. Okay, und es folgt dem Restmuster. Sie können hier zur Hauptwebsite navigieren. Und Sie können nach anderen Endpunkten suchen , die auf dieser Ressource verfügbar sind. Zum Beispiel können Sie hier Ressourcen sehen. Wir können zu Posts gehen, wir können zu Benutzern gehen, wir können zu Alben gehen. Und Sie können sehen, dass sie alle unterschiedliche Endpunkte haben. Auch dies liegt daran, dass es nach der Ruheimplementierung folgt. Stellen Sie sich ein großes Haus mit vielen Türen vor. Ein großes Haus ist also der Server, der API-Server. Und diese Türen sind und Punkte , auf die Sie zugreifen, um Daten zu erhalten. Und diese Daten werden im JSON-Format übertragen. Weil es sehr einfach ist, dieses Format zu verstehen. Es ist sehr leicht und einfach zu lesen oder zu schreiben, aber Rest ist nicht die einzige Serverimplementierung , die es in freier Wildbahn gibt. Es gibt eine andere, die gerade sehr beliebt ist , der GraphQL heißt. Und es gibt offensichtlich die anderen. Also, aber derzeit derzeit hauptsächlich zwei Typen, Rest API und GraphQL API. Graphql ist gleichzeitig eine Sprache und gleichzeitig die Serverimplementierung, die Architektur. Lassen Sie uns also in Google oder vielleicht GraphQL Explorer nach GraphQL suchen . Es bringt uns zu dieser GitHub Docs-Seite GraphQL API. Und das wird es, wir werden auf dieser Seite landen. Ich muss mich anmelden, um es benutzen zu können. Also melde ich mich mit meinem Konto an. Wenn Sie vorerst kein GitHub-Konto haben, ist es in Ordnung. Schau dir einfach das Video an. Das ist also GraphQL-Sprache. So sieht es aus. Um Daten vom GraphQL Server anzufordern, müssen wir eine Ko-Variation wie Dad in diesem Format nach der QL-Sprache des Graphen senden . Wenn ich es also senden werde, werden Sie sehen, dass ich Daten in diesem Format bekomme und es ist JSON-Format, wie Sie sehen können. Was ist also der Unterschied zwischen grafisch und Ruhe? Nun, zuerst hat die Rest-API, genau wie ich bereits erwähnt habe, genau wie ich bereits erwähnt habe, mehrere Endpunkte. Zum Beispiel Slash Todos. Wo ist es? Slash-Kommentare, Alben, Fotos und Aufgaben. Um auf Daten zugreifen zu können, muss Ihre URL unterschiedlich sein, um auf verschiedene Ressourcen zugreifen zu können. Aber GraphQL, es ist etwas anders. Wenn ich auf Inspect klicke und hier zur Registerkarte Netzwerk gehe, wenn ich auf diesen Play-Button klicke, sehen Sie die URL, auf die zugegriffen wird, nämlich Slash GraphQL-Schrägstrich-Proxy. Und wenn ich eine andere Anfrage ausführe, ändert sich die URL nicht. Nun, die GraphQL-Serverimplementierung hat nur einen Endpunkt , über den alle Anfragen durchlaufen um zu verstehen, was der Benutzer abgelehnt was wir vom Server wollen. Wir senden diese Ko-Variation an den Server. Wenn wir beispielsweise auf einer neuen Registerkarte zu Referenzen und Abfragen navigieren . Lassen Sie uns also nach dem Benutzer suchen und es erwartet ein Argument. Versuchen wir es mit dieser Abfrage. Also werde ich das alles entfernen. Ich gebe den Benutzer ein, genau wie es hier heißt. Und wir müssen ein Argument vorbringen. Sie geben ein Argument vor. Wir müssen Klammern öffnen und wir bringen dieses Argument hier vor. Login ist das Argument des Typs string. Wir geben meinen Spitznamen hier drüben. Jetzt müssen Sie in geschweiften Klammern angeben, welche Art von Daten wir erhalten müssen. Also wird es Login sein. Wenn ich es so ausdrücke. Nun, ich habe im Grunde die gleichen Informationen, aber die Abfrage ist anders und ist zu diesem Zeitpunkt dieselbe. Hast du den Unterschied schon entdeckt? Nun, der Unterschied, der Hauptunterschied zu GraphQL und Rest API besteht darin, dass GraphQL nur Daten sendet, nach denen Sie fragen, oder? Also bitte ich hier nur um Login in meiner Anfrage. Diese Abfrage wird also tatsächlich als Schema bezeichnet, das Sie vom Server anfordern. In Ordnung, also fordere ich dieses Schema nur Login einzuloggen und ich bekomme nur wieder zur Rest-API. Wenn wir zu Posts gehen, habe ich nach Beiträgen gefragt. Ich gebe nicht an, welche Felder ich aus der Pose abrufen möchte. Dies liegt an dem Server, zu entscheiden , dass Server Titel und Körper zentriert, und das können wir nicht ändern. In Ordnung, wenn ich auf Beiträge mit dieser ID zugreife, gibt es mir Titel und Text. Aber mit GraphQL kann ich angeben, welche Felder ich vom Server abrufen möchte, wenn wir zu den Hunden navigieren. Also loggen Sie sich ein, tatsächlich gibt diese Abfrage uns Typ User zurück. Wenn wir es öffnen, hat der Benutzer viele Felder und wir können tatsächlich Intelligenz von GraphQL verwenden. Also drücke ich einfach die Steuertaste. Und hier habe ich Bio Control Space hier Ich habe vielleicht Namen hier ich habe mich eingeloggt. Sie können also sehen, dass ich die Abfragesprache verwende , um anzugeben, welches Feld ich abrufen möchte. Und wenn ich auf Play klicke, um die Abfrage zu senden, sehen Sie jetzt, dass ich mein benutzerdefiniertes Daten-Shape habe , das in der Abfrage angegeben ist. Ziemlich cool. Das ist also der Hauptunterschied. Und du wirst wahrscheinlich denken, dass GraphQL ist, Oh mein Gott, Es ist erstaunlich. Warum brauchen wir überhaupt Rest-APIs? Das Problem dreht sich alles um die Implementierung und ihre Komplexität. Graphql wurde vor einigen Jahren von Facebook erstellt und es wurde sehr populär. Rest-API ist jedoch eine ausgereiftere und kampfgetestete Lösung. Graphql ist schwer. einfach ist es nicht. Es ist einfach, Graph kill zu konsumieren, aber um GraphQL zu implementieren, bedarf es guter Kenntnisse. Rest-API ist einfacher, einfacher zu implementieren und im Vergleich zu GraphQL-Glückwunsch intuitiver. Jetzt weißt du, was eine API ist. Wir sehen uns im nächsten. 20. Client (SPA) VS. Server (dynamisch und statisch): Hey, in diesem Video möchte ich über clientseitige und serverseitige Apps sprechen . Warum interessiert es uns und warum ist es wichtig, den Unterschied zu verstehen? Lass uns zuerst gehen. Lass mich meine kleine Leinwand öffnen, die ich vorbereitet habe. Oben hier haben wir drei Haupttypen des Renderings im Web. Das erste ist das serverseitige Rendern, bei dem es sich um ein serverseitiges Routing handelt. Dann haben wir clientseitiges Rendern, das clientseitiges Routing verwendet. Und dann haben wir einen hybriden Ansatz , der beides kombiniert. Der beste Weg, um den Unterschied zwischen diesen drei zu verstehen , ist die Betrachtung der Beispiele. Und genau das werden wir tun. Wenn ich hier zum Browser gehe, habe ich zwei Websites vorbereitet, Steam-Website und Netlify. Beide sind serverseitige Rendering-Apps. Und woher wissen wir davon? Wenn wir mit der rechten Maustaste auf die Seite klicken und zur Seitenquelle aufrufen , sehen wir hier das Markup. Wenn wir also das Markup in der Seitenquelle sehen, bedeutet dies, dass die Seite serverseitig gerendert wird. Das ist es, was Sie hier sehen, wurde vom Server zurückgegeben, wenn ich auf diese URL zugreife. Außerdem enthält jede Seite eindeutige Met-Angriffe. Das bedeutet, wenn ich auf eine andere Seite gehe und Seitenquelle dieser Seite anschaue, die Meta-Tags anders und das Markup wird für jede Seite auf der Website eindeutig sein. Jetzt haben wir ein zweites Beispiel, Netlify. Es verwendet auch serverseitiges Rendern. Wenn ich die Seite anschaue, habe ich genau das gleiche Bild. Ich habe einzigartige Meta-Tags und ich habe das Markup. In Ordnung? Aber Netlify ist anders. Die Sache ist, dass Netlify statische Seiten oder statisches serverseitiges Rendern verwendet, während Steam dynamisches serverseitiges Rendern verwendet. Was ist der Unterschied? Der Unterschied besteht darin, dass im Falle von Netlify alle diese Seiten nur statisch sind sich nicht ändern. Dies bedeutet auch, dass jede Seite auf der Netlify-Website eine eigene HTML-Datei hat. Wenn ich zur Preisseite gehe, hat die Preisseite eine eigene HTML-Datei, genau wie die Homepage oder jede andere Seite. Was ist mit Dampf? Dampf, etwas anders. Es verwendet dynamisches serverseitiges Rendern. Es bedeutet, dass diese Seite, zum Beispiel Spielseite, nur eine Skelettseite ist. Es hat die Vorlage, die zum Rendern von Spielen verwendet wird. Wenn ich also auf eine andere Seite gehe, kannst du sehen, dass es genauso aussieht. Das einzige, was geändert wurde, sind die Informationen auf der Seite, aber das Layout ist das gleiche. Und dieses Layout ist das Skelett, das verwendet wird, um Daten dynamisch in dieses Skelett einzufügen. Und genau das macht Dampf. Für all diese Spielseiten haben sie also nur ein Skelett. Und dieses Skelett wird wiederverwendet , um die Daten dynamisch einzufügen. Es wird dynamisch genannt, da der Server jedes Mal ich eine Anfrage zum Zugriff auf diese Seite sende, , wenn ich eine Anfrage zum Zugriff auf diese Seite sende, dynamisch HTML-Markup erstellt und dann an mich zurücksendet, um abzulehnen. Deshalb ist jede Seite jede Seite anders. Es hat ein eindeutiges Markup, da es dynamisch auf dem Server erstellt oder zusammengestellt wurde . Im Gegensatz zu statischen Seiten wird das HTML-Markup zum Anforderungszeitpunkt nicht zusammengestellt , wenn ich auf diese Seite zugreife. Markup wurde zusammengestellt, als die Anwendung erstellt wurde. Es wurde also einmal erstellt und jetzt jedes Mal, wenn ich auf diese Preisseite zugreife, sendet es nur das statische Markup da es sich nicht ändert. Ordnung, Der Nachteil bei statischen Seiten ist, dass wir, In Ordnung, Der Nachteil bei statischen Seiten ist, dass wir, wenn wir etwas an unserem statischen Inhalt ändern müssen, die App neu erstellen, HTML-Seiten regenerieren und sie dann wieder zum Hosting hochladen müssen. Jetzt gelten sie als aktualisiert. Beim serverseitigen Rendern ist dies nicht der Fall. Sie haben das Skelett und die Daten werden dynamisch eingefügt. Dies bedeutet, dass Daten, die aus der Datenbank abgerufen wurden und dann basierend auf diesen Daten HTML zurückgegeben werden. Du musst nichts ändern. Sie müssen keine Seiten regenerieren oder irgendetwas tun. Nur wenn Sie das Layout oder das Skelett ändern müssen. Nur in diesem Fall muss es erneut bereitgestellt werden, muss es erneut bereitgestellt werden um alle Änderungen an diesem Skelett widerzuspiegeln. Gehen wir zum zweiten Typ, bei dem es sich um das clientseitige Rendern handelt, oder häufiger als Einzelseiten-Apps als PA bezeichnet. Was sind diese Websites? Hier habe ich auch zwei Beispiele vorbereitet. Telegramm, Webversion. Und diese Snapshot-Website , die übrigens mit React erstellt wurde. Wenn ich also Telegramm, Seitenquelle anzeigen, überprüfe ich, dass ich hier überhaupt nichts habe. Wenn ich zum Body-Tag gehe, ist es völlig leer. Wenn ich jedoch Elemente der Seite anschaue, ist das Markup vorhanden. Was passiert hier? Vom Server? Ich bekomme diese Bär-HTML-Datei nur mit JavaScript-Paketen. Und JavaScript ist derjenige, der meine Seite rendert, wer erstellt das Markup? Wer erstellt den HTML-Code im Browser. diesem Grund wird es clientseitiges Rendern genannt, da JavaScript diejenige ist, die die Seite im Browser rendert , sobald wir diesen HTML-Code vom Server haben . Dies ist der Unterschied. Beim serverseitigen Rendern haben wir also bereits Markup zusammengestellt und vom Server im Voraus zurückgegeben. Aber bei einseitigen Apps oder mit clientseitigem Rendern haben wir das nicht. Wir haben ein Minimum an HTML und der Rest wird durch JavaScript im Browser zusammengestellt. Das war's. Es gibt jedoch einen sehr entscheidenden Nachteil einseitigen Apps oder beim clientseitigen Rendern. Es ist schlecht für SEO, das für Suchmaschinenoptimierung steht. Die Sache ist, dass wenn Sie möchten, dass diese Seite von Google oder Facebook eingestuft und gecrawlt wird , ist es immer besser, serverseitiges Rendern zu machen. Weil Crawler, was das Meer, sie sehen genau das, diese Seitenquelle. Sie sehen das Markup, sie sehen Matt-Angriffe. Und basierend auf diesen Markup- und Meta-Tags können sie ausführen und verstehen, worum es auf dieser Seite geht. Aber einseitige Apps, Crawler, sehen sie keine davon. Sie warten nicht darauf, dass JavaScript im Browser die Seite zusammenstellt und rendert. Sie sehen nur dieses leere Körper-Tag und diese grundlegenden mathematischen Angriffe. Wenn Sie also eine gute Suchmaschinenoptimierung benötigen, verwenden Sie serverseitiges Rendern. In Ordnung, jetzt haben wir dieses Konzept des serverseitigen Routing und des clientseitigen Routing. Was sind das? Und einseitige App. Sie können sehen, dass sich die URL ändert, wenn ich durch Seiten navigiere , aber meine Seite wird nicht aktualisiert. Dies wird als clientseitiges Routing bezeichnet, da es auf dem Client von JavaScript behandelt wurde. Dies bedeutet, dass JavaScript diejenige ist , die die URL ändert. Javascript ist derjenige, der die Seite rendert. Okay? Es sendet keine zusätzlichen Anfragen an den Server. Es ist alles im Browser erledigt. Anders als beim serverseitigen Routing können Sie, wenn ich zu einer anderen Seite gehe, sehen Sie, wenn ich zu einer anderen Seite gehe, sehen Sie, dass es aktualisiert wird , weil ich den Server bitte, mir diese Seite zur Verfügung zu stellen. Und das ist der Unterschied. Serverseitiges Routing ist also wenn Sie eine weitere Anfrage an den Server senden und mit einseitigen Apps mit clientseitigem Routing nach dieser Seite fragen . Dies geschieht alles innerhalb des Browsers ohne zusätzliche Anfragen. Okay, großartig. Jetzt wird die dritte Art des Renderings als Hybridansatz bezeichnet. Hybrider Ansatz ist am besten aus zwei Welten kombiniert werden. Wir haben serverseitiges Rendern, und wir haben clientseitige Navigation, clientseitiges Routing. Ein Beispiel wäre die Dokumentation von Netlify. Wenn ich also die Seitenquelle überprüfe, sehe ich das Markup und sehe eindeutige Met-Angriffe. Ziemlich cool. Wenn ich jedoch versuche, zu einer anderen Seite zu navigieren, können Sie die URL-Änderungen sehen. Die Seite wird jedoch nicht aktualisiert. also bei der ersten Anfrage auf Wenn Sie also bei der ersten Anfrage auf diese Website zuerst so zugreifen, sendet sie bereits zusammengestellte Markups vom Server an Sie, was bedeutet, dass es sich um serverseitiges Rendern handelt. Danach übernimmt JavaScript nach dem Laden der Seite die Kontrolle und Sie haben dieses Gefühl , wenn Sie auf der Webseite surfen. Ziemlich cool, oder? Im Moment ist der hybride Ansatz also sehr, sehr beliebt, weil er wiederum das Beste aus zwei Welten vereint. Sie können durch serverseitiges Rendern eine gute SEO-Optimierung haben, und Sie können beim clientseitigen Routing ein App-ähnliches Gefühl haben. Ziemlich cool. Was sind die Nachteile und Vorteile jedes Ansatzes? Also habe ich das schon erwähnt, aber das mache ich noch einmal. Der erste ist C0, das für Suchmaschinenoptimierung mit serverseitigem Rendern steht . COO ist das beste Ergebnis, COO ist das beste Ergebnis da Sie bereits damit gemeint haben, dass Angriffe zusammengestellt wurden. Sie haben bereits den Markup zusammengestellten Seiteninhalt. Und basierend auf diesen Informationen, Crawler wie Google Crawler, Facebook, Twitter-Trawler und andere Troller. Sie können Ihre Seite basierend auf diesen Informationen analysieren und Ihre Seite mit einseitigen Apps entsprechend einstufen. Dies ist nicht der Fall. Wenn ich die Seite anschaue, sehe ich nur ein sehr großes Minimum. Es gibt jedoch eine moderne Lösung um dieses Problem mit einseitigen Apps zu lösen. Und die Lösung besteht darin, eine einseitige App vorab zu rendern. Das bedeutet, dass jede Seite in einer einseitigen App in clientseitigen App in einer statischen HTML-Datei vorgerendert wird . Jede Seite hat also ihren eigenen HTML-Code. Und wenn Sie auf diese Seite zugreifen, werden Sie damit den statischen HTML-Code erhalten, der generiert wurde. Das macht Netlify. Netlify ist ein Hosting-Service, der einseitige Apps vorrendern , um sie SEO-optimiert zu machen. Dies ist eine wirklich großartige Lösung. Als nächstes haben wir ein App-ähnliches Gefühl. So verfügen serverseitige Rendering-Apps, insbesondere das serverseitige Routing, über diese Funktion nicht, über diese Funktion nicht da Sie sehen können, wann immer Sie navigieren, die Seite wird aktualisiert und Sie sofort verstehe, dass dies eine Website ist. clientseitigen Routing erhalten Sie jedoch ein App-ähnliches Gefühl, da die Seite nicht aktualisiert wird, genau wie wir die mobile Anwendung durchsuchen. Und der letzte Punkt ist, erfordert JS, serverseitig gerenderte App oder genauer gesagt statische Seiten. Sie bedeuten vielleicht überhaupt nicht JavaScript. Es kann sich um einen statischen Inhalt nur mit HTML und CSS handeln , der kein JavaScript benötigt. Aber einseitige Apps oder clientseitige Apps benötigen immer JavaScript, da alles mit JavaScript erledigt wird. Es ist wie der Kern clientseitiger Apps. Und wenn Sie JavaScript deaktivieren oder wenn es aus irgendeinem Grund nicht verfügbar ist , funktioniert der Apple einfach nicht im Training. Wir werden uns darauf abzielen, mit React einseitige Apps zu erstellen . Ich hoffe, es war klar und wir sehen uns im nächsten. 21. VS Code: Hi. In diesem Video werde ich Ihnen meine Verknüpfungen zeigen, die ich in V s Code verwende. Dies wird für alle nützlich sein. Konzentriere dich nicht auf die Kälte Gerade jetzt. In diesem Video handelt es sich um Verknüpfungen. Wir beginnen, indem Sie einen Projektordner für dieses Halten Control öffnen, als drücken Sie K plus o und wählen Sie dann den zu öffnenden Ordner aus. Und wir sind Einsicht. Jetzt müssen wir dafür terminalisieren. Sie können die Steuerung drücken, plus Tiled oder Control plus J T öffnen sich in stark Terminal Kichern zwischen verstecken und zeigen State Press Control plus Jay, Es gibt viele Situationen, in denen wir Codezeilen bewegen müssen, damit nur halten aus und drücken gehackte und untere Pfeile bewegt sie Linien Cordis zeigen Be dann müssen wir mehrere Registerkarten öffnen, um Datei in einem neuen Tab zu öffnen verwalten. Öffnen Sie einfach die Datei aus dem Explorer oder drücken Sie Steuerelement plus B für Riesco Charge Bar, Dann suchen Sie nach der Datei und drücken Sie die Eingabetaste, um zwischen Tabs zu wechseln. Halten Sie die Zahlen von 1 bis 9 aus und drücken Sie sie. Sie öffnete die entsprechende bestellte tippen Sie die meiste Zeit. Wir müssen es hinzufügen. Etwas in mehreren Zeilen. Mehrzeilenauswahl und helfen Sie uns, den Kurs oder an den richtigen Ort zu bewegen. Halten Sie die Kontrolle gedrückt, plus die oben- und untersten Pfeile nach oben und unten, um die Auswahl mit Löwen zu erweitern. Release Control Plus aus und jetzt sind wir in der Lage, Code im Multi-Line-Modus zu bearbeiten, halten, Shift und drücken Wiesen für einzelne Charakterauswahl waren halten Kontrolle und drücken Sie Pfeile um Autos oder zu den nächsten oder vorherigen Wörtern zu bewegen. Sie können Verschiebung und Kultur kombinieren, um die ganze Gemeinde auszuwählen. Wir können auch bestimmte Übereinstimmung für mehrzeilige Bearbeitung wählen, bewegen Sie Ihren Kurs oder auf die Station oder wählen Sie einige Zeichen Kontrolle und drücken Sie D. , halten Sie die Kontrolle und drücken Sie D. Präsident de Es wird Vorkommen zu der Auswahl hinzufügen, die dem Muster entsprechen. Wir können auch mehrere Registerkarten für die bequeme Steuerung der Presse erstellen, plus umgekehrter Schrägstrich, um diese Koreanisch in mehrere Wasserhähne zu teilen. Eigentlich kann das gleiche auf die Klemme innerhalb der Klemmenpresse und umgekehrter Schrägstrich angewendet werden, um mehrere Instanzen zu öffnen. Dies, was zwischen Instanzen halten und drücken Sie oben oder unten Pfeil und das ist es. Dies sind die wichtigsten Abkürzungen, die den Entwicklungsprotest erleichtern werden. Sie können immer Stempel Invesco Einstellungen waren hier unten anpassen. Wir sehen uns in der nächsten 22. Einführung in JavaScript: Hallo, Willkommen im JavaScript-Bereich. In diesem Abschnitt werden wir über die häufigsten JavaScript-Syntaxfunktionen sprechen . Wir werden die Grundlagen nicht behandeln, da wir all das während des Prozesses verstehen fortgeschrittenere und gebräuchlichere Muster anhängen werden und fortgeschrittenere und gebräuchlichere Muster anhängen werden. Wir müssen all das verstehen, um uns während der Entwicklung wohl zu fühlen. Hoffe, es wird dir gefallen. Wir sehen uns im nächsten. 23. Var VS. VS. Konst: Hallo, In diesem Video werden wir über verschiedene Arten von Variablen sprechen , die in JavaScript existieren. Dies sind var, let und const. In diesem Video werden wir den Unterschied zwischen ihnen und welchem Typ wir in dieser Situation verwenden müssen. Lass uns gehen. Wie wird das alles organisiert? Ich erstelle ein einziges Skript , das ich file gs benennen werde. Und dann führe ich dieses Skript mit Beispielen über das integrierte Terminal mit dem Befehl node file.js aus. Also bar, lass und const. Was ist der Unterschied? Lassen Sie uns vielleicht eine Variable vom Typ var erstellen und sie meinen Namen nennen. Dann werde ich nur console.log diese Variable. Und dann führen wir das Skript aus. Du wirst sehen, dass Andrew gedruckt wird, alles funktioniert. Was ist also der Deal mit dieser Variablen? Sie beschäftigen sich mit var ist, dass diese Art von Variable dem nächstgelegenen Funktionsbereich eingeschlossen ist. Um zu verstehen, dass wir diese Variable innerhalb einer Funktion erstellen müssen. Erstellen wir also eine Funktion. Druckt meinen Namen aus. Und in dieser Funktion werde ich var setzen. Und dann melde ich meinen Namen darin ein. Wenn ich jetzt das Skript ausführen werde, werde ich dich nichts sehen, weil es eine Funktion ist und ich muss es anrufen, meinen Namen ausdrucken. Großartig. Führen Sie das Skript nun erneut aus. Du wirst Andrew sehen, das Ergebnis ist das gleiche. Wenn ich das Konsolenprotokoll außerhalb des Funktionsbereichs platzieren werde, erhalte ich einen Referenzfehler. Weil mein Name im Funktionsbereich definiert ist. Es ist außerhalb davon nicht sichtbar. Deshalb haben wir einen Referenzfehler. Großartig, das verstehen wir. Wieder, was ist der Deal mit var? Traurig ist es dem nächstgelegenen Funktionsumfang beigefügt. Es bedeutet, dass es egal ist wie viele Bereiche ich in dieser Funktion habe, es wird überall sichtbar sein. Was ich meine ist, wenn ich eine Menge, sagen wir mal, wenn Blöcke hier, wenn fünf größer als einer sind, dann werde ich einen anderen in ihrem Blog erstellen , nur um Bereiche zu erstellen, okay? Wenn 10 weniger als 20 ist, wenn fünf größer als drei ist, spielt es keine Rolle, was ich hier mache. Ich möchte nur so viele innere Bereiche wie möglich erstellen. Und was ich jetzt tun werde, werde ich var, meinen Namen am meisten in ihrem Geltungsbereich einsetzen , und dann werde ich versuchen, auf meinen Namen in dieser Funktion zuzugreifen . Was glauben Sie ist, dass dieser Code wie erwartet in Arbeit geht und wir werden den Eintrag im Terminal sehen. Probieren wir es aus. Ich werde den Skriptknoten file.js erneut ausführen. Und wir sehen Andrew, nun, das ist unvorhersehbar. Wir möchten, dass diese Variable sich verhält, dass sie außerhalb des Bereichs, in dem sie definiert wurde, tatsächlich nicht sichtbar ist. Der Bereich, in dem diese Variable definiert wurde, ist also dieser innerste Block, wenn er definiert wurde, sagen wir in diesem Block, in diesem wenn hier drüben, dann wäre er überall sichtbar drinnen aber nicht außerhalb davon. Var ist wieder, ist dem nächstgelegenen Funktionsbereich beigefügt. Es spielt keine Rolle, wo oder in welchem Bereich ich die Variable vom Typ var innerhalb einer Funktion definiert habe, ihre Sichtbarkeit wird immer Funktionsbereich sein. Und das ist schlimm, weil es unvorhersehbar ist. Wir möchten immer sicherstellen, dass unsere Variable immer nur in dem Bereich sichtbar ist , in dem sie hier definiert wurde. Um dieses Problem zu beheben, haben wir Variablen vom Typ, let und const. Wenn ich also LED hier rüberlege, versuche ich, das Skript auszuführen. Es wird ein Referenzfehler angezeigt. Denn jetzt ist let auf den nächstgelegenen Bereich gerichtet, eigentlich auf den Bereich, in dem es definiert wurde. Und das Gleiche mit const. Wenn ich const hier rüberbringe und dieses Skript ausführe, wirst du das Gleiche wieder sehen. Mein Name ist kein definierter Referenzfehler. Um das zu beheben, müssen wir, um den Referenzfehler zu beheben, auf meinen Namen in diesem Bereich verweisen, in dem er verfügbar ist, was dies sein wird. Verschieben wir das Konsolenprotokoll in diesen Bereich. Und lass es uns nochmal versuchen. Sie werden sehen, dass der Eintrag ausgedruckt wird. Und jetzt ist dies vorhersehbar, weil wir wissen, dass diese Variable in diesem Bereich definiert ist und ihre Sichtbarkeit endet, wenn wir nach draußen gehen Wenn ich das Konsolenprotokoll in diesem Bereich einfüge, werden Sie sehen wieder der Referenzfehler. Oh, lass mich die Akte speichern. Sie werden einen Referenzfehler sehen, da dies außerhalb des Bereichs liegt. Wo ist mein Name definiert, oder? Dies ist der Unterschied zwischen Blei Const und Var Let und Const Art von Faserschalen. Sichtbarkeit endet mit dem umschließenden Bereich, während var mit dem nächstgelegenen Funktionsbereich endet. Wenn ich also eine andere Funktion innerhalb einer Funktion habe, sagen wir, Funktion hallo. Und dann definiere ich dasselbe. All das in Hello als var wird nur innerhalb der Hello Funktion sichtbar sein . Es wird nicht sichtbar sein, meinen Namen zu drucken, sondern auf Hallo. Alles klar, ich schätze, es ist klar. Was ist dann der Unterschied zwischen let und const? Lassen Sie sich diese Art von Variable ändern, die tendenziell neu zugewiesen wird. Nehmen wir an, ich habe meinen Namen erstellt und möchte ihn dann in Zukunft neu zuweisen. Vielleicht möchte ich jetzt, wie wertvoll nicht Andrew, sondern etwas anderes ist. Was ich also tun würde, würde ich das wertvoll neu zuweisen. So wird mit Namen jetzt John. Und wenn ich das Protokoll John konsolen will, werden Sie tatsächlich John nicht Eintrag sehen , weil es jetzt einen anderen Wert hat. Geben wir ein, das neu zugewiesen werden kann. Bei const ist es jedoch nicht. Lass es mich speichern und das Skript ausführen. Sie werden die Zuweisung zur konstanten Variablen sehen , weil const konstant bedeutet, etwas, das sich nicht ändert, wenn ich es doppelt meines Namens erstelle und als Eintrag einfüge, bedeutet, dass es sich nicht ändert. Es wird immer Andrew sein. Schon wieder. Lassen Sie sich neu zuweisen. Wenn Sie eine Variable, meinen Namen und dann in Zukunft erstellt haben, wenn Sie sicher sind , dass Sie sie umbenennen werden, verwenden Sie Lead, da Lead neu zugewiesen werden kann , wenn Sie nicht möchten, dass sich diese Variable ändert Sie sind sicher, dass der Wert , den Sie dieser Variablen zuweisen, so bleibt. Benutze const. In der Praxis haben die meisten Variablen den const-Typ. Und diese Variablen, von denen wir wissen, dass wir sie neu zuweisen werden. Wir werden lat benutzen, aber ansonsten const, und wir benutzen nie var. Um es schnell zusammenzufassen, ist Draht ein Datentyp von itable, was die Fähigkeit war, der nächste Funktionsumfang ist. Es spielt keine Rolle, wie meisten diese Variable definieren würden. Es wird weiterhin im Funktionsbereich sichtbar sein. Und wie let und const werden let und const auf den nächstgelegenen Bereich gerichtet, in dem sie definiert sind. Lassen Sie diese Art von Variable neu zugewiesen werden und const ist konstant. Wenn Sie eine konstante Variable erstellen, wird diese später nicht geändert. Es gibt jedoch noch einen kleinen Trick mit const, und dieser Trick sind Objekte. Wenn Mein Name also ein Objekt sein soll, kann dieses Objekt geändert werden, aber Sie können den Typ nicht von Objekt zu etwas anderem wechseln . Was ich meine ist, wenn mein Name, definiere ich ihn als Objekt und später möchte ich es in John ändern. Ich werde den Auftrag zum ständigen Kampf haben. Aber wenn ich sagen möchte, modifizieren Sie das Objekt selbst, geben Sie ihm einen neuen Schlüssel. Zum Beispiel wird mein Name Punkt etwas Hallo sein. Und dann gehe ich zur Konsole meinen Namen protokollieren. Sie werden das Objekt sehen, das einen Schlüssel hat, etwas mit dem Wert Hello. Daran musst du dich erinnern. In diesem Fall werden Sie also nicht direkt nach doppeltem Typ modifiziert, sondern ändern das Objekt selbst. Jetzt kennen Sie den Unterschied zwischen verschiedenen Arten von Variablen. Ich sage es noch einmal. In der Praxis werden die meisten unserer Variablen vom Typ const sein. Und für jene Variablen, die sich tendenziell ändern, verwenden wir den LED-Typ. Wir werden VAR niemals benutzen. Wir sehen uns im nächsten. 24. Was ist Array.map verwendet?: Hi, in diesem Video sprechen wir über Array-Dot-Map. Die Array-Punkt-Map-Methode ist alle JavaScript-Arrays verfügbar. Es wird verwendet, um ein Array von Elementen zu iterieren, und es wird verwendet, um jedes Array-Element in etwas anderes umzuwandeln . diesem Grund ist die Name-Array-Punktmap. Sehen wir es uns an einem Beispiel an. In file.js. Ich werde ein neues Array erstellen, das ich hallo nennen werde und es 4326 sein lasse. Nehmen wir an, ich möchte über dieses Array iterieren. Ich möchte, dass Sie einfach jedes Array-Element konsolenprotokollieren. Im Allgemeinen kann ich das mit der traditionellen Art erreichen , dies mit der for-Schleife zu tun, aber wir können jetzt eine Radarkarte verwenden. Also werde ich Hello Dot Map setzen. Und sobald ich Klammern öffne gibt mir der VS-Code die Beschreibung. Sie können sehen, dass die Dot-Map-Methode eine Callback-Funktion erhält. Und das zweite Argument ist dieser Bogen. In diesem Arc geht es um das Schlüsselwort, dieses Schlüsselwort in JavaScript. Das werden wir nicht anfassen. Wir sind daran interessiert. Die Callback-Funktion. Callback ist die Funktion, die als Argument an eine andere Funktion übergeben wird. Da wir also eine Funktion an die Map-Funktion übergeben werden, rufen wir sie deshalb auf, rufen Sie zurück. Alles klar, ich denke, es ist klar, dass wir den Wort-Callback oft verwenden werden. Dieser Callback erhält also drei Argumente. Das erste Argument ist Wert, dann haben wir Index und Array. Und lassen Sie uns die Funktion eingeben. Und wenn ich Klammern wieder öffne, sehe ich Wert, Index und Array. Wert ist also der Wert des aktuellen Elements. Die Sache ist, dass die Dot-Map-Methode über ein Array iteriert. Dieser Callback, den wir an die Dot-Map-Methode übergeben , wird für jedes Array-Element ausgeführt. Wenn wir also insgesamt vier Elemente in diesem Array haben, bedeutet dies, dass diese Callback-Funktion für jedes Array-Element und jeden Wert viermal ausgeführt wird . Das erste Argument im Callback wird aktuelle Wert sein, über den wir iterieren. Zum ersten Mal, dass dieser Callback ausgeführt wird, wird der Wert sein, zum zweiten Mal wird der Wert drei sein, und so weiter bis zum allerletzten Element. Das zweite Argument hier ist der Index, und es wird der Index des aktuellen Array-Elements sein. Für das erste Element wird es also 0 sein, da Arrays in Programmierung mit 0 Index beginnen. Es wird also 0, 1, 2 und 3 sein . Nennen wir es idx. Und das dritte Argument wird das Array sein. Und es wird dasselbe Array sein für das wir diese Dot-Map-Methode angewendet haben. Also sagen wir es so, und ich werde in diesen Callback innerhalb dieser Funktion eingehen. Lassen Sie uns eigentlich console.log, Wert, Index und Array. Und jetzt versuchen wir, die Skriptknotendatei HGS auszuführen. Und was wir sehen, also geht zuerst der Wert. Wie Sie für drei bis sechs sehen können, sehen wir alle unsere Array-Elemente, was korrekt ist, weil dieser Callback wieder für alle Array-Elemente ausgeführt wird. Die zweite Spalte, die wir sehen, ist der Index dieses Elements. Also für hat 0 Index, das sehen Sie im Terminal. Und das letzte Element wird Index drei haben , weil dies das letzte Element ist und wir wissen, dass Arrays mit 0 Index beginnen, was korrekt ist. Und der dritte Wert wird das Array selbst sein , auf das diese Dot-Map-Methode angewendet wurde. Dies ist jedoch nicht die wahre Macht der Punkt-Plot-Methode. Es wird verwendet, um jedes Array-Element in etwas anderes umzuwandeln . Und sie nahmen Map-Methode erzeugt einen neuen Wert. Es produziert ein neues Array. Es bedeutet, dass ich es in eine Variable schreiben kann. Also werde ich const result gleich hello.mat setzen. Und dann kann ich tatsächlich console.log Ergebnis haben, um zu sehen, was ich habe. Wenn ich dieses Skript ausführe, habe ich ein Array von vier Elementen, bei denen jedes Element nicht definiert ist. Warum ist es undefiniert? Nun, die Sache ist, dass die Map-Methode erwartet, dass wir einen Wert von dieser Funktion aus diesem Callback zurückgeben einen Wert von dieser Funktion aus diesem Callback zurückgeben. Und der Wert, den wir zurückgeben, wird als neuer Wert für das aktuelle Element festgelegt. Wenn wir nichts von einer Funktion zurückgegeben haben, gibt diese Funktion standardmäßig nichts von einer Funktion zurückgegeben haben, undefined zurück. Deshalb haben wir überall undefiniert. Versuchen wir, Return for vom Rückruf zu setzen. Kannst du raten, was der Wert sein wird? Ich werde dieses Skript ausführen und jetzt wird es 4, 4, 4, 4 sein. Nun, auch hier diese Callback-Funktion für jedes Array-Element ausgeführt. Und für jedes Array-Element kehren wir zurück, wenn ich den Wert multipliziert mit zwei einsetze, können Sie das Ergebnis jetzt erraten? Mal sehen. Jetzt haben wir 864 und 12. Im Grunde genommen haben wir jedes Array-Element einfach mit zwei multipliziert. Weil dieser Callback noch einmal für jedes Array-Element ausgeführt wird. Zum ersten Mal. Es wird für das erste Element ausgeführt, das vier ist, Wert wird für sein, Wert wird mit zwei multipliziert, wir geben acht zurück, was bedeutet, dass im Rückgabewert für die Map-Methode für das erste Element, wir haben Wert 8. Das ist es, was wir sehen. Das Gleiche gilt für das zweite Element. Dieser Callback läuft. Der Wert wird 3 sein. 3 multipliziert mit 2 ist 6 für das zweite Element. Jetzt haben wir sechs und so weiter bis zum allerletzten Element. Und das war's. Dies ist eine Wortarray-Punktmap, für wir es oft verwenden werden, insbesondere in React, aber wir müssen ein Array zuordnen , um Markup zu reagieren. Deshalb ist es sehr wichtig die Map-Methode zu verstehen. Das war's. Und wir sehen uns im nächsten. 25. Was ist Array.reduce: Hey, in diesem Video werden wir über eine Redoxreduzierung sprechen, genau wie ein Radar-Map-Array-Punkt , der Iterate über Elemente eines Arrays reduziert. Es macht jedoch grundsätzlich eine andere Sache, wenn Array-Dot-Map verwendet wird, um jedes Array-Element einem anderen Wert zuzuordnen, Array dot Reduce wird verwendet, um alle Array-Elemente in einen einzigen Wert zu komprimieren oder zu reduzieren. Sehen wir es uns an einem Beispiel an. Wenn wir zu File GS zurückkehren, werden wir hier ein neues Array erstellen, hallo, das sieben sein wird. 6945 vielleicht. Großartig. Jetzt können wir die Dot-Reduce-Methode auf die gleiche Weise verwenden , wie wir die Map-Methode verwenden, was bedeutet, dass wir hallo dot reduce eingeben können. Und genau wie bei Dot Map müssen wir eine Callback-Funktion bereitstellen. Diesmal erhält die Callback-Funktion jedoch verschiedene Argumente. Wir haben also vorherigen Wert, aktuellen Wert, aktuellen Index und Array. Versuchen wir also zu sehen, was sie sind. Also liefern wir den Rückruf und öffnen wieder Klammern für den IntelliSense. Und wir haben den ersten vorherigen Wert, den aktuellen Wert, den aktuellen Index und das Array. Genau wie bei Dot Map führt Dot Reduce diesen Callback für jedes Array-Element aus. bedeutet, dass dieser Callback für jedes Element fünfmal ausgeführt wird . Deshalb wissen wir, was aktueller Index und Array sein werden. Genau wie in Dark Map wird Array das gleiche Array sein, das wir für diese radius-Methode verwenden. Und der aktuelle Index wird der Index des aktuell iterierenden Elements sein , der 01234 sein wird. Wir brauchen sie nicht. Das einzige, was wir brauchen, ist vorheriger Wert und aktueller Wert. Meistens ist der vorherige Wert jedoch kein kalter vorheriger Wert. Es heißt Akkumulator. Was ist Akkumulator? Wir werden uns in einer Sekunde unterhalten. Ich möchte nur erwähnen, dass die Methode dots Reduce auch ein zweites Argument neben dem Callback erwartet. Das zweite Argument ist der Anfangswert und es ist optional. Also lasst uns 0 setzen. Großartig. Was ist ein Akkumulator oder was ist dieser vorherige Wert? Die Sache ist, dass die Dot-Reduce-Methode funktioniert, indem jedes Array-Element komprimiert oder tatsächlich in Richtung des Endergebnisses akkumuliert wird. Es bedeutet, dass wir mit einem Anfangswert mit 0 beginnen. Okay? Wenn dann alle diese Callbacks für jedes Array-Element ausgeführt werden, ändert dies irgendwie unseren Anfangswert. In Ordnung? Und am Ende, beim allerletzten Callback-Lauf, haben wir das Ergebnis. Dies bedeutet, dass die Methode „dots Reduce “ auch einen Wert erzeugt, aber anstelle eines neuen Arrays eine einzige Ausgabe erzeugt. Vielleicht werden es also 15 sein, wir wissen es nicht. Da es also einen Wert erzeugt, platzieren wir ihn, lassen Sie es uns in eine Variable setzen. Also das const Ergebnis wird hallo dot reduzieren, und am Ende werden wir nur console.log Ergebnis sein. Großartig. Wenn wir nun versuchen, den Protokollakkumulator abzubrechen , und daneben werden wir aktuellen Wert konsolenprotokollieren. Und wir werden dieses Skript ausführen. Was wir sehen werden, die Ausgabe ist nicht ziemlich offensichtlich. Was haben wir? Wir haben zuerst 0 und dann Undefined, Undefined, Undefined Amplifying. Um uns nicht zu verwirren, haben wir tatsächlich fünf Konsolenprotokolle, die von den Callbacks stammen , und das letzte für das Ergebnis. Lass es mich so ausdrücken. Und wir führen es aus. Ja, perfekt. Warum haben wir also viele undefinierte Werte? Nun, beim ersten Lauf, wenn dieser Callback für den ersten Element47 Akkumulator läuft , wird unser Anfangswert sein, den wir hier angegeben haben. Deshalb sehen wir aktuelle Wert 0 das aktuelle Element sein wird, das ist sieben. Darum sehen wir 07. Was auch immer wir von diesem Callback zurückgeben, wird traurig sein , da der Akkumulatorwert für den nächsten Rückruf ausgeführt wird. Weil wir nichts von dieser Funktion zurückgegeben haben. Standardmäßig ist der Rückgabewert nicht definiert. Das ist der Grund, warum bei der nächsten Ausführung dieses Callbacks für das zweite Element, das sechs ist, Akkumulator undefiniert. Wenn wir einen für jeden nachfolgenden R1-Akkumulator zurückgeben , wird es immer einer sein, und der endgültige Wert wird auch eins sein. Wenn ich das Skript ausführe, kannst du es selbst sehen. Wir haben immer Akkumulator auf eins eingestellt, aber das ist sehr gedumpt. Wir wollen tatsächlich etwas damit machen. Wie wir Punkt reduziert verwenden können, um etwas Reales zu tun, können wir tatsächlich die Methode „Punkte reduzieren“ verwenden, um die Summe aller unserer Elemente zu finden. Wir können tatsächlich Akkumulator plus Stromwert eingeben. Und das war's. Das wird den Trick machen. Speichern wir es tatsächlich und schauen wir uns an, was gedruckt wird. Wir sehen, dass das Ergebnis 31 ist. Aber wie wir damit gelandet sind, lassen Sie es uns aufschlüsseln. Für den ersten Lauf. Bei diesem Callback ist der Akkumulator auf 0 festgelegt, da unser Anfangswert 0 ist, der aktuelle Wert sieben sein wird. Also haben wir 0 plus 7. Das sehen wir hier drüben. Von diesem Rückruf werden also sieben zurückgegeben. Wir geben den ersten Lauf wird eine Return Seven sein. Dies bedeutet, dass der Akkumulator bei der zweiten Ausführung Callbacks für Element sechs dieses Callbacks für Element sechs dieser Rückgabewert aus dem vorherigen Lauf sein wird . Wir haben also Akkumulator gleich 27 beim zweiten Lauf für das zweite Element, und wir haben sieben plus aktuellen Wert. Also haben wir 7 plus 6, wir haben 13, was bedeutet , dass wir ab dem zweiten Lauf 13 zurückgeben. Bei der dritten Ausführung dieses Callbacks für Elemente neun wird der Akkumulator 13 sein, da wir aus dem Callback für den vorherigen Lauf zurückgegeben werden . Vier Elemente, 613, Deshalb sind es jetzt 13. Also 13 plus aktueller Wert wird 13 plus 9 sein werden 22 sein. Wir kehrten 22 zurück. Für das vierte Element Akkumulator ist 2222 plus vier werden 26 sein. Rückkehr 26 zurück. Und für das letzte Element haben wir Akkumulator 26. 26 plus fünf werden 31 sein. Und das wird unser endgültiger Wert sein. Unser endgültiger Wert, den wir in der Ergebnisvariablen haben, wird also der Wert sein , der vom allerletzten Rückruf der Dots Reduce-Methode zurückgeben würde allerletzten Rückruf der Dots Reduce-Methode zurückgeben , die breit ist. Dieses erste Argument wird Akkumulator genannt , da dieser Wert genau wie Sie gerade beobachtet haben, über alle Callbacks angesammelt wird , die wir in der Dot-Reduce-Methode haben. Es ist ein sehr flexibles Tool und zunächst ist es wirklich schwer zu verstehen, wie Punkte reduzieren funktioniert, aber vertrauen Sie mir, es ist sehr flexibel. Ein anderes Beispiel wäre, wenn wir aus diesem Array ein neues Objekt erzeugen müssen. Zum Beispiel wollten wir dieses Objekt haben, bei dem der Schlüssel der Index des Elements sein wird und der Wert abgewertet wird. Also zum Beispiel wird Element 0 sieben sein, Element eins wird 6 sein, das zweite Element wird 934 und vier fünf sein, oder? Angenommen, wir müssen dieses Array in dieses Objekt umwandeln. Das ist also unser gewünschtes Ergebnis. Wir können tatsächlich punktreduzierte verwenden, um dies zu erreichen. Lassen Sie mich diese Commons entfernen und sehen, wie wir das angehen können. Wir wissen also, dass wir am Ende ein Objekt erhalten müssen. Bevor wir die Summe berechnet haben, wissen wir, dass unser endgültiger Wert eine Zahl sein wird. Deshalb haben wir 0 hier rübergebracht. Aber jetzt, da es ein Objekt sein wird, wir hier ein leeres Objekt platzieren. Dies wird unser Ausgangspunkt sein. Akkumulator für den ersten Lauf wird ein leeres Objekt sein. Der aktuelle Wert bleibt immer noch der Wert, den wir in unserem Array haben. Um dieses Ergebnis zu erzielen, müssen wir also tatsächlich Werte innerhalb dieses Objekts zusammenführen. Da wir mit Objekten arbeiten müssen, müssen wir ein Objekt aus diesem Callback zurückgeben , da dies unser Akkumulator ist. Unser Endergebnis ist wieder ein Objekt. Deshalb ist unser Akkumulator ein Objekt. Also kehren wir zurück und wir müssen ein Objekt zurückgeben. Um Objekte zusammenzuführen, müssen wir Object Dot Assign eingeben. Das erste ist also das Ziel. Und hier werden wir einen Wert liefern, der mit diesem Objekt zusammengeführt wird. Aber bevor wir es zusammenführen können, müssen wir das Objekt tatsächlich erstellen, oder? Also werden wir const setzen, sagen wir mal gemapptes aktuelles Element. Und lasst es uns zuerst als leeres Objekt ausdrücken. Und dann müssen wir diesen einzelnen Wert schaffen, der darstellt unser aktuelles Element innerhalb des Endergebnisses darstellt. Wir möchten also, dass dieses Map-aktuelles Element dieses Objekt ist. Für das erste Element wird es also 0, 7 sein. Wir möchten, dass das gemappte aktuelle Element von dieser Form ist, und wir werden dieses Objekt in unseren Akkumulator zusammenführen. Also müssen wir irgendwie erreichen, dass wir tatsächlich gemapptes aktuelles Element eingeben können. Dann müssen wir den Index unseres Elements benutzen. Jetzt können wir unser Argument hier setzen und es aktuellen Index nennen. Sag es so aus. Auf diese Weise können wir referenzieren, dass der aktuelle Elementpunktstromindex gleich dem aktuellen Wert entspricht. Und diese Linie wird uns dieses Ergebnisraster bringen. Jetzt haben wir dieses Ergebnis mit unserem akkumulatorgemappten aktuellen Element zusammengeführt , und jetzt werden wir unser gewünschtes Ergebnis erzielen. Schauen wir es uns an. Knotendatei gs. Und heute haben wir 0 Elementwert 7, ersten Elementwert sechs Sekunden, 9, dritte, vierte, 45, Klasse. Alles so wie ich wollte. Was ist eigentlich hier passiert? Versuchen wir es und console.log Akkumulator. Nun, und wie Sie sehen können, ist dies ein wirklich großartiges Beispiel aus dieser Ausgabe. Sie können sehen, wie sich der Akkumulator bei all diesen Callback-Räufen tatsächlich ansammelt. Also haben wir zuerst für den ersten Lauf dieses Callbacks unser leeres Objekt gehalten, oder? Deshalb sehen wir hier ein leeres Objekt. Dann haben wir dieses Element hier erstellt, was das ist, und dann haben wir es zu einem leeren Objekt zusammengeführt. Das kehren wir also vom ersten Lauf zurück. Beim zweiten Durchlauf haben wir dies mit dem ersten Objekt zusammengeführt, was zu diesem Objekt mit 76 und so weiter bis zum allerletzten Element. Am Ende haben wir also unser gewünschtes Ergebnis. Ziemlich genial. Dot Reduce ist sehr leistungsstark und sehr flexibel. Es ist wichtig zu verstehen, dass Dr. US ziemlich üblich ist, nicht so üblich wie die Dot-Map-Methode, aber dennoch sehr häufig verwendet wird. Ich weiß, dass es schwer zu verstehen ist. Punkte reduzieren sich ganz, wenn du es zum ersten Mal siehst, aber vertrau mir, nimm dir einfach etwas Zeit, experimentiere damit, spiele mit den verschiedenen Werten. Probieren Sie es selbst aus, versuchen Sie vielleicht die Konsolenprotokollierung Versucht, verschiedene Werte in einen Strahl einzufügen, versuchte, von hier aus verschiedene Werte zurückzugeben. Und Sie werden sehen, dass Sie nach einiger Zeit verstehen werden, dass Sie diesen Aha-Moment haben werden. Ich bin mir ziemlich sicher. Ich denke, das sind alle vier Punkte reduzieren Methode. Ich hoffe, es war klar. Ich habe versucht, es so weit ich konnte zu zerlegen und der Rest liegt an dir. Wir sehen uns im nächsten. 26. Funktionsdeklaration VS. Ausdruck: Hey, lasst uns über Funktionsausdruck und Funktionsdeklaration sprechen. Warum müssen wir den Unterschied wissen und was sind das? Dies wird eher ein theoretisches als ein praktisches Video sein. Aber ich denke, dass dies wichtig ist , um den Unterschied zu verstehen, obwohl B möglicherweise nicht benötigt wird. Unabhängig davon wird es Sie am Ende des Tages zu einem besseren Entwickler machen. Lasst uns gehen. Wenn ich also zurück zu Datei G, S gehe, deklariere ich eine Funktion. Ich nenne es Hallo, und drinnen werde ich das Protokoll abbrechen. Mein Name ist Andrew. Und unten erstelle ich ein wertvolles Hallo zu und zu dieser Variablen. Ich weise eine Funktion zu. Und drinnen werde ich drucken. Und du auch. Wie Sie sehen können, tun beide das Gleiche. Rufen wir sie an. Also rufen wir zuerst Hallo an und dann rufen wir Hallo zum Terminal an. Ich führe das Skript und die Ausgabe aus. Nun, es ist im Grunde das Gleiche, oder? Was ist also der Unterschied? Der Unterschied besteht darin, dass das erste Beispiel eine Funktionsdeklaration ist und das zweite Beispiel ein Funktionsausdruck ist. Das zweite Beispiel ist eigentlich ein variabler Ausdruck. Wenn ich also eine Variable einfüge und ihr einen Wert gebe, wird es ein Ausdruck sein. Das Gleiche können wir hier drüben beobachten. Wir weisen einer Variablen grundsätzlich eine Funktion zu. Anders als hier drüben. Hier machen wir Funktionsdeklaration. Der wichtigste Unterschied zwischen diesen beiden besteht darin, dass bei der Funktionsdeklaration keine Rolle spielt, wo wir das Funktionswetter definieren. Es ist oben oder ganz unten, aber mit Funktionsausdruck und spielt tatsächlich eine Rolle. Lasst uns beide am Ende setzen. Und rufen wir sie noch mal an. Ich führe dieses Skript aus. Und was ich sehe, die erste Funktion, die Funktionsdeklaration ist, durchgegangen und ich kann die Ausgabe sehen. Aber das zweite Beispiel, fehlgeschlagene Referenzfehler, kann vor der Initialisierung nicht auf Hello Tube zugreifen. Die Sache ist, dass hallo zwei ein Funktionsausdruck ist und JavaScript diese Funktion nur erstellen wird wenn JavaScript tatsächlich zu dieser Zeile geht, Funktionsdeklaration erstellt wird oder es wird zum Kotelett gehisst. In JavaScript gibt es dieses Konzept des Hisens, wenn Funktionsdeklarationen tatsächlich nach oben verschoben werden , bevor der Code ausgeführt wird. Deshalb spielt es keine Rolle, wo wir sie definieren. Der Code wird immer, die Sprache wird diesen Code immer so sehen, als ob die Funktionsdeklaration ganz oben wäre, genau so. Aber der Funktionsausdruck bleibt dort, wo er definiert wurde. Genau wie bei Variablen können wir tatsächlich auf Variable verweisen. Sagen wir Hallo, bevor es erstellt wurde. Wenn ich also unten hoch erstellen werde und wenn ich versuche, diesen Code auszuführen, gebe ich den gleichen Adder. Referenzfehler kann vor der Initialisierung nicht auf hoch zugreifen. Da dies also ein Ausdruck ist und das gleiche ist, das wir mit Hallo zu sehen sehen, ist dies ein Ausdruck und wir können nicht auf diesen Ausdruck zugreifen , bevor er hier oben erstellt wurde. Das einzige Problem dafür ist also, tatsächlich auf Hallo zuzugreifen, tatsächlich auf Hallo zuzugreifen nachdem wir diese Variable erstellt haben. Wenn ich es jetzt ausführen werde, werde ich in molaren JavaScript-Projekten keinen Fehler in der realen Welt sehen . Das ist eigentlich kein Ding. Sie werden ein solches Verhalten im Code nicht beobachten. Nun, weil dies hauptsächlich mit einfachem JavaScript zu tun hat und es immer gut ist, den Unterschied zu kennen und zu verstehen, oder? Aber in modernen Projekten, da wir Tools haben, die unseren Code verarbeiten, wird dieses Ding nicht stattfinden, aber wie gesagt, ist es gut und ich persönlich halte wichtig, den Unterschied zu verstehen. Um es schnell zusammenzufassen, ist Funktionsausdruck, wenn Sie Variablen eine Funktion zuweisen, es ist einfacher sich daran zu erinnern, ob Sie sich daran denken können, die Funktionsdeklaration immer mit Funktion als beginnt das erste Wort. Und Funktionsausdruck hat keine Funktion als erstes Wort weil das erste Wort, das wir hier haben, es einer Variablen zuweisen und Funktionsdeklarationen unabhängig von oben verschoben werden wo sie kurz vor dem Ausführen des Codes definiert werden. Und das war's. Wir sehen uns im nächsten. 27. Arrow und Default: Hey, sprechen wir in diesem Video über Pfeilfunktionen und Standardargumente. Lass uns gehen. Wenn ich zu file.js navigiere, erstellen wir eine einfache Funktionsdeklaration , die wir meinen Namen nennen. Und es wird Andrea drucken, was mein Name ist. Und lassen Sie uns ein zweites Beispiel erstellen , das eine Pfeilfunktion verwendet. Und die Pfeilfunktion ist an erster Stelle ein Funktionsausdruck, was bedeutet, dass er einer Variablen zugewiesen wird. Also werde ich const, meinen Namen, 2 gleich Klammern setzen , dann die Pfeilfunktion oder manchmal wird es eine Fettfunktion genannt. Und nach diesem Funktionskörper werde ich console.log setzen und zwei zeichnen. Wenn ich meinen Namen anrufe, wissen wir, was das Ergebnis sein wird. Aber wenn ich meinen Namen anrufe, wird es das Gleiche sein? Schauen wir es uns an. Knoten file.js. Und wir sehen, dass die Ausgabe vorhergesagt wird, weil es sich nur um eine Funktion handelt, aber es ist jetzt eine Pfeilfunktion. Was ist der Unterschied? Der erste Unterschied besteht darin, dass Pfeilfunktionen im Vergleich zu Funktionsdeklarationen eine leichtgewichtigere Syntax aufweisen leichtgewichtigere Syntax . Nun, die Sache ist, dass wir häufig Pfeilfunktionen verwenden werden, besonders im modernen JavaScript. Sie werden noch bevorzugter als Funktionsdeklarationen, die mit dem Schlüsselwort function beginnen . Es gibt nicht, weil die Syntax leichtgewichtiger ist, insbesondere wenn wir Callbacks liefern, zwei verschiedene Methoden. Es ist einfacher, eine Pfeilfunktion bereitzustellen. Wenn ich zum Beispiel Array-Punkt-Map verwende, ist es einfacher für mich, eine Pfeilfunktion bereitzustellen. Es ist leichter, eine Pfeilfunktion zu schreiben , anstatt Funktion und dann Klammern zu verwenden. Und jetzt sieht es aus wie Dad, es könnte sogar einige Leute verwirren. Irgendwann spielt es wirklich keine Rolle, welche, ob es sich um Funktionsausdruck oder Funktionsdeklaration handelt. Es spielt keine Rolle, denn am Ende des Tages wird unser Code von den Build-Tools verarbeitet , die sich um all das unter der Haube kümmern . Der zweite Unterschied hat etwas mit diesem Schlüsselwort in JavaScript zu tun . Wir werden diesen Anwendungsfall nicht mit dem Schlüsselwort dieses behandeln . Aber ich würde sagen, dass du wirklich zu Google gehen und es dir selbst ansehen solltest . Suchen Sie einfach nach Pfeilfunktionen, diesem Schlüsselwort. Und der dritte Unterschied besteht darin, dass Pfeilfunktionen es uns ermöglichen , eine noch kürzere Syntax als diese zu verwenden. Wenn wir einen einzelnen Wert aus einer Pfeilfunktion zurückgeben müssen , können wir die Verwendung der geschweiften Klammern weglassen , um den Funktionskörper anzugeben. Wenn mein Name zum Beispiel eine Zeichenfolge zurückgibt, Andrew, können wir ihn tatsächlich so schreiben, genauso wie wir es in meinem Namen haben werden. Also lass es mich schreiben. Gib Andrew zurück, und es wird keinen Unterschied geben, oder? Aber mit Pfeilfunktionen können wir es sogar kürzer machen. Also kopiere ich einfach die Zeichenfolge Andrew. Ich entferne geschweifte Klammern. Und ich werde einfach eine Zeichenfolge setzen, und jetzt wird nichts geändert, aber die Syntax ist viel, viel kürzer. Lassen Sie uns überprüfen, dass mein Name tatsächlich eine Zeichenfolge zurückgibt, Andrew, da er einen Wert zurückgibt, schreibe ich ihn in eine andere Variable. Nennen wir es m und dann console.log M. Great. Dann führe ich das Drehbuch wieder aus und du wirst Angio sehen, richtig. Dies ist es, was von meinem Namen zurückgegeben wird. Es ist sehr wichtig zu verstehen, dass die Funktion nichts zurückgibt, was bedeutet, dass sie undefined zurückgibt, wenn Sie es so schreiben die Funktion nichts zurückgibt, was bedeutet, dass sie undefined zurückgibt, . Lassen Sie mich dieses Skript ausführen und Sie werden undefiniert sehen. Nun, weil dies keine kurze Syntax ist, ist dies dasselbe wie das Schreiben, aber ohne das Schlüsselwort return. Daher ist es wichtig zu verstehen, dass Sie, wenn Sie kürzere Syntax benötigen oder verwenden möchten, immer daran geschweifte Klammern zu löschen. Und es ist auch wichtig zu verstehen, dass kürzere Syntax nur einen einzigen Wert zurückgibt. Wenn Sie innerhalb einer Funktion eine Aktion ausführen müssen, können Sie die kurze Syntax nicht verwenden da Sie in diesem Fall Ihren Code nirgends schreiben können. In diesem Fall müssen Sie hier eine Operation durchführen, oder? Richtig, Ihr benutzerdefinierter Code und dann am Ende würden Sie einen Wert wie diesen zurückgeben. Es gibt also keinen Unterschied, ob Sie es wie mit dem Schlüsselwort return tun oder ob Sie es mit der kürzeren Syntax tun, ist die gleiche. diese Weise schreiben Sie den Code wann immer möglich, versuchen Sie, eine kürzere Syntax zu verwenden. Es ist kürzer. Es gibt eine Sache, die ich zu dieser kurzen Syntax erwähnen möchte , ist, wenn Sie ein Objekt zurückgeben müssen. Wenn wir also eine Situation haben, wir ein Objekt zurückgeben müssen, zum Beispiel Name, Eintrag. Also dieses Objekt möchte ich von dieser Pfeilfunktion zurückkehren. Nun, mit dem Schlüsselwort return sieht es so aus. Aber wie es ohne das Schlüsselwort return aussehen wird, werden Objekte auch geschweifte Klammern haben und der Funktionskörper auch geschweifte Klammern haben. Wenn wir es so ausdrücken wollen. Sie werden einen Syntaxfehler sehen, denn nun, das sind falsche JavaScript-Dinge, die dies Funktion ist, aber es ist kein Objekt. Um dieses Problem tatsächlich zu beheben, müssen Sie das zurückkehrende Objekt einfach so in Klammern wickeln . Auf diese Weise wird es verstehen, dass Sie einen einzelnen Wert zurückgeben möchten , den Sie eine kürzere Syntax verwenden möchten, und Sie geben ein Objekt zurück , um zu überprüfen, mit dem Sie das Skript ausführen können. Und wir sehen, dass wir jetzt unser Objekt zurückgegeben haben. Toll, so gut, dass sie über Pfeilfunktionen sitzen. Wir werden sie oft nutzen. Sprechen wir über Standardfunktionsargumente. Nun, das ist eigentlich einfach. Es gibt viele Situationen, in denen wir Argumente an unsere Funktionen übergeben müssen . Zum Beispiel mein Name ist das einzige, was diese Funktion tun wird. Es wird das erste Argument, das wir liefern werden, konsolenprotokollieren . Und nennen wir dieses Argument meinen Namen. Also auf der Empfangsseite haben wir meinen Namen und dann drucken wir meinen Namen ist mein Name. Großartig. Wenn ich jetzt meinen Namen anrufe, lass mich den nicht benötigten Code entfernen. Wenn ich meinen Namen ausführe, ohne den Parameter für dieses Argument anzugeben. Nun, in diesem Fall wird Mein Name undefiniert sein, weil wir ihn nicht geliefert haben, oder? Wir haben keinen Wert für meinen Namen angegeben. Um zu überprüfen, ob wir sehen können, dass mein Name nicht definiert ist. Und es gibt viele Situationen, in denen wir in unserem Code und unseren Variablen unterschiedliche Umstände haben . Sie erzeugen keine erwarteten Werte. Sie bringen kein erwartetes Ergebnis, oder? In diesem Fall möchten wir sicherstellen, dass wir immer einen Fallback-Wert haben, um den Standardwert für dieses Funktionsargument anzugeben. Wir müssen einfach gleich setzen und dann einen Standardwert angeben. Ich weiß es nicht, John. In Ordnung, jetzt, wann immer ich dafür keinen Wert gebe, mein Namensargument John statt und wird als Fallback verwendet. Jetzt versuchen wir das Skript auszuführen und du wirst sehen, dass mein Name John ist, oder? Weil ich nichts übergebe. Dies wurde aufgegriffen und jetzt wird John verwendet und John wird gedruckt. Wenn ich Angio liefern will, wird John nicht anstelle von Andrew verwendet , weil Andrew nicht undefiniert ist. Es ist ein Wert, den wir für dieses Argument übergeben, oder? Führen Sie entweder das Skript aus. Jetzt sehe ich, dass ich Andrew heiße. Alles funktioniert gut. Wenn ich also undefined bleibe, was wird gedruckt? Richtig? John? Um zu überprüfen, dass wir wieder unter dem Skript stehen, heiße ich John. Perfekt. Stellen Sie sich die Situationen vor, in denen wir mehrere Argumente in einer Funktion haben . Sagen wir meinen Namen und mein Alter, und ich werde meinen Namen ausdrucken und mein Alter wird mein h sein. Wenn ich keine Argumente gebe, wird Mein Name undefiniert sein. Mein h wird undefiniert sein. Um undefiniert, undefiniert, perfekt zu überprüfen. Jetzt kann ich tatsächlich einen Standardwert für alle oder nur für ein Argument angeben. Also lass es mein Alter sein und standardmäßig wird es gleich 10 sein. Wenn ich jetzt erneut durchführe, wirst du sehen, dass mein Name undefiniert bleibt , weil wir keinen Fallback-Wert haben. Und mein Alter ist 10 Jahre. Vielleicht. Bringen wir es John an. Lass uns Andrew hier einschenken. Und lasst uns undefiniert sein, um unsere Gedanken abzuschließen, sagen wir klar und unser Wissen. Also für meinen Namen und du wirst abgeholt, und für mein Alter werden 10 abgeholt, weil wir undefiniert liefern. Dies ist das Gleiche wie überhaupt keinen Wert zu liefern, oder? Wenn ich es schreibe, heiße ich Andrew und mein Alter ist Stan. Perfekt. Nun, das war's. Jetzt wissen Sie, wie wir Pfeilfunktionen nutzen werden. Was sind das? Und jetzt wissen Sie über Standardfunktionsargumente Bescheid. Wir sehen uns im nächsten. 28. String: Hallo, In diesem Video werden wir über String-Vorlagen sprechen, oder tatsächlich werden sie Template-Strings und String-Interpolation genannt . Lass uns in file.js gehen. Angenommen, ich wollte meinen Namen in einem Satz ausdrucken. Ich möchte sagen, mein Name ist Andrew, mein h ist 10. Dafür erstelle ich drei Variablen. Die erste Variable wird Name sein , der Andrew sein wird. Der zweite wird h sein, wird 10 sein. Und das dritte wird das Ergebnis sein , das ich auf die Konsole drucken werde. Um also einen Satz zu machen, muss ich Strings verketten da ich dynamische Werte verwenden werde, die Name und Alter sind. In der Programmierung. In anderen Programmiersprachen erfolgt dies normalerweise unter Verwendung des Plus-Operators. Das wird also so aussehen, als wäre mein Name Plusname. Dies wird einen Eintrag ergeben. Dann noch einmal plus. Und jetzt ist der String-Punkt, den ich mein Alter eingeben muss , dann wieder plus h. Und wir müssen uns auch um die Räume kümmern. Hier. Ich muss ein Leerzeichen hinzufügen und auch hier. Großartig. Versuchen wir nun, es auszudrucken und dieses Skript auszuführen, Knotendatei gs. Mein Name ist Andrew May, h ist 10 Grad. Dies ist unser gewünschtes Ergebnis. Aber wie Sie sehen können, ist dies nicht sehr praktisch, weil diese Syntax eigentlich nicht praktisch ist. Was ist, wenn wir viele Variablen haben und eine wirklich lange Zeichenfolge haben, dann wird sie unlesbar. Was ist, wenn es einen besseren Weg gibt, das zu tun? Nun, das ist tatsächlich String-Vorlagen oder normalerweise als Vorlagenzeichenfolgen bezeichnet. Versuchen wir, diese Codezeile mit einer Zeichenfolgenvorlage erneut auszuführen. Also werden wir weitere variable Ergebnisse für erstellen. Und wir werden String-Vorlage verwenden. Um String-Vorlage verwenden zu können, müssen wir Backticks verwenden. Für reguläre Strings verwenden wir also reguläre Anführungszeichen, oder? Entweder ein einziger Reclose oder doppelte Anführungszeichen. Für String-Vorlagen verwenden wir Backticks. Also schalte ich die Anführungszeichen mit der Erweiterung „Anführungszeichen umschalten“, die ich in VS Code installiert habe. Sie finden es im VS-Code-Marktplatz. Diese Erweiterung schaltet Anführungszeichen ein. Dann drücke ich die Tastenbindung, um die Anführungszeichen zu wechseln , und ich höre bei Backticks auf. Backticks, die Zeichenfolge wird so ausgewertet wie sie ist, wie sie im Code angezeigt wird. Also werde ich tippen, mein Name ist Leerzeichen. Und hier wollte ich dynamisch, sagen wir mal einen Wert injizieren. Um dies zu tun, müssen wir diesen Wert in eine Zeichenfolge interpellieren. String-Vorlagen ermöglichen es uns, dies mithilfe des Dollarzeichens und der Syntax der geschweiften Klammern zu tun. Wenn wir also das Dollarzeichen gefolgt von geschweiften Klammern in geschweifte Klammern setzen, können wir jeden JavaScript-Ausdruck einfügen, der einen Wert erzeugt. Dieser Wert wird in diese Zeichenfolge an dieser Stelle in dieser Zeichenfolge interpoliert . Also wollten wir hier Namen angeben. Mein Name ist Name. Ich hab Dodd gesetzt. Mein Alter ist wieder, das Dollarzeichen gefolgt von geschweiften Klammern h. ich werde es speichern. Ich werde es neben unserem ersten Ergebnis konsolenprotokollieren. Und lasst uns diese beiden vergleichen. Wie Sie sehen können, sind sie gleich. Der Unterschied besteht jedoch im Syntaxergebnis, um String-Vorlagen zu verwenden und der erste verwendet nur den Plusoperator und die Verkettung von Strings, zu denen jemals resultiert haben. Dies ist eine viel schönere und umfassendere Syntax, und diese Syntax wird in modernem JavaScript bevorzugt. Niemand verwendet tatsächlich Verkettung um Strings zu verketten, vielleicht sehr selten, meistens werden Sie String-Interpolation mit String-Vorlagen mit Backticks sehen . Wie ich bereits erwähnt habe, die Zeichenfolge, die in Backticks erscheint , so ausgewertet, wie sie ist. Das bedeutet, dass wenn ich viele leere Räume und vielleicht hier drüben platzieren werde, alle in die endgültige Zeichenfolge aufgenommen werden. Wenn ich also Leerzeichen hier lege, leere Strings, werden es leere Zeichenfolgen in der Ausgabe sein. Lass es uns sehen. Sie können sehen, dass der Abstand beibehalten wird. Ich lege hier drei leere Zeilen, sie erscheinen in der Ausgabe. können wir nicht mit dem Plus-Operator machen. Wenn ich hier Leerzeichen einlege, habe ich einen Syntaxfehler. Und wenn ich versuche, das Skript auszuführen, habe ich einen Syntaxfehler, ungültiges oder unerwartetes Token, wenn wir leere Zeilen in unserer Zeichenfolge verwenden möchten leere Zeilen in unserer Zeichenfolge verwenden und wir sie behalten wollten, wir müssen es verwenden String-Vorlagen. Dies führt also zu einer ungültigen Syntax. Lasst es uns zurücklegen, wie es zuvor war. In Ordnung, jetzt verstehen wir String-Vorlagen, wie ich bereits erwähnt habe, in geschweiften Klammern, wir können jeden JavaScript-Ausdruck einfügen. Und wie wir uns erinnern, ist Ausdruck eine Entität, die einen Wert erzeugt. Also haben wir einen Namen, der verfügbar ist Ausdruck, er gibt Andrew eine Zeichenfolge. Was ich sagen möchte ist, dass wir uns nicht darauf beschränken, nur Variablen hier zu setzen. Wir können jeden JavaScript-Ausdruck hineinlegen. Zum Beispiel verwenden wir den ternären Operator. Wenn 10 größer als fünf ist , setzen wir eine Namensvariable ein. Andernfalls verwenden wir das Alter , weil 10 immer größer als fünf ist, wir werden immer einen Namen haben. Also lasst uns versuchen es zu sehen. Und wir haben Mein Name ist Andrew, mein Alter ist 10 Jahre. Tolle Arbeiten. Wechseln wir den Betreiber. Und jetzt werden wir haben, mein Name ist 10, weil wir hier falsch haben, und deshalb erhalten wir am Ende H. So können wir tatsächlich jedes Jahr eine Funktion setzen. Lass uns const erstellen und meinen Namen holen. Und es wird John hierher zurückbringen, oder? Und in geschweiften Klammern, die String-Interpolation verwenden, rufe ich diese Funktion auf. Bei dieser Funktion wird mir die Zeichenfolge zurückgegeben. Probieren wir es aus. Wir werden sehen, dass ich John heiße. Mein Alter ist 10 Jahre und das war's. Das ist alles, was wir über String-Vorlagen oder String-Literale und String-Interpolation wissen String-Vorlagen oder String-Literale müssen. Am Ende müssen Sie sich drei Dinge über String-Vorlagen merken . Der erste ist also, dass sie Backticks verwenden. Sie verwenden keine regulären Anführungszeichen. Wenn Sie hier reguläre Zitate setzen, funktioniert dies nicht. String-Interpolation funktioniert nicht. Wenn ich es mir ansehe, wirst du sehen, dass ich das Dollarzeichen habe und geschweifte Klammern gedruckt werden . Ich muss meine Anführungszeichen in Backticks ändern, damit die String-Interpolation funktioniert. Das zweite, woran man sich erinnern sollte , ist , dass wir innerhalb der String-Interpolation jeden JavaScript-Ausdruck einfügen können. Wir sind nicht begrenzt. Und das dritte, woran man sich erinnern sollte, ist, dass die Zeichenfolge innerhalb von Backticks so ausgewertet wird, wie sie ist. Das bedeutet, dass wenn wir leere Leerzeichen hier platzieren, diese in die Zeichenfolge einbezogen werden. Sie werden nicht weggelassen. Das war's. Wir sehen uns im nächsten. 29. Objekt und Array: Hey, in diesem Video werden wir über Objekt sprechen und Array strukturiert. Diese beiden Funktionen werden häufig genutzt. Schauen wir sie uns in file.js an. Sagen wir, ich wollte ein Objekt erstellen, lass es Auto sein. Und es wird die folgenden Schlüssel haben. Farbe, die rot sein wird, sagen wir Gears 5 und vielleicht Motortyp. Lasst uns Diesel setzen. Nehmen wir an, ich möchte auf Schlüssel dieses Objekts zugreifen. Normalerweise würde ich es also wie Auto machen dann DOD und dann den Schlüsselnamen eingeben, auf den ich zugreifen möchte. Und wenn ich es in eine Variable setzen wollte, würde ich es normalerweise so machen. Also werde ich eine neue Variable namens Engine deklarieren. Und dann würde ich Auto und Aufmerksamkeit schenken. Und wenn ich all diese Objekte ziehen wollte, würde ich für jedes eine separate Variable erstellen. Zum Beispiel werden const Zahnräder sein und das Gleiche werden wir für die Farbe tun, oder? Wir können dies als drei separate Codezeilen sehen. Nun, das ist im modernen GPS nicht sehr praktisch, wir können etwas Einfacheres tun, Objektzerstörung. Anstatt das zu tun, lassen Sie es mich auskommentieren. Wir können es durch eine Zeile ersetzen. Also werden wir const setzen, dann werden wir geschweifte Klammern setzen, um anzugeben, dass dies Objekt sein wird, das Strukturieren durchführt. Dann werden wir gleich setzen und das Objekt, das wir zerlegen möchten, das Auto von diesem Autoobjekt sein wird, wir wollten Motor und Zahnräder ziehen. Sagen wir, wir brauchen keine Farbe. In geschweiften Klammern gebe ich an, welche Schlüssel ich von diesem Objekt ziehen möchte. Es wird also Farbe sein. Und dann ziehe ich Gänge. Wird diese einzelne Codezeile diese beiden gerade für Farbe und Zahnräder ersetzt? Wenn wir auch den Motor ziehen wollten, würden wir hier einfach den Motor tippen. Und natürlich ist es sehr wichtig, den Schlüsselnamen sehr streng anzugeben. Sagen wir, wenn wir aus irgendeinem Grund Gänge hier haben und sie groß geschrieben sind, wissen wir davon nichts, oder? Und wir destrukturieren Zahnräder, es wird undefiniert sein, weil es auf diesem Objekt nicht existiert. Versuchen wir vielleicht, Konsolenprotokoll, Farbe. So. Lassen Sie mich es schnell machen und auch uralt. Okay. Lassen Sie mich schlecht Node File GS und Sie sehen Colorado und Getriebe undefinierter Motordiesel, da wir Zahnräder haben, Objekte, die mit einem Großbuchstaben beginnen, und wir zerlegen Zahnräder, die darauf nicht existieren -Objekt. Wir haben undefiniert, aber andere Werte sind es. Alles klar. Also lasst es uns zurücklegen und überprüfen wir, ob es funktioniert. Großartig. Jetzt haben wir Gears 5 , dieses Objekt strukturiert, denkt, ist ein wirklich mächtiges Werkzeug. Das ist im Grunde alles was es tut. Es zieht einfach Schlüssel von einem Objekt. Das war's. Dies ist im Grunde das Gleiche wie bei diesen drei separaten Zeilen. Ich würde sagen, das ist nur eine Kurzschrift. Es bringt nichts Neues. Es ist nur eine Kurzschrift. Es gibt noch eine Sache an diesem Objekt, das nur strukturiert wird, ist, dass wir, sagen wir beim ersten Ansatz mit diesen drei Zeilen, Variablen leicht umbenennen können. Wenn ich einen Automotor angeben wollte, würde ich die Variable einfach so von Motor zu Automotor umbenennen . Ziemlich einfach, oder? Aber wenn das Objekt strukturiert wird, denken Sie daran, dass wir immer einen strengen Schlüssel angeben müssen , den wir destrukturieren möchten , da sonst fraglich nicht existieren wird. Der Schlüssel wird für dieses Objekt nicht existieren. Wie können wir sie umbenennen? Nun, um das zu tun, sagen wir anstelle des Motors, wollen wir den Automotor benutzen. Ich muss Doppelpunkt und dann den neuen Namen für diese Variable setzen . Also ziehe ich jetzt vom Autoobjekt den Motor und benannte Motor in Automotor um. Engine wird nicht als Variable existieren. Es wird als Automotor erscheinen. Wenn ich das Console-Log Only Engine gehe, schauen wir uns an, was wir haben werden. Wir werden einen Referenzfehler haben. Die Engine ist nicht definiert , da diese Variable nicht existiert. Wir haben den Motorschlüssel gezogen, aber der Variablenname ist jetzt Automotor. Wenn wir also auf den Automotor verweisen, wird es uns keinen Fehler geben. Ich glaube, es ist klar. Also das Gleiche mit anderen Schlüsseln, wenn Sie Farbe umbenennen möchten, setzen wir Spalte und dann Autofarbe. Und das war's. Ziemlich einfach, oder? Als traurige Objektzerstörung , weil es wirklich mächtiges Werkzeug ist. Wir werden es oft benutzen, besonders in React. Werfen wir einen Blick auf ein echtes Beispiel, das wir tatsächlich in React verwenden werden. Also erstelle ich eine Funktion, sagen wir mal eine Funktion. Und diese Summenfunktion erhält ein Argument, nennen wir es Arc Car. Wir werden erwarten, dass unser Auto ein Objekt sein wird. Und wir können eine Funktion aufrufen. Und wir liefern unser Autoobjekt für unser Auto, oder? Lassen Sie uns es schnell auskommentieren und versuchen wir es und console.log, arg, car so. Und wir werden unser Objekt ziemlich einfach sehen. Nehmen wir an, wir wollten tatsächlich Log separate Schlüssel von diesem Objekt abbrechen. Also nochmal das gleiche Bild wie wir es gerade gemacht haben. Also verweisen wir entweder auf diese Schlüssel, indem wir die Syntax des Arc-Auto-Türschlüssels verwenden. Zum Beispiel Arc-Auto-Punktfarbe. Stimmt's? Wir haben gelesen, wenn ich Motor benutzen werde, wird es illoyal sein, wenn ich einen nicht vorhandenen Schlüssel bereitstelle , zum Beispiel quadratische Räder, oder? Ich werde undefiniert, weil dieser Schlüssel für dieses Objekt nicht existiert. Anstatt dies zu tun, kann ich die Umstrukturierung von Objekten verwenden und ich kann sie tatsächlich direkt in Klammern verwenden. Also der erste Weg, wie wir diese Codezeile tatsächlich verwenden können , einfach so. Und es wird funktionieren, oder? Genau wie wir es bereits besprochen haben. Stattdessen kann ich tatsächlich bewegen, dass dieses Objekt direkt in Klammern strukturiert wird. Also kopiere ich das einfach und lege es hier hin. Und jetzt haben wir gerade noch mehr Codezeilen entfernt. Jetzt kann ich direkt auf kritische Farben und Zahnräder zugreifen. Lassen Sie uns überprüfen, ob wir gelesen haben und fünf, was richtig ist. Nett. Lassen Sie uns dieses Beispiel ein bisschen weiter ausdehnen. Was passiert, wenn ich ein zweites Objekt an eine Funktion bereitstelle? Angenommen, ich gebe ein zweites Objekt an. Vielleicht wird es kein Auto sein, aber ich stelle es einfach als Auto. Alles klar? Und hier erwarte ich ein Objekt, und ich erwarte, dass dieses Summenobjekt zwei zwei Schlüssel haben wird , Name und Alter. Also kann ich sie referenzieren, indem einige Objekte mit Punktnamen oder Alter mache. Stattdessen kann ich hier wieder die Objektzerstörung direkt nutzen. Also würde ich Namen und Alter angeben. Wir verwenden Objektzerstörung für unsere beiden Argumente. Argumente sind also durch das Komma getrennt, oder? Und die Schlüssel, die wir destrukturieren ziemlich einfach in geschweiften Klammern angegeben , dass eine Funktion ein wirklich gutes Beispiel ist da wir in React einen sehr ähnlichen Code haben werden . Kombinieren wir Objekt strukturiert mit Standardargumenten. Was ist, wenn ich keine Argumente für irgendeine Funktion gebe? Lass mich das zweite Objekt von hier entfernen. Und sagen wir, ich destrukturiere Farbe und Zahnräder. Probieren wir es aus. Was bekomme ich? Ich werde die Eigenschaftsfarbe von undefined nicht destrukturieren. Was ist passiert? Nun, die Sache ist, wie Sie sich erinnern, wenn wir keine Argumente für einige Funktionen angeben, dieses Argument, das wir von einem Peer in dieser Funktion erwarten , undefiniert sein wird. Was wir also hier im Grunde tun, versuchen wir, diese Schlüssel aus einem leeren Wert zu ziehen , der im Grunde nicht unter der Haube existiert, es sieht so aus. Also ziehen wir Farbe und Zahnräder von unbestimmtem ab. Aber wie Sie sehen können, führt diese Syntax zu einem Typfehler. Das ist falsch. Um diesen Fehler tatsächlich zu beheben, können wir ihm in diesem Fall Fehler tatsächlich zu beheben, einen Fallbackwert liefern. Also lege ich ein leeres Objekt und jetzt mal sehen, was wir haben werden. Wir werden unbestimmtes, unbestimmtes haben. Nun, dies wird erwartet, weil wir für dieses Objekt keinen Wert angegeben haben . Undefinierter Wert fällt auf ein leeres Objekt zurück. Und von diesem leeren Objekt, Disruptor nicht vorhandene Schlüssel, Farbe und Zahnräder. Nun, weil sie nicht für ein leeres Objekt definiert sind. Wenn ich die Farbe grün setze und versuche, sie zu protokollieren, werden Sie sehen, dass der Wert grün ist und die Zahnräder undefiniert sind, oder? Denn auch hier fällt unser undefinierter Wert auf dieses Objekt zurück. Und von diesem Objekt destrukturieren wir die Farbe in Zahnrädern. Es gibt tatsächlich einen weiteren Nachteil bei diesem Ansatz. Was ist, wenn ich hier ein leeres Objekt bereitstelle? Wie wir vielleicht wissen, ist ein leeres Objekt bereits ein definierter Wert, oder? Ich lege ein leeres Objekt ein. Kannst du raten, was Farbe und Zahnräder sein werden? Richtig? Es wird undefiniert sein. Undefiniert, da sie jetzt Farbe und Zahnräder für dieses Objekt nicht vorhanden sind. Deshalb haben wir undefiniert. Undefiniert. Was ist, wenn wir irgendwie Standardwerte für separate Objektschlüssel angeben möchten? Der Ansatz ist derselbe, indem das Gleichheitszeichen verwendet wird. So können wir die Farbe standardmäßig grün sein. Lassen Sie uns ein leeres Objekt setzen, um dies in einer Sekunde zu überprüfen. Und die Gänge sind standardmäßig sechs, oder? Wenn ich es jetzt betreibe, siehst du grün und sechs. Ziemlich genial. Um dieses Beispiel zu erweitern, was passiert, wenn ich den Standardwert für das Objekt selbst entferne, aber die Standardwerte für separate Schlüssel behalte und hier ein leeres Objekt entfernen werde . Versuchen wir es auszuführen. Schon wieder. Wir haben die Eigenschaftsfarbe von undefined nicht lesen , da wir wieder die gleiche Situation haben. Diese beiden Schlüssel werden versucht , von undefined zu destrukturieren, was zu einem Typfehler führt. Um das zu beheben, müssen wir den Fallback bereitstellen. Das ist wichtig. Wir bieten den Fallback für das Objekt selbst, und hier stellen wir Standardwerte für separate destrukturierte Schlüssel zur Verfügung. Aber ich kann zustimmen, dass diese Syntax ein bisschen verwirrend ist. Wir können es tatsächlich umgestalten, damit es schöner aussieht. Irgendwann werden wir eine weitere Codezeile haben, aber es ist in Ordnung. In Klammern behalte ich nur den Standardwert für das Objekt selbst bei. Und anstatt die Strukturierung zu verwenden, gebe ich den Namen für das Argument an. Lass es also ein Auto-Objekt sein. Und auf einer neuen Linie werde ich tatsächlich die Umstrukturierung für das Objekt setzen, const color getriebe ist gleich Car-Objekt. Jetzt können Sie sehen, dass wir die Bedenken in der Klammer tatsächlich getrennt haben. Wir haben nur den Standardwert für das Objekt selbst und in einer neuen Zeile angegeben für das Objekt selbst und in einer neuen Zeile Wenn wir diese Strukturierung verwenden, geben wir Standardwerte für separate Schlüssel an, so einfach das ist, ich persönlich denke, dass dies eine der coolsten Funktionen im modernen GIS. Ich mag es sehr, aber wir haben auch eine Radiusstrukturierung neben Objekt. Die Strukturierung ist eigentlich sehr, sehr ähnlich. Sagen wir also, ich habe ein Array oder lass mich vielleicht all das entfernen. Ich werde eine Funktion behalten, aber ich werde es auskommentieren. Und unten werde ich ein Array erstellen. Und ich werde einige Werte wie 5, 4, 3, 2 und 8 angeben. Und genauso wie ich die Umstrukturierung von Objekten auf ein Objekt anwende, kann ich eine Radiusstrukturierung verwenden, um zu signalisieren, dass wir Objektzerstörung verwenden. Wir verwenden geschweifte Klammern, aber für Arrays verwenden wir Box-Klammern. Auf die gleiche Weise geben wir Box-Klammern gleich summenarray an. Aber dieses Mal müssen wir den Namen der Schlüssel nicht genau befolgen. Wird es Einwände erheben? Wir haben Schlüsselnamen, aber im Array haben wir es nicht. Im Array haben wir eine Bestellung. Wenn wir also die Objektzerstörung anwenden, spielt es keine Rolle , in welcher Reihenfolge Sie die Schlüssel destrukturieren. Aber in Wut ist Strukturierung. Es ist wichtig. Sie können jedoch alle Namen angeben , die Sie für Ihre zukünftigen Variablen wünschen. Zum Beispiel möchte ich Ihr, das zweite Element dieses Arrays, stören . Um dies zu tun, muss ich zuerst das erste Element destrukturieren. Die Reihenfolge, die Sie in einer Radiusstrukturierung angeben , ist die gleiche wie die Elemente im ursprünglichen Array Destruktor das erste Element, ich gebe das erste Element. Und jetzt habe ich das zweite Element, zweite Element, das 4 sein wird. Also wird das erste Element 5 sein, das zweite Element wird vier sein. Wie Sie sehen können, wird die Bestellung beibehalten. Erstes Element fünf Sekunden 4. Wenn ich das dritte Element hier setze, kannst du den Wert erraten? Nun, ja, es werden drei sein. Schauen wir es uns an. Konsolenprotokoll, erstes Element, zweites Element und drittes Element. Notieren Sie die Datei GS, was wir sehen 5, 4, 3, genau die gleichen Werte. Wenn ich dieses Element aus irgendeinem Grund ausstrahlen wollte, sagen wir, ich benutze es so, oder? Const, zweites Element. Nun, das wird nicht funktionieren. zweite Element wird jetzt das erste Element sein, das ist fünf. Wenn ich es mit einer Konsole protokolliere, wirst du es sehen, es werden fünf sein. Denn auch hier ist die Reihenfolge wichtig, wenn Sie eine Umstrukturierung anwenden, da Elemente, geordnet sind, keine Schlüsselnamen haben. Sie können dieser Variablen einen beliebigen Namen geben, aber Sie müssen die Bestellung beibehalten. Ich denke, es ist endlich ziemlich klar, ich würde sagen, dass eine Radiusstrukturierung auf die gleiche Weise wie die Umstrukturierung von Objekten verwendet wird . Wenn Sie etwas Ähnliches mit einer Radiusstrukturierung in Klammern machen möchten Ähnliches mit einer Radiusstrukturierung , wenn Sie Funktion verwenden, funktioniert es. Der Unterschied besteht nur darin, dass q bei der Objektzerstörung q geschweifte Klammern mit der Radiusstrukturierung verwenden müssen, Sie Box-Klammern und auch die Reihenfolge verwenden werden. Denken Sie daran, dass in einem Array Elemente geordnet sind und Sie deshalb alle vorherigen Elemente destrukturieren müssen. Wenn Sie die Elementnummer destruktorieren wollten. Und wenn ich das vierte Element destrukturieren möchte, muss ich Ihre ersten drei stören. Dies ist unvermeidlich, während sie in Objektschlüsseln nicht geordnet sind. Deshalb können Sie jede Bestellung verwenden. Bei der Zerstörung der Schlüssel geht es um Objekt- und Radiusstrukturierung. Wir werden es oft benutzen und ich hoffe, es war dir klar. Wir sehen uns im nächsten. 30. Spread und Rest: Hi, dieses Mal werden wir über den Rest sprechen und die Betreiber verbreiten. Diese beiden sind eng mit dem Objekt im Rennen verbunden und werden in modernen JS viel verwendet. Lasst uns herausfinden, was sie tun. Wenn ich zurück zu File GAS gehe, lass mich vielleicht eine Funktion erstellen und die Spitze, die ich eine Funktion nennen werde. Es wird Argument Nummer eins, Argument Nummer 2 und 4 erhalten . Jetzt loggen religiöse Konsole arg1, arg2, perfekt. Lassen Sie mich unten diese Funktion aufrufen und lassen Sie mich Hallo als erstes Argument angeben. zweite Argument wird n bis zum dritten sein wird 15 entfernt sein, vielleicht nur eine leere Pfeilfunktion, und dann lass es nur Nummer 5 sein. Großartig. Wenn ich dieses Skript ausführen werde, werde ich sehen, dass ich Hello Andrea habe, die ersten beiden Argumente. Nun, wie können wir den Rest der Argumente tatsächlich erreichen und wie wir sie in einer einzigen Einheit sammeln können , in S und Google erträglich, deshalb existiert der Rest Operator. Es sammelt den Rest, die Argumente über den Rest von etwas in ein einziges Fass. Oben werde ich also nur eine kurze Referenz für uns geben. Also der Restoperator sammelt oder sagen wir falsche Werte in einer einzigen Variablen. Fehler. Großartig. Um den Restoperator zu verwenden, müssen wir die drei Punkte und den Namen der Variablen eingeben, in die der Rest geschrieben wird. Also lass es von Bögen ausgelöscht werden. Es kann ein beliebiger Name sein. Lassen Sie mich nun versuchen, restliche Bögen zu konsolenprotokollieren. Und jetzt haben wir 15 anonyme Funktionen und 5, wir werden im Grunde den Rest der Argumente, die wir nicht definiert haben. Wir können also sehen, dass unsere ersten beiden Argumente Hallo und NGO sind, und der Rest ist 15, die Funktion und fünf, großartig, wenn ich R2 hier entfernen werde, können Sie erraten, wie sich der Rest von RX ändern wird? Probieren wir es aus, oder? Also haben wir jetzt Andrew am Anfang als 15 Funktion und fünf. Und so funktioniert der Rest Operator. Es nimmt nur den Rest der Werte und faltet sie alle in eine einzige Variable, einfach so. Sehen wir uns nun an, wie wir den Restoperator in Objekten und Arrays verwenden können . Lassen Sie mich das aussprechen. Und ich werde ein Objekt erstellen, würde sagen, es wird Person sein und Name wird Andrew sein. Vielleicht wird das Alter 10 sein. Angenommen, ich habe hier ein Objekt strukturiert. Und ich möchte vielleicht einen Namen von diesem Personen-Objekt abrufen, dass ich Gepäck stornieren werde. Wir können Angio-Note erhalten. Vielleicht fügen wir dort weitere Schlüssel hinzu. Sagen wir Hobbyspiele, perfekt. Was ist, wenn ich irgendwie nur den Namensschlüssel und den Rest der Schlüssel abrufen möchte , möchte ich in ein neues, völlig neues Objekt falten. Wir werden in diesem Fall wieder den Restoperator benutzen. Genau wie in der Funktion werde ich nur drei Punkte innerhalb des Objekts verwenden , die Strukturierung und den Namen des Objekts , in das der Rest geschrieben wird. Also lass es der Rest der Person sein. Lassen Sie mich nun versuchen, den Rest der Person zu konsolenprotokollieren. Und was ich bekommen werde, bekomme ich ein neues Objekt mit den restlichen Schlüsseln, die ich nicht destrukturiert habe. Also habe ich nur den Namen destrukturiert. Und der Rest ist h und Hobby. Deshalb werde ich in dem neuen Objekt, das der Rest der Person ist, das der Rest der Person ist, H und Hobby sehen, wenn ich H hier hinzufüge. Jetzt wird der Rest der Person nur Hobby enthalten, weil dies der Rest ist. Was ist übrig? Lassen Sie uns das überprüfen. Perfekte Hobbyspiele. Wenn ich auch das Hobby zerstöre, kannst du den Wert jetzt erraten? Stimmt's? Es wird ein leeres Objekt sein. Wenn ich alle Schlüssel entferne, kannst du den Wert jetzt erraten? Richtig. Es wird genau das gleiche Objekt sein , denn der Rest sind alle Schlüssel, die wir nicht destrukturiert haben , da wir nichts gehört haben. Der Rest ist im Grunde alles hier. Die gleiche Regel gilt für das Löschen. Lassen Sie mich das aussprechen. Und unten werde ich ein Array erstellen. Und ich werde 5, 4, 3, 10 und 8 setzen , oder? Und ich werde eine Razzia Umstrukturierung durchführen. Also const bogs Klammern aus einem Array, von einigen wieder möchte ich das erste Element und den Rest greifen . Ich möchte in eine völlig neue Variable schreiben. Also werde ich noch einmal drei Punkte und den Namen der Variablen setzen , die der Rest eines Arrays sein wird. Lassen Sie uns überprüfen, ob ich den Rest eines Strahls in der Konsole protokollieren werde. Und ich bekomme 4, 3, 10 und 8, was der Rest des Arrays ist , das ich nicht destrukturiert habe. Wenn ich dein zweites Element zerstöre. Jetzt wird der Rest 3, 10 und acht sein, denn nun, ich habe die ersten zwei Elemente und der Rest ist 310 und 8. Wenn ich das richtig überprüfe, funktioniert alles perfekt. Jetzt haben wir nicht über den Spread-Operator gesprochen, aber wir können sehen, dass er auch die drei Punkte hat. Nun, die Sache ist, dass die Rest- und Spread-Operatoren die gleiche Syntax haben, aber sie werden in verschiedenen Kontexten verwendet und es ist sehr leicht, sie zu übersehen. Wie wir wissen, akkumuliert oder verfälscht der Rest von etwas in einer einzigen Variablen. Sie verbreiten Operator tut genau das Gegenteil. Es entfaltet einen gewissen Wert. Lassen Sie mich es Ihnen also demonstrieren. Nehmen wir an, wir haben ein Objekt. Alles klar, wo ist es? Lassen Sie uns dieses Personen-Objekt wiederverwenden. Und sagen wir, ich habe ein anderes Objekt, das ein anderes Objekt genannt wird. Und es hat einige Bereiche wie KI-Genom, in denen ihr Name Alex sein wird, und vielleicht wird Auto BMW sein. Großartig. Was ist, wenn ich diese beiden Objekte zusammenführen möchte? Wir können den Spread-Operator verwenden, um dies zu erreichen. Im Folgenden erstellen wir ein völlig neues Objekt, das wir zusammengeführtes Objekt aufrufen. Es wird ein leeres Objekt sein. Und in diesem leeren Objekt werden wir zuerst das Personen-Objekt verbreiten und dann ein anderes Objekt verbreiten. Also verbreiten wir zuerst Person und dann verbreiten wir ein anderes Objekt. Kannst du erraten, was das Tal von Merced Objekt sein wird? Lassen Sie uns das marschierte Objekt überprüfen. Und wir sehen, dass das neue Objekt alle Schlüssel enthält , die wir persönlich und in einem anderen Objekt haben. Nun, genau wie ich es dir schon sagte, entfaltet der Spread-Operator Werte. In diesem Fall entfaltete es zuerst das Personen-Objekt und dann entfaltete es ein anderes Objekt. Darüber hinaus hat es, wie Sie vielleicht bereits bemerken, wie Sie vielleicht bereits bemerken, genau die gleiche Syntax, drei Punkte wie der Restoperator, aber sie haben beide den zugrunde liegenden Unterschied, dass wiederum der Spread-Operator entfaltet Werte, während der Restoperator sie faltet. Werfen wir einen Blick auf ein anderes Beispiel mit Objekten. Was wäre, wenn ich stattdessen nur ein anderes Objekt in der Person direkt zusammenfüge . kann ich es ganz einfach machen. Ein anderes Objekt. Und natürlich muss ich es ganz oben setzen. Und jetzt brauche ich kein zusammengeführtes Objekt. Und jetzt wird unser neues Personen-Objekt alle Schlüssel von Bowl selbst und von einem anderen Objekt enthalten . Dies ist sehr flexibel, da Sie jetzt den Spread-Operator verwenden können , um Objekte nach Ihren Wünschen zu verwalten. Sie können Objekte zusammenführen. Sie können ein Objekt in ein anderes zusammenführen. Und es gibt ein paar andere Anwendungsfälle , mit denen Sie diesen Spread irgendwie verwenden können, um die Schlüssel eines Objekts an einem anderen Ort zu entfalten . In unserem Fall, was wir gerade getan haben, haben wir alle Schlüssel dieses Objekts in das Person-Objekt aufgeklappt . Wenn ich den Spread-Operator entfernen will, Mal sehen, was abgewertet wird. Wir werden ein anderes Objekt als wichtige Erkenntnisperson haben. Und dieser Schlüssel enthält den Wert des Objekts mit Schlüsseln, anderem Namen und Auto. Warum haben wir es so? Nun, diese Syntax, die Sie hier sehen, ist im Grunde die Abkürzung eines anderen Objekts, Doppelpunkt, eines anderen Objekts. Dies ist der Schlüssel, das ist der Wert. Aber wenn wir eine Situation haben, wenn der Schlüssel denselben Namen wie die Variable haben wird , die die Abwertung enthält, was ein anderes Objekt ist. Wir können die Kurzschrift benutzen und es wird funktionieren. Perfekt. Sehen wir uns nun den Spread-Operator beim Löschen an. Das werde ich kommentieren. Und ich werde für unser Summen-Array ungewöhnlich. Also hier haben wir den Rest eines Arrays. Lasst uns das tatsächlich entfernen. Und lass uns dieses Beispiel benutzen. Y ist, lassen Sie uns eine neue Variable und keines der beiden Arrays erstellen, und lassen Sie es 123 sein. Gut. Nun, genauso wie wir gerade Objekte zusammengeführt haben und genau die gleiche Art und Weise, wie wir löschen zusammenführen können, oder? Also hier erstelle ich ein völlig neues Array. Ich nenne es Ergebnis. Und in diesem neuen Array werde ich zuerst eine Zusammenfassung entfalten, und dann werde ich ein anderes Array entfalten. Am Ende werden wir beide Arrays einfach verketten. Zusammenfassung und vergiss nicht drei Punkte. Und dann noch ein Array mit drei Punkten. Jetzt sind wir nur Ergebnisse des Konsolenprotokolls und erhalten schließlich zwei Arrays zusammen. Großartig. Dies ist räumlich flexibel mit Arrays, da wir in der Lage sind, ein Array an jedem Ort in ein anderes Array zu entfalten. Das heißt, wenn ich sie einfach ersetzen werde, tausche ich sie einfach aus, oder? Ich werde eine ganz andere Reihenfolge haben, weil jetzt ein anderes Array zuerst geht. Deshalb sehe ich 123 und das resultierende Array. Wenn ich den Spread-Operator von beiden entfernen will. Jetzt hat unser Array nur zwei Elemente, bei denen jedes Element selbst ein Array ist. Stimmt's? Wir haben also eine Reihe von zwei Elementen. erste Element ist ein Array, zweites ist ein Array, aber das ist nicht genau das, was wir wollen. Normalerweise wollen wir diese verschachtelten Arrays nicht. Wir wollten mit flacheren Rennen arbeiten , weil das bequem und gut ist, das ist einfach normal zu sehen. Es wird viele Situationen geben, in denen wir den Spread-Operator in Arrays verwenden müssen. Und wir möchten eine gewisse Reihenfolge mit dem Spread-Operator strikt befolgen , wir können alle Werte überall platzieren, wo wir wollen. Genau wie ich es gerade mache, oder? Also kannst du den Wert erraten, den resultierenden Wert, wenn ich diese Codezeile einfüge, lass mich sehen. Zuerst werde ich ein anderes Array haben. Nach all den Werten eines anderen Arrays, das 1, 2, 3 ist , werde ich 15, 16 und 12 haben. Danach werde ich alle Werte der Zusammenfassung haben. Und am Ende werde ich 16, 1 und 0 haben. Ziemlich cool. Ich schätze, es dreht sich alles um die Spread- und Ruheoperatoren. Wir werden sie oft benutzen. Sie sind sehr, sehr nützlich. Also rate ich dir, dich damit vertraut zu machen und ein bisschen zu üben. Sie mögen verwirrend sein, aber letztendlich sind sie sehr einfach. Also vertrau mir, nimm dir einfach etwas Zeit, gewöhne dich dran und wir sehen uns im nächsten. 31. Async Code, Event: Hallo, wir haben endlich unser letztes JavaScript-Thema erreicht, ein Sink and Sink Code verspricht und asynchron erwartet Sie. Dies ist das wichtigste Thema in der modernen GS, Kenntnis dieses Themas ist unerlässlich. Ohne dieses Wissen wird sich die JavaScript-Entwicklung für Sie niemals vollständig anfühlen. Deshalb schlage ich vor, sich mit diesem Thema so vertraut wie möglich zu machen. Um einen Sink and Sink Code und Versprechen zu verstehen, müssen Sie tiefere Themen verstehen, wie GPS unter der Haube funktioniert, was ist Ereignisschleife und Call-Stack? In diesem Video werde ich versuchen, in einfachen Worten zu erklären, wie JavaScript funktioniert, um dann das Konzept der Versprechen zu verstehen, loszulassen. Was Sie gerade auf dem Bildschirm sehen, ist ein Überblick darüber, wie JavaScript den Code ausführt. Dieses Bild beschreibt, wie GS im Browser läuft. Für NodeJS wird es etwas anders sein, aber es ist in Ordnung, es für unseren Anwendungsfall zu verwenden. Im gelben Rahmen können Sie also Teile der JavaScript-Engine sehen , die Heap- und Call-Stack genannt werden. Heap befindet sich im Speicher zugewiesenen Speicherplatz, in dem alle definierten Variablen während der Codeausführung leben. Call Stack ist der Durchsatzort, an dem JavaScript entscheidet, was ausgeführt werden soll. Als nächstes werden wir über Call-Stack und einen Moment sprechen. Außerhalb des GS-Frames können Sie Web-APIs, Callback, Warteschlange und Ereignisschleife sehen . Diese alle sind nicht Teil der JavaScript-Engine. Dies bedeutet, dass sie durch die Umgebung definiert sind , in der JavaScript ausgeführt wird. Wir kennen zwei primäre JavaScript-Ausführungsumgebungen, Browser und NodeJS. Web-APIs enthalten beispielsweise Dinge wie DOM-API oder Fetch-API, die Teil der Browserumgebung sind. Nur Web-APIs sind in Node.JS nicht implementiert. Wir haben keine HTML-Manipulationsfunktionen wie Document get element by ID und NodeJS. Dies sind Funktionen, die in der Browserumgebung implementiert sind, wissen nur gs , implementiert jedoch einige Dinge aus Web-APIs. Legen Sie beispielsweise ein Timeout fest. Sie sehen in beiden Umgebungen genauso aus, aber unter der Haube ist die Implementierung anders. Möglicherweise haben Sie bereits gehört, dass JavaScript eine Single-Thread-Sprache ist. Aber was heißt das? Dies bedeutet, dass JavaScript einen einzelnen Call-Stack hat. Als Single Call Stack bedeutet, dass die Sprache jeweils nur eine Operation verarbeiten kann . Stellen Sie sich eine einfache Tür vor. Nur wenige Menschen, die versuchen, durch die Tür zu gehen , können jeweils nur eine Person passen. Es kann nicht gleichzeitig zu Personen passen , wenn die erste Person in die Tür geht. Und wenn diese Person größer wird als andere Personen, die versuchen, durch die Tür zu kommen , müssen sie warten, weil sie nicht eintreten können, nachdem die Aktienperson die Tür verlassen hat, können andere Personen fahren Sie fort und gehen Sie dasselbe mit der JavaScript-Engine durch , wenn zwei Codezeilen nacheinander laufen, zum Beispiel zwei Konsolenprotokolle. Wir wissen, dass die erste Codezeile immer zuerst ausgeführt wird und Erst nach Abschluss der ersten Zeile wird die zweite Zeile ausgeführt. Das bedeutet, dass, wenn die erste Codezeile fünf Jahre dauern wird, die zweite Codezeile all diese fünf Jahre warten wird , bis die erste Operation abgeschlossen ist, und erst danach wird sie ausgeführt. Auch hier ist JavaScript eine einzelne Thread-Sprache mit dem Single-Call-Stack. Aufgrund eines einzelnen Call-Stacks kann die GS-Engine jeweils nur einen Vorgang verarbeiten. Call Stack ist ein temporärer Speicher für alle ausstehenden Funktionen, die ausgeführt werden sollen. Und es ist als Stack organisiert, eine Struktur, die der letzten ersten Out-Methode folgt. Zuletzt bedeutet zuerst, dass das letzte Element, das dem Lager hinzugefügt wird, immer zuerst entfernt wird, ein Stapel Platten ist ein perfektes Beispiel für das letzte Mal, stellen Sie sich zuerst einen Stapel Platten vor. Man stapelt Platten übereinander. Sobald Sie Vorlagen übereinander haben, Nehmen wir an , Sie müssen die allererste Platte von unten entfernen . Du kannst es nicht einfach von unten rechts nehmen? Wenn Sie das tun würden, fällt der Stapel und die Platten werden zerstreut. Die einzige Möglichkeit für Sie, das gespielt zu nehmen , besteht darin, alle Platten nacheinander von oben zu entfernen, bis Sie die gewünschte Platte unten erreichen die gewünschte Platte unten Diese Art von Organisation wird als Stapel bezeichnet. Die letzte Platte, die dem Stapel hinzugefügt wurde , wird zuerst von diesem Stapel absteigen. Somit ist der Name zuletzt zuerst raus. Java's könnte Stack aufrufen, folgt genau der gleichen Organisation. Stellen Sie sich jetzt einen Container vor. Dieser Container wird der Call-Stack sein. Auf der linken Seite gibt es einen einfachen Code. Mal sehen, wie JavaScript gegen dieses Snippet protestieren würde. Javascript teilt den Code in Funktionen auf. Wenn JavaScript eine Funktion ausführen muss, wird die Funktion oben im Aufrufstapel hinzugefügt. Jedes Mal, wenn die Funktion beendet oder zurückkehrt, wird sie aus dem Aufrufstapel entfernt. Also sieht JavaScript zuerst console.log. Bist du bereit? Es wird dem Call-Stack hinzugefügt als ausgeführt und sofort entfernt. Danach gs, Cs, drucken Sie meine Biografie, es wird zum Anrufstapel hinzugefügt, drucken Sie meine Biografie, GS sieht zuerst, bekomme zuerst meinen Namen, was bedeutet, dass er oben auf dem Anrufstapel hinzugefügt wurde . Gs schaut hinein, Get FirstName und sieht, dass diese Funktion einen Wert zurückgibt. Sobald die Funktion zurückkehrt, entfernt GS sie aus dem Aufrufstapel. Die Ausführung von print my bio geht weiter. Jetzt funktioniert gs, Cs getAge, die gleiche Situation. Gs schaut in GetAge, die Funktion kehrt zurück und wird aus dem Call-Stack entfernt. Dann gibt es endgültige console.log. Mein Name ist Andrew, mein Alter ist 10 Jahre, hinzugefügt und sofort entfernt. Drucken Sie meine Bio-Exits und Call Stack ist leer. Jetzt ist die Ausführung von Hauptcode oder Mainframe abgeschlossen. Der berüchtigte maximale Call-Stack wurde überschritten oder Stack-Overflow-Fehler treten auf, wenn die Call-Stack-Größe aufgebläht ist und die Zahl lächerlich groß wurde, dass die Engine diese Anzahl von Vorgängen innerhalb des ruf Stack an. Weil JavaScript einen einzelnen Call-Stack hat , der so organisiert ist, wie Sie es gerade gesehen haben. Es heißt Blockieren. Denken Sie daran, dass eine Operation nach dem anderen, nächste Funktion erst ausgeführt wird , wenn das vorherige Ende abgeschlossen ist. Dies führt uns zum Begriff synchron, was im Grunde bedeutet, dass die Ausführung nacheinander verläuft , wie wir es im Code sehen. Das Blockierverhalten kann leicht in der Browserumgebung aufgenommen werden. auf einer beliebigen Seite mit der rechten Maustaste, wählen Sie, prüfen aus, und öffnen Sie dann die Konsolenregisterkarte. der Konsolenregisterkarte können wir jedes gültige JavaScript im Browser ausführen . Zum Beispiel console.log. Wow wird Wow produzieren, das in der Konsole gedruckt wird. Perfekt. Aber was ist dem Blockierverhalten in der Browserumgebung, wir haben die Alarmfunktion und es ist ein gutes Beispiel, um das Blockierverhalten zu demonstrieren. Also tippe ich Alert High ein. Und wenn ich die Eingabetaste drücke, was passiert ist, dass ich zuerst das Pop-up sehe, das hoch sagt, aber was passiert unter der Haube? Unter der Haube wurde die Alert-Funktion zum Call-Stack hinzugefügt und sie wurde noch nicht entfernt, da die Warnung nicht beendet wurde und die Warnung keinen Wert zurückgab, was bedeutet, dass die Warnung immer noch ist innerhalb des Aufrufstapels und blockiert die Ausführung aller nachfolgenden Funktionsaufrufe. Ich werde alles konsolenprotokollieren. Wenn ich die Eingabetaste drücke. Nichts passiert, weil sich derzeit die Warnung im Aufrufstapel befindet und die Ausführung blockiert und die Ausführung weiterhin blockiert, bis die Alert-Funktion zurückkehrt oder beendet wird . Und das wird passieren, was ich drücken werde, Okay, also drücke ich console.log. Ich führe das Konsolenprotokoll noch zwei Mal aus und dann drücke ich OK, Mal sehen, was passieren wird. Jetzt. Du siehst, wie alles gerade unter der Haube aufgetaut ist. Die Alert-Funktion wurde aus dem Call-Stack entfernt und die Ausführung wurde fortgesetzt. Deshalb sehe ich alle meine S3-Konsolenprotokolle, für die ich früher die Eingabetaste gedrückt habe. Großartig. Jetzt verstehen wir den Synchronisierungscode. Wie Sie sehen können, ist es nicht sehr praktisch, immer auf den Abschluss einer Operation zu warten. Hier kommt ein Synchronisierungscode zur Rettung. Wenn JavaScript einen Senk-Code liest, wird es verarbeitet, nicht ausgeführt, im Hintergrund verarbeitet und nach der Verarbeitung in eine separate Warteschlange gestellt, die darauf wartet, dass der Aufrufstapel wird leer, wenn gesamte Synchronisierungscode ausgeführt wird und der Aufrufstapel leer wird, asynchroner Code, der in die Warteschlange gestellt wurde, wird in den Call-Stack geschoben und wird jetzt ausgeführt. Es gibt spezielle Sprachfunktionen, die es uns ermöglichen, asynchronen Code zu schreiben. Dies sind Versprechen und Rückrufe, deren Implementierungen uns von der Umwelt ausgesetzt sind . Browser, Web-APIs verarbeiten den Code im Hintergrund und verzögern seine Ausführungsereignisschleife in diesem System ist eine Art Beobachter für den Call-Stack und die wartende Async-Warteschlange, einmal aufgerufen wurde Stack ist leer. Ereignisschleife zieht Elemente aus der Warteschlange und platziert sie in den Call-Stack. Dieses Konzept führt ein nicht blockierendes Code-Ausführungsmodell ein. Es ändert nichts an der Tatsache, dass Call Stack jeweils nur eine Operation verarbeiten kann, aber es ermöglicht, den Code nicht blockierend auszuführen. Betrachten wir einen Fall mit zwei Operationen. Senden Sie eine Anfrage an einen Server und drucken Sie Hallo an die Konsole. Die Anforderung würde 500 Millisekunden dauern , während das Drucken abgeschlossen ist. Hallo würde nur zehn Millisekunden dauern, wenn müssten Sie mit dem sync-modalen Konsolenprotokoll 500 Millisekunden auf die Anfrage warten fertig und erst dann wird hallo gedruckt. Mit dem nicht blockierenden Modell würde die Anforderung asynchron im Hintergrund verarbeitet . Nun, der Synchronisierungscode setzt seine Ausführung fort. Wir würden sehen, dass Hello sofort nach zehn Millisekunden und der Anfrage im Hintergrund gedruckt wird , wir werden die Ausführung irgendwann in der Zukunft nach 500 Millisekunden unter der Haube beenden , es gibt tatsächlich mehrere Warteschlangen. Einer für Timer, einer für Kühltaschen, 14 Versprechen usw. Sie haben unterschiedliche Prioritäten und bestimmte Reihenfolge. Zum Beispiel haben Versprechen Vorrang vor Callbacks, um dies nicht zu kompliziert zu machen. Stellen wir uns vor, es gibt eine einzige Warteschlange für den gesamten asynchronen Code. Eines der Beispiele für asynchronen Code sind Callbacks. Callback ist eine Funktion, die als Argument an eine andere Funktion übergeben wird . Callbacks sind standardmäßig nicht asynchron, aber diejenigen, die von den Web-APIs bereitgestellt werden, sind es tatsächlich. wir zum Beispiel einen Blick auf setTimeout. Es ist sowohl in Know-GS- als auch in Browser-Umgebungen verfügbar. Wir werden uns zwei Beispiele ansehen. Eins in kein GS und einer im Browser. Es spielt eigentlich keine Rolle, wo wir setTimeout verwenden werden. Aber je mehr desto besser, oder? Das erste Beispiel wird in keinem GS liegen. Und ich habe diesen einfachen Code bereits mit zwei Konsolenprotokollen und setTimeout vorbereitet . SetTimeout erwartet also, dass wir zwei Argumente angeben, wobei das erste Argument der Callback ist, der nach der Anzahl der Millisekunden ausgeführt wird , die wir liefern. Als zweites Argument gebe ich in diesem Fall 0 Millisekunden an, was bedeutet, dass die Ausführung nicht verzögert wird. Aber mal sehen, wie der Code ausgeführt wird. Kannst du das Ergebnis erraten? Was wird zuerst kommen? Mal sehen. Ich führe das Skript aus und wir sehen 1 , 2 und erst dann wird Timeout ausgelöst. Die Sache ist, dass setTimeout asynchron ist. Dies bedeutet, dass das Timeout, der Callback, der Rückrufwarteschlange im Hintergrund hinzugefügt wurde . Ich werde 2504,52 Sekunden liefern. Mal sehen, wie das Bild anders sein wird. Ich führe das Skript aus, ich sehe 12. Dann sehe ich die Verzögerung von 2,5 Sekunden. Und erst dann feuert der IC Timeout unter der Haube. Settimeout wurde durch den Code verarbeitet. Settimeout wurde dem Call-Stack hinzugefügt, aber der Callback und die Timer-Ausführung wurden an die Node.js APIs delegiert , die im Hintergrund verarbeitet werden sollen, setTimeout wurde aus dem Call-Stack entfernt. Es bedeutet, dass die Hinrichtung fortgesetzt wird. Dann sehen wir die Konsolenprotokollierung am Anrufstapel und sofort entfernt. Und das Gleiche mit dem zweiten Konsolenprotokoll , das dem Anrufstapel hinzugefügt und sofort entfernt wurde. Und sobald er im Hintergrund ist, wird der Timer nach 2,5 Sekunden in der Zukunft bearbeitet . Dieser Callback wird aus der Hintergrund-Callback-Warteschlange in den Call-Stack aufgenommen der Hintergrund-Callback-Warteschlange und dann ausgeführt. Und es spielt keine Rolle, wie viele Millisekunden ich für das zweite Argument liefern werde. Es wird immer ein Protest auf nicht blockierende Weise sein, und er wird in die Callback-Warteschlange gedrängt. Und erst nachdem der Call-Stack leer ist, zieht die Ereignisschleife diesen Callback aus der Hintergrund-Callback-Warteschlange und schiebt ihn in den Call-Stack. Es spielt keine Rolle, wie viele Millisekunden ich bereitstelle oder wo ich diesen Code ablege, es wird immer asynchron Protest sein. Wenn ich es dazwischen lege und 0 Millisekunden bereitstelle, ist das Bild das gleiche. Werfen wir einen Blick auf das zweite Beispiel. Sie können einen sehr einfachen Index-HTML sehen , der ein einzelnes Schaltflächenelement mit id, btn hat. Dann habe ich im Skript einfach diesen Button mit der DOM-API, dem dokumentierten Credits Selector, dem Hashtag, meinem BTN gezogen . Dann füge ich diesem Button-Element einen Listener für das onClick-Ereignis und für das OnClick-Ereignis auf BET- und Click-Funktion wird ausgelöst. Im Moment ist es leer, aber fügen wir etwas in das Konsolenprotokoll hinzu hallo. Und lass mich die index.HTML tatsächlich im Browser öffnen . Rechtsklick im Datei-Explorer anzeigen. Doppelklick drauf und boom, los geht's. Rechtsklick Inspect. Und ich öffne den Konsolen-Tab, ich klicke auf mich und ich sehe, dass Hallo gedruckt wird, genau wie wir es im Handler für das OnClick-Ereignis definiert haben. Perfekt, kopieren wir tatsächlich den Code , den wir in keinem GS hatten, in den Handler. Nun, wird das Verhalten das gleiche sein wie in no, GS. Lassen Sie uns das überprüfen. Ich gehe zurück zum Browser und aktualisiere die Seite. Ich drücke die Taste und wie ich sehen kann, geht zuerst 1, 2, und erst dann wird Timeout ausgelöst, obwohl es zwischen den Konsolenprotokollen platziert wird. Wenn ich es auf den Job lege und wenn ich es mache , sagen wir zwei Sekunden. Ich aktualisiere die Seite. Ich klicke unten, ein bis zwei Sekunden vergingen bei IC-Timeout-Bränden. Nun, das Bild ist das gleiche. Was passiert, ist, dass SetTimeout, sobald JavaScript setTimeout liest , wieder zum Aufrufstapel hinzugefügt wird, aber der Callback und der Timer wurden diesmal an die Web-APIs im Browser delegiert. Das bedeutet, dass sie im Hintergrund verarbeitet werden. Die Hinrichtung geht weiter. Settimeout wird aus dem Call-Stack entfernt. Konsolenprotokoll wurde zum Call-Stack hinzugefügt, ausgeführt und entfernt. Und das Gleiche mit dem zweiten Konsolenprotokoll. Sobald der Code abgeschlossen ist, der Mainframe oder der Hauptcode beendet, wird die Ereignisschleife ständig nach der Callback-Warteschlange suchen. Der Rückrufwarteschlange wird also ein Di Callback hinzugefügt. Und dann sieht die Ereignisschleife das und schiebt diesen Callback in den Call-Stack. Und danach geht der Anruf nach hinten los. Aber sehen wir es uns tatsächlich mit dem blockierenden Beispiel an. Was ist, wenn ich Alert anstelle des Konsolenprotokolls einfüge, gebe ich einfach Alert High ein. Und ich entferne das zweite Konsolenprotokoll. Und jetzt ist die Frage, dass das festgelegte Timeout im Hintergrund verarbeitet wird, sobald die Warnung beginnt, die Ereignisschleife zu blockieren, Mal sehen. Ich aktualisiere die Seite. Ich drücke die Taste, Alarm wird ausgelöst und jetzt blockiert es die Ereignisschleife. Aber ich sehe nichts in der Konsole. Und wenn ich die Taste OK drücke, erst danach beginnt der Code erst danach mit der Verarbeitung des Callbacks. Weil setTimeout nach der Warnungszeile erscheint. Wenn wir setTimeout vor die Alarmzeile stellen, wird das Bild anders sein. Um die Seite zu aktualisieren. Klicken Sie erneut auf Mich. Alert blockiert die Ereignisschleife, aber jetzt hat SetTimeout die Verarbeitung dieses Callbacks bereits an Web-APIs delegiert. Dies bedeutet, dass während Alert die Ereignisschleife blockiert, Callback von Web-APIs im Hintergrund verarbeitet wird. Und jetzt befindet sich dieser Callback in der Callback-Warteschlange und wartet darauf, in Richtung Call Stack geschoben zu werden . Wenn ich auf Okay drücke, sehe ich sofort Timeout-Feuer. Stimmt's? Aber wenn ich Okay drücke, ändert sich innerhalb dieser zwei Sekunden, das Bild innerhalb dieser zwei Sekunden, aktualisiert die Seite, klicke mich und klicke sofort auf Okay. Und Sie können sehen, dass es noch weniger als zwei Sekunden war noch weniger als zwei Sekunden denn sobald ich auf die Schaltfläche klicke, wird dies sofort an die Web-APIs delegiert. Und es spielt keine Rolle, wie lange die Alarmzeile die Ausführung blockiert. Dies wird bereits im Hintergrund verarbeitet. Großartig. In einfachen Worten können wir sagen, dass asynchroner Code die Art von Code ist , der nach allem synchronen Code immer ausgeführt wird. Um sich leicht an dieses Konzept zu erinnern, stellen Sie sich zwei Spalten vor, eine für die Synchronisierung und 14 asynchronen Code, sagen wir, gs beginnt den Code zu lesen und sortiert dann den Code in Zink und die Zinkspalten. Und sobald es Zeit ist, den Code auszuführen, platzieren Sie einfach die asynchrone Spalte unter die Senk-Spalte. Und los geht's. Dies ist die Reihenfolge, in der der Code ausgeführt wird. Natürlich ist dies zu sehr vereinfacht, aber es gibt die Grundidee. Im modernen GAS werden Sie überall Versprechen sehen. Die Grundlage für Versprechen ist asynchroner Code. Deshalb ist es so wichtig, dieses Konzept zu nutzen. Serveranfragen, Datenbankoperationen, Datei-Leseoperationen. Für all das würden wir Versprechen und asynchronen Code verwenden. Ich hoffe, es war klar und jetzt können Sie besser verstehen, wie GS den Code interpretiert. Nächstes Mal werden wir über Versprechen sprechen und Asynchron erwarten. Sieh dir andere an. 32. Async und Sync – Vorteile und Async Awart: Hi, In diesem Video werden wir endlich über Versprechen sprechen und Asynchron erwarten. Lass uns gehen. Wir wissen, dass die Grundlage für Versprechen asynchroner Code ist. Aber was ist dann ein Versprechen? Ein Versprechen ist ein Objekt, das irgendwann in Zukunft einen gewissen Wert erzeugen wird . Auf nicht blockierende Weise asynchron kann ein Versprechen einer der drei Staaten sein, die anstehend sind, der Ergebnisstatus und der abgelehnte Staat. Während sich ein Versprechen im ausstehenden Zustand befindet, bedeutet dies, dass sich das Versprechen nicht gelöst hat oder noch keinen Wert hervorgebracht hat, ein Versprechen ist gelöst. Das bedeutet, dass das Versprechen bereits einen Wert hervorgebracht hat. Und wenn Versprechen abgelehnt werden, bedeutet dies, dass dieses Versprechen geworfen und hinzugefügt wurde und es keinen Wert hervorgebracht hat. In Ordnung, lasst uns sehen, wie ein sehr grundlegendes Versprechen aussieht, und mal sehen, wie wir anfangen können, mit ihnen zu arbeiten. Lassen Sie mich also eine Variable erstellen. Ich nenne es sowas tun. Und innerhalb dieser Variablen rufe ich einfach den versprochenen Konstruktor auf. Um das zu tun, muss ich ein neues Versprechen machen. Und der Versprechenskonstruktor, ich muss den Testamentsvollstrecker oder den Rückruf liefern , der das Versprechen initialisiert. Also werde ich einen leeren Rückruf übergeben. Und dieser Callback, den ich an den Konstruktor übergebe , erhält immer zwei Argumente. Das erste Argument heißt „Resolution“. Zweitens ist die Ablehnung. Das erste Argument ist also die Funktion, die wir innerhalb des Callbacks aufrufen müssen , um aus diesem Versprechen einen Wert zu erzeugen. Und wenn wir Ablehnung nennen, werfen wir offensichtlich einen Fehler aus diesem Versprechen. Wir lehnen dieses Versprechen ab. Also rufe ich zum Beispiel einfach Resolution an. Und wie Sie der Intelligenz entnehmen können, habe ich einen Wert, den ich bestehen muss. Wir lösen ein Versprechen mit gewissen Wert, weil Versprechen einen Wert hervorbringt. Also zum Beispiel hallo. Lasst uns versuchen, dieses Versprechen einfach irgendwie zu benutzen. Denken Sie also daran, dass ein Versprechen, es ist keine Funktion. Es wäre also falsch, es mit Klammern zu nennen als ob das wertvolle eine Funktion wäre. Es reicht gerade aus, auf das Versprechen zu verweisen , damit es funktioniert. Wenn ich die Datei speichere und dann das Skript ausführe, werden Sie sehen, dass nichts passieren wird, weil wir nichts in die Ausgabe drucken. Aber wenn ich das Konsolenprotokoll mache, werde ich in diesem Fall sehen, dass das Versprechensobjekt gedruckt wird. Es ist wichtig zu beachten, dass das, was Sie hier sehen, das Versprechensobjekt ist. Es ist also das Versprechen selbst. Es ist nicht der Wert, den das Versprechen löst. Dieser Rückruf, den wir an den Promise-Konstruktor übergeben , wird synchron initialisiert. Dies bedeutet, dass dieser Callback blockiert ausgeführt wird, wenn wir auf einige verweisen . Der Wert, der aus diesem Versprechen gelöst wird, wird jedoch nicht blockierend gelöst. Und um einen Wert aus diesem Versprechen zu lösen , die eigentliche Zeichenfolge hallo zu erhalten, muss ich diese spezielle Versprechenssyntax verwenden damals genannt wird, oder einfach nur ehrwürdige Syntax. Es heißt manchmal so. So tue ich etwas DOD. Und von der Intelligenz, die Sie sehen können, habe ich endlich drei Optionen, und einen Wert aus diesem Versprechen zu lösen, muss ich die Punkt-dann Methode für das Versprechensobjekt und die 2D-Punkt-Dot-Dot-Dot-Methode aufrufen Versprechensobjekt und die 2D-Punkt-Dot-Dot-Dot-Methode Ich muss einen Rückruf bestehen. Und dieser Callback als erstes Argument erhält den Ergebniswert aus diesem Versprechen, zum Beispiel den gelösten Wert. Und wenn ich versuche, den Ergebniswert des Konsolenprotokolls zu konsolen, werden Sie sehen, dass es unsere Zeichenfolge Hallo sein wird. Wenn ich das Skript ausführe, wird Hallo in die Ausgabe gedruckt , was korrekt ist. Was ist mit der Ablehnungsfunktion, die wir als zweites Argument im Initialisierer erhalten . Versuchen wir es also und verwenden Sie anstelle von Resolve ablehnen, und sobald sie es aufrufen, können Sie einen optionalen Argumentgrund sehen. Wenn wir also ein Versprechen ablehnen, haben wir es aus irgendeinem Grund abgelehnt, meistens werden Sie ein Versprechen mit einem Fehler und anderen Versprechen ablehnen , dass Sie sagen werden, dass Sie in freier Wildbahn begegnen werden. sie werden alle mit einem Adder-Objekt ablehnen. Deshalb scheiterte statt nur die Ablehnung mit diesem Versprechen zu bestehen. Aber die Nachricht wie diese, stattdessen übergeben wir einen neuen Editor und die Nachricht wird vielversprechend sein, gescheiterte Note. Wenn ich dieses Skript ausführen werde, sehen Sie Fehler, Versprechen fehlgeschlagen und die Warnung zur sehen Sie Fehler, Ablehnung der Versprechung und wichtigen Hinweis hier sehen, dass dieser Rückruf nie ausgelöst wurde, weil das Versprechen wurde abgelehnt und wir sehen keinen Ergebniswert. Es bedeutet, dass das Versprechen einen Fehler auslöst und wir nichts tun, um damit umzugehen. Versuchen Sie immer, Fehler von Promises zu erkennen. Dies ist wirklich wichtig, da sonst Nachrichten wie diese unbehandelte Ablehnung von Versprechen angezeigt werden, die die Anwendung möglicherweise zum Absturz bringen können. Um diese Ablehnung innerhalb des Versprechens einzufangen, müssen wir den Fangblock verwenden, den wir zuvor gesehen haben. Also werde ich einfach DOD setzen und dann rufe ich einfach die Catch-Methode auf. Und drinnen muss ich auch einen Rückruf übergeben , da das erste Argument, das den Rückruf der Catch-Methode zurückruft , alles erhalten wird , womit wir dieses Versprechen ablehnen. Da wir dieses Versprechen mit einem anderen Objekt abgelehnt haben , scheiterte das neue Versprechen. Hier. Erstes Argument, ich erhalte das Objekt. Also gehe ich einfach zum Konsolenprotokoll. Und ich werde sagen, dass Adder aufgetreten ist. Und dann drucke ich einfach die Fehlermeldung aus. Großartig, versuchen wir die Datei auszuführen. Sie werden sehen, dass wir keine Warnung zur Ablehnung von unbehandelten Versprechen haben. Und dieses Mal sehen wir unser Konsolenprotokoll. Wann immer wir das Versprechen ablehnen, jeder Tanz, den wir definiert haben wird jeder Tanz, den wir definiert haben, um aus diesem Versprechen zu lösen, niemals ausgeführt , weil das Versprechen einen Fehler auslöst und dieser Fehler oder diese Ablehnung durch den Fangblock behandelt wird. Ein weiterer guter Tipp über Versprechen ist der Dot Dance. Sie können so oft angekettet werden, wie wir wollen, genauso wie Fangblöcke. Wenn ich hier zum Beispiel noch einmal einen Punkt setzen werde , wirst du endlich die intelligente Skizze sehen. Und dann rufe ich wieder die dann Methode auf, ich gebe den Anruf zurück. Diesmal habe ich einen Wert erhalten, sagen wir, und ich versuche, den Protokollwert in Sekunde zu konsolen. Und kannst du raten, was dieser Wert sein wird? Lass es uns versuchen. Und wir sehen, dass ein Versprechen gescheitert ist. Aha, okay, anstatt abzulehnen, lassen Sie uns erneut Entschlossenheit verwenden, um sagen zu lassen, dass wir die Kontrolle über Punkttanz geben. Wir müssen dieses Mal keinen Adder aus diesem Versprechen werfen. Notizdatei GS, Sie können sehen, dass Hallo zuerst gedruckt wird , weil wir dies beim ersten Rückruf tun und dann sehen wir, dass der Wert im zweiten Dan undefiniert ist. Die Sache ist, dass wenn Sie Multiples und Argumente verketten, das erste Argument im nachfolgenden Dan der Rückgabewert vom vorherigen dann sein wird, denn von diesem ersten, dann Callback wird nichts sicherstellen. Der zweite Punkt dann wird das erste Argument undefiniert sein. Wenn ich hier fünf zurückgebe, Wert hier jetzt fünf. Lass es uns versuchen. Und Sie werden den Wert in Sekunden sehen, dann ist fünf Grad. Wenn ich also noch ein drittes Duck Dan benutzen werde, und dieses Mal sagen wir mal Val Three In Dritter, dann wird es drei sein, oder? Es wird undefiniert sein, oder? Weil Literatur nichts von der vorherigen. Wenn ich dann 10 zurückgeben will, wird Val drei 10 sein. Ich hoffe, es ist klar. Und du hast vielleicht eine Frage, warum müssen wir hier mehrfachen Tanz verketten? Die Sache ist, dass wir in der realen Welt mit mehreren Versprechen gleichzeitig arbeiten werden. Und in einem Versprechen werden wir ein anderes Versprechen so nennen, werden wir ein anderes Versprechen so nennen wie dann einen Punkt machen, dann werden wir im Inneren etwas wie ein anderes Versprechen zurückgeben und dann wieder und so weiter. Aus diesem Grund ist es einfacher, das Ergebnis einer Logik an eine andere zu übergeben , um den Code zu vereinfachen , damit er lesbarer wird. Ich weiß, dass es verwirrend sein könnte, weil es hier jetzt kein echtes Beispiel gibt. Aber vertrau mir, es ist vollkommen in Ordnung. wirst du in Zukunft sehen. Versuchen wir tatsächlich, anhand von Versprechungen ein realeres Beispiel zu erstellen . Also werde ich das alles einfach entfernen. Lassen Sie uns stattdessen ein völlig neues Versprechen erstellen, dass wir die setTimeout-Funktion, die wir bereits kennen, einschließen werden. Wir möchten setTimeout in, sagen wir versprechenbasierte Syntax umwandeln . Zum Beispiel möchte ich eine Funktion erstellen, nennen wir sie Gewicht, Summe. Diese Funktion würde ich übergeben, sagen wir mal Anzahl von Millisekunden, sagen wir 40000 für 40 Sekunden. Und dies wird eine Funktion sein , die ein Versprechen zurückgeben wird. Und nach dieser Funktion , sobald das Versprechen gelöst wird dieser Callback ausgeführt, sobald das Versprechen gelöst ist. Zum Beispiel, Konsolenprotokoll, vergingen vier Sekunden. Es ist eine Art Ersatz für setTimeout, aber die Verwendung der versprochenen Syntax. Wie können wir das umsetzen. Das ist also unser Modell. Lassen Sie uns einfach auskommentieren und jetzt fangen wir an, das Versprechen zu schreiben. Weight Sum ist also eine Funktion, die ein Argument erhält, nämlich die Anzahl der Millisekunden. Also werde ich nur Gewichtssumme erstellen. Als Pfeilfunktion. Diese Funktion erhält ein Argument-Timeout in einem solchen Chaos. Und diese Funktion gibt ein Versprechen zurück, das neue Versprechen an den Versprechenskonstruktor abwirft, ich übergebe den Callback. Und dieser Callback erhält zwei Argumente, Ergebnis und Ablehnung. Aber da wir uns hier nicht auf Ablehnung treffen, verwende ich einfach das Argument „Resolution“. Also jetzt müssen wir irgendwie verzögerte Codeausführung innerhalb dieses Versprechens, wir können setTimeout verwenden. Also rufe ich einfach setTimeout an. Erstes Argument ist erneut der Rückruf, der nach der angegebenen Anzahl von Millisekunden als zweites Argument ausgelöst wird . Und für das zweite Argument werde ich nur das Argument für Gewicht einer Funktion selbst übergeben , Timeout in der Masse. Und sobald diese Kälte nach hinten losgeht, rufe ich einfach die Entschlossenheit auf, um dieses Versprechen zu lösen. Und das war's. Dies ist unsere Implementierung. Lassen Sie uns unsere Verwendung dieses Versprechens kommentieren und sehen wir uns einfach an, wie es funktioniert. Notieren Sie die Datei GS. Ich kann sehen, dass vier Sekunden vergangen sind, und ich sehe meine Ausgabe vier Sekunden nach. Ihnen zu zeigen, wie dies nicht blockierend sein wird, können wir tatsächlich dasselbe Beispiel aus unseren vorherigen Videos verwenden , das Konsolenprotokoll-Konsolenprotokoll 2. Es spielt keine Rolle, wo ich einen Versprechenspunkt Dan gebe, es wird immer mit der Punktsyntax auf nicht blockierende Weise gelöst . Es bedeutet, dass es nach allem synchronen Code immer erscheint . Um das noch einmal zu überprüfen, machen wir es vielleicht etwas kürzer. Eine Klasse von 100. Du siehst 12 und erst dann sind vier Sekunden vergangen. Und es spielt keine Rolle, ob ich setTimeout stelle oder nicht hier drüben. Zum Beispiel werde ich es einfach ohne Logik lösen. Es wird immer am Ende sein, weil ein Versprechen immer auf nicht blockierende Weise gelöst ist. Ich hoffe, es ist klar. Werfen wir einen Blick auf ein anderes Beispiel aus der realen Welt mit der Fetch-API , die wir im Browser zur Verfügung haben. Wenn ich bei Google nur den JSON-Platzhalter eintippe, landete ich auf dem JSON-Platzhalter-Punkttyp code.com. Wenn ich ein wenig nach unten scrolle, findest du diesen Abschnitt mit einem Beispiel. Also kopiere ich das einfach und füge es in mein NodeJs-Skript ein. Wenn ich versuche, die Datei auszuführen, sehen Sie, dass Fetch nicht definiert ist, da Fetch wieder nur in der Browserumgebung verfügbar ist. Es ist Teil von Browser-Web-APIs. Es ist nicht nativ in Node.JS implementiert. Deshalb funktioniert dieser Code nur im Browser. Also habe ich wieder kopiert, ich gehe zur Browserkonsole, oder? Und hier führe ich den Code aus. Also lasst es uns aufschlüsseln. Was passiert hier? Was also abgerufen wird, geben wir zunächst eine URL zu dieser Funktion an, und diese Funktion sendet eine Anfrage an diese URL und gibt uns die Antwort zurück. Dieser Punkt-Abruf ist eine Funktion, die ein Versprechen zurückgibt. Deshalb müssen wir die Punktdichte-Syntax verwenden um dieses Versprechen zu lösen. Fetch sendet also eine Anfrage nicht blockierend an die URL im Hintergrund. Und sobald die Antwort für diese Anfrage fertig ist und der Browser bereit ist, damit umzugehen, dieses Versprechen gelöst, dieser Anruf hinten los und wir erhalten Zugriff auf das Antwortobjekt. Und wie Sie sehen können, ist dies unser Nutzlastsinn für uns zurück vom Server. Und das ist das Versprechen, das anhängig war Sobald es kalt war und sobald es mit dem ersten Punkt gelöst wurde, sehen Sie, dass der versprochene Zustand jetzt erfüllt ist. Wie ich bereits erwähnt habe , wird diese Anfrage nicht blockierend bearbeitet. Das bedeutet, dass Dan nach 10 Sekunden auf nicht blockierende Weise ausgelöst wird, wenn diese Anfrage bis zu 10 Sekunden dauert , dieser Rückruf innerhalb des ersten Punktes . Aber wie lautet diese Antwort hier? Versuchen wir, dieses Beispiel ein wenig neu zu schreiben. Und anstatt Response JSON aufzurufen, gehen wir einfach zum Antwortobjekt console.log , das wir hier haben. Und wie Sie sehen können, hat das Antwortobjekt etwas Kumpel, Kumpel benutzte Header. Nun, dieses Antwortobjekt repräsentiert die Antwort des Servers. Und für dieses Objekt haben wir die Punkt-JSON-Methode, die wir für dieses Objekt aufrufen müssen, um die Nutzlast im JSON-Format zu erhalten. Wenn wir also nur auf diese URL in einem separaten Tab zugreifen wollen , oder? Das passiert alles wie manuell. Wir machen es manuell mit dem Suchfeld des Browsers, aber um es programmgesteuert zu tun, würden wir fetch verwenden und dann die Punkt-JSON-Methode aufrufen , die für das Antwortobjekt verfügbar ist. Diese aber JSON-Methode ist auch die Cerence ein Versprechen. Da es sich jedoch um eine einzige Aktion innerhalb dieses Rückrufs handelt, der Wert dieses Versprechens wird der Wert dieses Versprechens automatisch gelöst, und es ist der Rückgabewert aus diesem Rückruf. Was hier passiert, ist, dass innerhalb des ersten Punktes dann response.data nicht Methode aufgerufen wird , dieses Versprechen wird gelöst und es wird zurückgegeben. Ab dem ersten Punkt und dann Callback , da dies die Kurzschrift für Pfeilfunktionen ist, wissen wir bereits, dass der Rückgabewert der Dodge JSON-Methode als erstes Argument in der folgenden dann verfügbar sein wird deshalb haben wir hier ein Argument namens JSON. Du kannst es benennen, wie du willst, und dann trösten wir ihn einfach. Wenn wir dieses Beispiel ausführen, werden wir daher unsere Nutzlast sehen. Aber dieses Mal haben wir es programmgesteuert gemacht, anstatt Browser zu gehen und einfach auf den Euro zuzugreifen. Jetzt geschieht dies alles programmgesteuert mit der im Browser verfügbaren Fetch-API. Großartig. Ich würde sagen, es geht um Versprechen, aber es gibt noch eine Sache. Wir haben auch etwas namens async erwartet. Und asynchrone Wartezeit ist nur eine alternative Syntax zur Punkt-dann Syntax, da wir mit mehreren Versprechen gleichzeitig arbeiten werden , wird die Punktpunktsyntax irgendwann wirklich chaotisch. Deshalb ist eine Alternative zu dieser Syntax asynchron erwartet. Mal sehen, wie es aussieht, und versuchen wir, dieses Beispiel mit fetch mit async await neu zu schreiben . Zunächst einmal ist die asynchrone await-Syntax nur innerhalb einer Funktion verfügbar. Das bedeutet, dass wir eine Funktion erstellen müssen, um es verwenden zu können. Also erstelle ich einfach eine neue Funktion. Nennen wir es Anfrage senden. Und um die asynchrone await-Syntax innerhalb dieser Funktion verfügbar zu machen, müssen wir diese Funktion als Senke markieren. Also asynchrone Funktion sende Anfrage, wenn es eine Pfeilfunktion war, Const, sagen wir Anfrage senden. Es wäre so. Kurz vor der Pfeilfunktion würden wir das async-Schlüsselwort eingeben, aber lassen Sie uns die reguläre Funktionssyntax beibehalten , damit wir das wissen. Um dieses Versprechen zu lösen, müssen wir den Punkt Dan aufrufen und einen Rückruf innerhalb der Async-await-Syntax bereitstellen . Wir verwenden keinen Punkt, dann verwenden wir das Schlüsselwort await. Warte auf dich. Deshalb heißt der Syntaxname async await, denn nun, es sind nur zwei Schlüsselwörter, asynchron, um die Funktion zu markieren, die mit async verwendet werden soll, auf Syntax und ein Gewicht warten, um das Versprechen zu lösen. Ich rufe einfach Fetch an. Lass es mich kopieren. Hol. Und um darauf zu warten, dass dieses Versprechen gelöst wird, muss ich einfach ein Gewicht nach vorne legen und dies wird den Punkt ersetzen, dann wird er vor einer Wartezeit wieder genannt, ich muss den Ergebniswert aus diesem Versprechen unterschreiben über Apple zum Beispiel wird dies Antwort gleich sein warten, holen. Und das Gleiche werden wir mit der JSON-Methode machen. Jetzt haben wir Zugriff auf das Antwortobjekt. Und dann erstellen wir die neue Variable JSON. Und es wird erwartet Response Dot JSON, der auf dem Antwortobjekt verfügbar ist. Wenn Sie das Schlüsselwort await nicht verwenden, ist die JSON-Variable das Versprechensobjekt, genau wie Sie es die JSON-Variable das Versprechensobjekt, am Anfang des Videos gesehen haben. Das ist nicht das, was wir wollen. Wir wollen den Ergebniswert aus diesem Versprechen nur , wenn ich das await-Schlüsselwort entfernen werde , oder? Und wenn ich mit dem Mauszeiger auf die Variable fahre, sehe ich Versprechen, denn dies ist das Versprechensobjekt. Aber wenn ich warte, werde ich welche haben, was bedeutet, dass diese Variable jeden Wert enthält, aber es ist definitiv kein Versprechensobjekt. Jetzt werden wir versuchen, JSON zu konsolenprotokoll. Und dieser Code wird diese drei Zeilen einfach vollständig ersetzen. Ja, es ist ein bisschen mehr Zeilen, aber diese Syntax ist einfacher zu lesen. Die asynchrone await-Syntax basiert auf Versprechungen, und ihre Absicht ist es, Versprechen zu machen eher wie normaler synchroner Code auszusehen. Weil Sie sehen können, können wir diesen Code Zeile für Zeile lesen , anders als bei Punkt, dann ist ein Knoten , der hier zeigt, die zweite Codezeile, oder? Zeile Nummer sieben wird nicht vor den Ergebnissen der Zeile 6 ausgeführt , da wir das Schlüsselwort await verwenden. Dies bedeutet, dass, wenn diese Codezeile, Versprechen 10 Sekunden dauert, um ausgeführt zu werden, der Code nicht geht weiter. Es wird alle zehn Sekunden warten, bis sich das Versprechen gelöst hat, weil wir das await-Schlüsselwort verwenden, das Versprechen wartet. Das Versprechen löst sich und erst dann geht die Hinrichtung weiter. Ich hoffe, es ist klar zu überprüfen, ob wir die Funktion aufrufen und diesen Code im Browser ausführen lassen . Und Sie werden sehen, dass wir genau das gleiche Ergebnis haben werden. Wir werden unsere Nutzlast sehen , die wir vom Server erhalten. Okay, ich schätze, das ist alles für dieses Video. Und ich weiß, dass es wirklich schwer war , diese Menge an Informationen zu verstehen. Es war sehr verwirrend, aber vertrau mir, es ist nicht so kompliziert, wie es scheinen mag. Wir werden das Thema noch einmal in unseren React-Projekten anhängen . Und hier sehe ich dich das nächste Mal. Tschüss. 33. ECMAScript: Hey, in diesem Video möchte ich über atmosphärische Module in der Umgebung Node.JS sprechen , wir wissen bereits, dass es ein natives Modulsystem gibt , das als Common GS bezeichnet wird. Es verwendet die Required- und Modul-Export-Syntax , um etwas aus einem Modul in der Browserumgebung zu importieren und zu exportieren einem Modul in der Browserumgebung Wir haben auch ein natives Browsermodulsystem , das als Skript bezeichnet wird. Module und atmosphärische Module verwenden Import- und Exportsyntax. Nodejs-Community drängt Ackman Script-Module dazu, in Node.JS implementiert zu werden, um CommonJS zu ersetzen, da Ekman Script-Module bequemer und umfassender sind. Und schließlich haben wir Tools entwickelt, die es uns ermöglichen, ACML Script-Module in der Umgebung Node.JS ohne direkte Unterstützung für atmosphärische Module in der Umgebung Node.JS zu verwenden Umgebung Node.JS ohne direkte Unterstützung für atmosphärische Module in , und modern JavaScript sehen Sie ECMO Script-Module. Und selten würde ich sagen, du würdest CommonJS sehen. In diesem Video möchte ich über den Import und Export von atmosphärischen Modulen sprechen , da es einige wichtige Aspekte gibt , die wir über sie verstehen müssen. Lassen Sie uns zunächst zwei Dateien erstellen. Also benenne ich file.js in file.js MGS um , um ACML Script-Module nativ in der Node.JS Umgebung zu verwenden . Dann erstelle ich eine zweite Datei namens Second MGS. Und ab dem zweiten MGS exportiere ich ein paar Dinge. Also erstelle ich zuerst eine Variable namens Five, und ich exportiere fünf direkt daneben. Ich exportiere Const 10. Und ich werde es so angeben. Siehst du den Unterschied? Also habe ich zuerst eine Variable erstellt, dann habe ich sie exportiert. Und hier ist nur ein Einzeiler, im Grunde das Gleiche wie oben. Vielleicht exportieren wir etwas anderes. Exportieren Sie const. Mein Name wird Andrew sein. Und ganz am Ende werde ich den Export Standard setzen und dieses Mal lass es einfach so einkaufen. Wie Sie sehen können, haben wir zwei Arten von Experten. Wir haben Exporte benannt und haben einen Standardexport. Als Aqua Script-Module gibt es zwei Arten von Experten, die benannt und standardmäßig benannt sind. Es kann nur einen Standardexport in einem Modul und so viele benannte Exporte geben, wie Sie möchten. Nun, wie können wir all diese tatsächlich importieren. Wenn ich hier zu File MGS gehe, muss ich etwas aus dem zweiten MGS importieren eingeben. Großartig. Was soll ich hier liefern, um 5 zu importieren? Nun, die Sache ist, dass jedes Modul sein eigenes Exportobjekt hat, das Expertenobjekt für zweite MGS wird so aussehen. Also erforschen wir zuerst fünf, oder? Was unser benannter Experte sein wird, denn nun, wir haben die Bibel fünf genannt und wir exportieren Variable mit dem Namen fünf. Fünf werden also fünf sein, dann dieselbe Breite, 10 und dasselbe mit meinem Namen. Dies sind alle unsere benannten Exporte. Am Ende haben wir den Export Default Shot, Standardexperten . Sie haben keinen Namen. Das liegt daran, dass sie Standard sind. Sie exportieren nur einen Wert. Sie können sehen, dass ich keinen expliziten Namen für eine Zeichenfolge scharf erstellt habe, oder? Es ist keiner Variablen zugewiesen, es wird nur standardmäßig exportiert, atmosphärische Module hängen diesen Standardexport tatsächlich unter dem Standardschlüssel an das Exportobjekt an das Exportobjekt an, genau so. Irgendwann haben wir ein Objekt wie dieses. Das exportieren wir aus zweiten Mgs. Wenn ich jetzt 5 importieren möchte, kann ich object is structuring verwenden. Warum? Weil gut, wir exportieren ein Objekt. Auch hier hat jedes Modul ein Expertenobjekt, und da es sich um ein Objekt handelt, können wir die Objektzerstörung verwenden. Deswegen. Hier neben dem Import werde ich geschweifte Klammern für diese Strukturierung setzen. Und ich importiere 5, richtig, gab den Schlüssel an, den ich importieren wollte 5. Außerdem möchte ich vielleicht meinen Namen, fünf und meinen Namen holen . Lass uns console.log fünf und meinen Namen. Und lassen Sie uns das Skript ausführen, um das zu überprüfen. Und wir sehen fünf und Andrew. Was stimmt. Was ist jedoch mit unserem Standardexport hier drüben? Versuchen wir, den Standardwert zu importieren. Eigentlich weniger Zerstörungsausfall. Wenn ich das mache, habe ich sofort einen Syntaxfehler. Die Sache ist, dass wir dieses reservierte Standardschlüsselwort nicht einfach verwenden können. Dies ist nicht zulässig, um den Standardexport zu importieren, wir müssen die Strukturierung nicht verwenden. Stattdessen. Wir müssen ihm nur unseren eigenen Namen für den exportierten Wert geben. Lass es also mein Standard-Importkomma sein und dann alle benannten Exporte. Wenn wir also nicht alle diese genannten Exporte benötigen, können wir nur den Standardexport importieren, was scharf sein wird. Also werde ich diesen Strukturierungsteil entfernen und nur meinen Standartimport behalten. Lassen Sie mich nun versuchen, meinen Standartimport in der Konsole zu protokollieren. Sie werden scharf sehen und es spielt keine Rolle welchen Namen ich für meinen Standartimport gebe. Es spielt keine Rolle, weil wir es anfangs tun, es hat keinen Variablennamen. Im Gegensatz zu unseren benannten Experten haben sie alle einen aussagekräftigen Namen. Wir exportieren die Variable mit dem Namen fünf. Deshalb können wir sie einfach umbenennen, wenn wir diese Variable importieren , oder? Wir können einfach 55 großgeschrieben setzen , existiert nicht für das exportierte Objekt. Wir haben fünf, was Kleinbuchstaben ist. Deshalb müssen wir die gleichen Regeln strikt befolgen wie bei der Objektzerstörung. Wir müssen dieselben Namen verwenden, die wir exportieren. Ein anderer Anwendungsfall wäre, wenn wir all dies als ein einziges Objekt importieren müssen. Genau wie Sie hier sehen, möchten wir nicht wie benannte Exporte und Standardexport trennen , einfach so. Wir wollen sie nicht so trennen. Stattdessen wollten wir das eine ganze Objekt erhalten. In diesem Fall können wir Asterix als und dann den Namen des Objekts importieren . Also lass es das zweite Modul sein. Und jetzt, wenn ich das zweite Protokoll abbrechen will, werden Sie sehen, dass ich im Grunde mein Exportobjekt habe . Ich habe 5, 10, meinen Namen und Standardwert. Und um auf den Standardexperten zugreifen zu können, muss ich jetzt tatsächlich auf den Standardschlüssel verweisen, oder? Du wirst scharf sehen. Wenn ich auf 10 zugreifen muss, muss ich 10 verwenden. Was wir gerade gemacht haben, haben wir das gesamte Modul in dieses zweite Modul importiert , die Schlagschale, würde ich in der Praxis sagen, dies ist in der Praxis in der realen Welt weniger üblich. Die meiste Zeit werden wir entweder einen Standardexport oder einen benannten Export sehen . Sie werden in der realen Welt viel benutzt. Wir werden tatsächlich entweder so sehen 510 oder wenn ein Modul nur den Standardexport hat, würden wir nur diesen Standartimport verwenden. Und wir würden es einfach so benutzen. Nun, da wirst du es im Grunde sehen. Es ist nicht so schwer, diesen Teil zu verstehen. Sie müssen nur immer daran denken, dass es zwei Arten von Exporten gibt . Als Standardexport und benannter Export gibt es nur einen Standardexport für ein einzelnes Modul, mit dem Sie den Standardexport hier nicht exportieren können. Wenn ich das versuche, werden Sie sehen, dass ich Syntaxfehlerkennung bereits die Syntaxfehlerkennung deklariert habe. Ich empfehle Ihnen, sich immer daran zu erinnern, dass jedes Modul ein Objekt hat, das exportiert wird und alle benannten Exporte mit diesem Objekt zusammengeführt werden. Es ist einfacher, sich daran zu erinnern, dass Sie dieses Objekt importieren müssen. Die Verwendung von Objekt ist Strukturierung. Ich denke, ECMO Script-Module machen Spaß und ich mag sie wirklich. Und ich hoffe, U2 wird dich im nächsten sehen. 34. ECMAScript oder JavaScript: Hey, das wird kurz sein. Ich möchte nur den Unterschied zwischen einem Skript und JavaScript klären . Sie haben wahrscheinlich viele Begriffe gesehen, wie ES6 ist fünf, ES 2015. Nach diesem Video wirst du den Unterschied kennen. Um nach der Antwort zu suchen, verwende ich Google und tippe einfach ECMO-Skript oder GS ein. Und Google wird mir den Unterschied sagen. Wie wir aus dem ersten Pop-up sehen können, ist die ECMO-Skriptspezifikation ein Blueprint zum Erstellen einer Skriptsprache. Und JavaScript ist eine Implementierung dieses Blueprints. Und Sie können verschiedene Variationen dieser Aussage über all diese Links sehen. Um diese Aussage schnell zusammenzufassen, kann ich sagen, dass das ECMO-Skript eine Reihe spezifischer Kationen ist , die JavaScript implementiert. Es bedeutet, dass AGMA-Skript eine Art Skript für einen Film ist , in dem Film JavaScript ist, so einfach ist. Für weitere Informationen können Sie zur Wikipedia-Seite für das ECMO-Skript navigieren . Lassen Sie mich diese Seite öffnen und von hier aus können wir verschiedene Versionen von Acme Scrape sehen. Die gebräuchlichste Version des ACML-Skripts ist wahrscheinlich ja, 2015, das ES6 heißt, da es sich um die sechste Ausgabe des ECMO-Skripts handelte. Wenn Sie nach unten scrollen, können Sie lesen, was genau für diese bestimmte Version erstellt wurde . Und es gibt auch einen Begriff namens ES. Wie Sie sehen können, ist dies ein dynamischer Name, der sich auf die nächste Version bezieht, die zum Zeitpunkt des Schreibens enthalten wird. Jetzt wissen wir, dass jeder, der JavaScript als ECMO-Skript bezeichnet , eine richtige Person ist. Denn jetzt wissen wir, dass diese beiden im Grunde dasselbe sind. Ich glaube, das war's. Weitere Informationen finden Sie in Wikipedia oder Google. Wir sehen uns im nächsten. 35. Was ist React?: Hey, endlich fangen wir an, über React zu reden. Diese kurzen kommenden Videos werden auf die Theorie und Konzepte von React eingehen. Zögern Sie nicht, diese Serien jederzeit in Zukunft zu referenzieren . Los geht's React ist eine Bibliothek zum Erstellen von Benutzeroberflächen. Es kann verwendet werden, um Websites, mobile Apps und sogar Desktop-Apps zu erstellen . Der einfachste Weg, um zu reagieren, besteht wahrscheinlich darin im Internet zu reagieren, um Websites zu erstellen. In diesem Video werde ich aus Sicht des Webs sprechen, reagiert Ziel ist es, Benutzeroberflächen mit so genannten Komponenten zu erstellen . Für Websites ist es nur React oder React für das Web. Für mobile Apps ist es React Native für Desktop-Apps, es heißt Elektron. React funktioniert nur auf der Ansichtsebene. Dies bedeutet, dass React nicht dazu zwingt, wie Sie Ihre App erstellen sollten. React erzwingt einfach seine eigene Logik und diktiert, wie Sie die zugrunde liegenden HTML-Elemente manipulieren sollten . Der Rest liegt in der Vergangenheit an dir. Hier, um 20 und 10, wurde jQuery viel verwendet, um HTML über JavaScript zu manipulieren. Heutzutage ist es jedoch nicht nötig, jQuery zu verwenden. Da React nur auf die Bibliothek ist, kann sie in jede vorhandene App integriert werden , um eine Benutzeroberfläche zu erstellen. Beispiele für React-Websites sind Facebook und Netflix. Discord verwendet React für alles, um seine Website, mobile App und sogar ihre Desktop-App mit React zu erstellen mobile App und sogar ihre Desktop-App . Ziemlich beeindruckend, nicht wahr? React ist kein Framework, das von anderen Teilen der Anwendung besteht mit anderen Tools und Bibliotheken erstellt werden muss. Und Sie werden sehen, dass, sobald wir mit der Codierung begonnen haben, zunächst nur für Websites verwendet wurde , die vollständig von JavaScript verwaltet werden und eher mobile Apps füllen sollen. Aber im Moment, React Community, hat es viele Tools und Frameworks geschaffen , um zu reagieren. Daher sind wir heutzutage in der Lage, mit React jede Art von Website zu erstellen. Aber da ist es serverseitiges Rendern, einseitige App, statische Webseiten oder vielleicht eine Hybridanwendung. Und du hast wahrscheinlich andere Lösungen gesehen, wie Vue, JS, Svelte oder vielleicht sogar Angler. Sie alle basieren auf Komponenten und erzielen schließlich das gleiche Ergebnis. Es ist wirklich schwer zu sagen, welches man wählen soll. Etwas ist einfacher. Etwas ist schwieriger. Wenn Sie immer noch mit der Wahl zu kämpfen haben, würde ich empfehlen, das mit einem ansprechenderen Namen oder Logo auszuwählen , so einfach ist. Aber in unseren Projekten werden wir React kennenlernen. Bleiben Sie dran, denn es sind nur noch ein paar Theorievideos übrig bevor wir bis zum nächsten Teil in den Codierungsteil kommen. 36. Komponentenbasierter Ansatz: Hey, dort Im vorherigen Video habe ich Komponenten und komponentenbasierten Ansatz erwähnt. Aber was ist die Komponente? Eine Komponente ist nur ein HTML-Block, der in Zukunft nicht reduziert werden kann. Komponentenbasierter Ansatz besteht darin, wenn eine Anwendung mit Komponenten erstellt wird, sollten Sie sich eine Komponente besser als ein benutzerdefiniertes, vom Benutzer erstelltes HTML-Tag vorstellen . Darüber hinaus können Komponenten auch Logik und Status enthalten. Beispielsweise kann eine Komponente eine Schaltfläche sein , die die Farbe ändert. Nach dem Anklicken ändert die Schaltfläche ihre Hintergrundfarbe. Wir können diese Komponente als Farbschaltfläche benennen. Und später in irgendeinem Teil des HTML-Codes, Verwenden Sie die Schaltfläche Farbe so oft wir möchten. Dies ist im Grunde das, was wir mit HTML-Tags machen. Die Komponenten unterscheiden sich nicht. Es ist sinnvoll, sie als Bausteine für die App zu betrachten . komponentenbasierte Ansatz bildet einen Baum von Komponenten. Zusätzlich zu diesem Baum gibt es eine Root-Komponente, die andere Komponenten in der React Root-Komponente verschachtelt , die fast immer als App bezeichnet wird, oder andere Komponenten sind innerhalb der App-Komponente verschachtelt. Komponenten, die oben liegen, werden als Komponenten der obersten Ebene bezeichnet. Dies sind normalerweise Seiten. Komponenten, die höher im Baum erscheinen , werden Eltern genannt. Sobald das unten lag, werden Kinder genannt. Werfen wir einen Blick auf die offizielle Facebook-Seite. Facebook ist der Schöpfer von React und deshalb ist es bestmögliche Beispiel, das man beobachten kann. Ich werde versuchen, den Raum in Komponenten aufzuteilen , um Ihnen eine Grundidee zu geben: Los geht's. Die gesamte Website selbst ist die App-Komponente. Oben hätten wir Navbar-Komponente und Navbar in der Mitte, es gibt eine Navigationskomponente und jede Schaltfläche darin ist auch eine andere Komponente. Auf der rechten Seite kann es sich um eine profilierte Navigationskomponente handeln, bei der jede ähnliche Schaltfläche dieselbe Komponente ist , aber mehrmals wiederverwendet wird. Probieren Sie es selbst aus und teilen Sie das unten stehende Dropdown-Menü in Komponenten unter der jetzt Leiste auf, es kann eine Homepage-Komponente sein. Die Homepage enthält drei Komponenten. Sidebar links, Seitenleiste rechts und Feed in der mittleren Seitenleistenkomponente enthält Menü. Feed-Komponente enthält eine Liste von Beiträgen und die Seitenleiste auf der rechten Seite enthält etwas anderes. Es liegt ganz an den Entwicklern Komponenten zu strukturieren und zu erstellen. Es ist sicherlich möglich, das gesamte Markup und die gesamte Logik in einer einzigen Komponente beizubehalten Logik in einer einzigen Komponente ohne andere Komponenten zu erstellen. Aber dann wäre die Idee eines komponentenbasierten Ansatzes völlig gefährdet. Und es wird das Gleiche sein, als überhaupt keine Komponenten zu verwenden. Am Ende des Tages enden wir mit einem Baum von Komponenten. Und dieser Baum hat immer eine Richtung von oben nach unten. Wenn es Änderungen an einer übergeordneten Komponente gibt, sind alle untergeordneten Elemente dieser Komponente ebenfalls betroffen, weil sie Teil davon sind. Lassen Sie uns abschließend schließen. Die Entwicklung mit React basiert auf einem komponentenbasierten Ansatz. React App kann als Komponentenbaum visualisiert werden. Komponenten sind wiederverwendbare Teile der App. Vorteile von Komponenten sind Wiederverwendbarkeit und Konsistenz in der gesamten Anwendung. Ob Usability User Post Component an einer beliebigen Stelle in der App eingefügt werden kann beliebigen Stelle in der App eingefügt , war nur eine einzige Codezeile. Mit Konsistenz verhält sich die Benutzerpostkomponente unabhängig von der Seite oder dem Ort, an dem sie verwendet wird, immer genau gleich . Nun, das war's. So werden heutzutage alle modernen Apps mit Komponenten erstellt. Ich hoffe, es ergibt Sinn. Cia. 37. Funktionen vs. Kurse: Hi, React. Es gibt zwei Arten von Komponenten für uns, klassenbasierte und funktionelle Abfälle. Sie unterscheiden sich in der Syntax und der Art und Weise, wie wir Daten in ihnen manipulieren. Vor React Hooks hatten wir keine andere Wahl, Kompetenz unter Verwendung von Klassen in der Gegenwart zu schaffen, die Situation ist etwas anders. Mit React Hooks verwenden wir Funktionen, um Komponenten zu erstellen. React-Hooks sind nur in funktionsbasierten Komponenten verfügbar , weshalb Funktionen Komponenten vereinfachen. Die Syntax ist leichter und einfacher zu verstehen. In unseren Projekten werden wir React Hooks verwenden, was bedeutet, dass wir mit funktionsbasierten Komponenten arbeiten werden. Nur. Klassenbasierte Komponenten werden immer seltener verwendet. Es ist jedoch möglich, dass Sie manchmal klassenbasierte Komponenten sehen, aber das ist völlig in Ordnung. Das React-Team hat seine Einsätze an React Hooks und sie glauben , dass Hooks die Zukunft sind. Nach Abschluss des letzten Projekts können Sie klassenbasierte Komponenten lesen , und Sie werden keine Probleme beim Übergang zwischen Funktionen und Klassen haben keine Probleme beim Übergang . Ich hoffe, es ergibt Sinn. Wir sehen uns im nächsten. 38. React: Hallo nochmal. Mal sehen, wie React unter der Haube funktioniert. Am Beispiel einer einseitigen Anwendung, dem besten Weg, an eine React-App zu denken, als ob eine Struktur von Komponenten in React wäre, gibt es eine Sache, die als Befestigungspunkt bezeichnet wird , in den die React-Anwendung eingefügt wird oder besser zu sagen, standardmäßig eingehängt, ist es ein div-Tag mit ID unhöflich. Oben im Baum befindet sich die App-Komponente, die der Wrapper für alle Komponenten in der App ist. In der App-Komponente befinden sich Komponenten der obersten Ebene. In ihnen legen Sie verschachtelte Komponenten und so weiter bis zur sehr verschachtelten Komponente. Wenn wir einen Moment daran denken würden, ist es ziemlich dasselbe wie die HTML-DOM-Struktur, oder? Das Document Object Model oder DOM ist die Darstellung der HTML-Seite in Form eines Tag-Baums. Dom ist, wie Browser HTML-Markup sehen und interpretieren. Wenn wir grundlegende Dinge in JavaScript wie document.getElementById-ID , ist dieses Dokumentobjekt Teil der DOM-API, die vom Browser bereitgestellt wird. React erstellt in der Speicherdarstellung des Komponentenbaums namens virtuelles DOM. Es ist das gleiche wie das DOM des Browsers, aber es wird nur intern von React verwendet. Wenn React App, die in der Seitenkomponentenstruktur gerendert wird , aus der virtuellen dominanten Präsentation in HTML-Markup übersetzt wird. Dieses HTML-Markup wird dann in das Montageelement auf der Webseite eingefügt. Denken Sie daran, dass all dies über JavaScript geschehen wird. Wenn Daten Komponenten sind, die aktualisiert werden müssen, arbeitet React immer mit dem virtuellen DOM an erster Stelle. Es nimmt den zuvor erfassten Status des virtuellen DOM an, vergleicht es mit dem neu erstellten mit Updates und berechnet den Unterschied. Wenn es einen Unterschied gibt, berechnet React, welche Daten und Komponenten aktualisiert werden müssen. Und diese Änderungen werden als 3D-Render bezeichnet. Jeder Render repräsentiert im Grunde genommen virtuellen DOM-Status, den virtuellen DOM-Status, der Prozess der Berechnung der Differenz zwischen Rendern wird als Abstimmung bezeichnet. Und der Algorithmusname für diesen Prozess lautet React Fiber. Einfach ausgedrückt erkennt React Fiber, was zwischen den Re-Rendern aktualisiert werden muss. Sie haben vielleicht eine Frage, warum verwenden Sie virtuelles DOM? Fügt es nicht einen zusätzlichen Schritt und mehr Komplexität hinzu? Nun, es kommt darauf an. Virtuelles DOM ändert sich oder leichter , da sie sich alle im Speicher befinden, im Gegensatz zu Änderungen in einem echten DOM Wenn das HTML-Markup geändert wird, berechnen Browser normalerweise das Layout und streichen die Webseite neu. Es ist besser, 100 Updates in virtuellem DOM zu haben, was schließlich zu einem einzigen echten DOM-Update und einem Patch führt einem einzigen echten DOM-Update und einem Patch , das größer ist, als alle 100 Updates direkt auf echtes DOM anzuwenden . Wenn wir durch eine Website unter der Haube navigieren, wird HTML ständig aktualisiert. React stellt sicher, dass diese Aktualisierungen so effizient wie möglich durchgeführt werden. Die Idee hinter virtueller Kuppel besteht darin, die Anzahl der echten DOM-Updates zu reduzieren. Ich weiß, dass es schwierig sein könnte , diese Menge an Informationen wahrzunehmen, aber es ist völlig in Ordnung. Sie sind nicht verpflichtet, alle Details zu kennen. Jetzt wissen wir, wie React intern funktioniert. Das ist einer, bei dem ein fehlendes Stück über seine Architektur, diese Erbsen sind Einwegdatenfluss , der als Fluss bezeichnet wird. Flux ist der Name einer reagierten internen Architektur. Flux impliziert, dass Daten in der App immer in eine Richtung von oben nach unten fließen. Wenn beispielsweise Daten innerhalb einer Komponente aktualisiert werden, die Komponente und alle ihre untergeordneten Elemente ebenfalls gerendert. Sollten Kinder aktualisiert werden oder nicht, ist die Arbeit für die zuvor erwähnte React Fiber, den Algorithmus, der berechnet was genau aktualisiert werden muss. Tatsache ist jedoch, dass Updates von übergeordneten Komponenten zu untergeordneten Komponenten verlagert werden. Es ist unmöglich, dass Datenfluss von unten nach oben geht. Ich denke, das werden Sie spüren können , wenn wir React-Code schreiben. Alles klar, lassen Sie uns unter der Haube zusammenfassen, react verwendet eine eigene HTML-DOM-Darstellung namens virtuelles DOM. virtuelle DOM-Ziel ist es, die Anzahl der realen DOM-Updates zu reduzieren . React Core-Algorithmus heißt React Fiber und seine Hauptaufgabe besteht darin, zu berechnen, was genau zwischen den Re-Rendern aktualisiert werden muss . Architekturdesign heißt Flux, was impliziert, dass die Datenflüsse nur in eine Richtung von übergeordneten Komponenten zu untergeordneten Komponenten. Nun, das sind alle Informationen über React. Mach dir keine Sorgen, wenn das verwirrend war. Sehen Sie sich einfach das Video an oder suchen Sie bei Bedarf nach weiteren Informationen. Wir sehen uns als Nächstes. 39. Boilerplates: Hey, dieses Mal möchte ich darüber sprechen wie wir mit der Entwicklung einer neuen React Web App beginnen können. In diesem Video werde ich keine anderen Online-Plattformen wie CodePen für die direkte Entwicklung im Browser betrachten wie CodePen für . Weil diese Plattformen nur als Spielplätze verwendet werden oder normalerweise nur um den Code schnell mit dem grundlegenden Setup zu teilen. Um zu verstehen, wie moderne JavaScript-Apps erstellt werden, müssen wir verstehen, was unser Projekt Butler ist ein Projekt Bundler ein Tool, das den gesamten Quellcode, Skripte, Stile, Bilder, Prozesse, all das, und erstelle ein Projekt gebaut. Project Built ist eine gebündelte minifizierte Version des Quellcodes, die für maximale Effizienz optimiert ist. Das sind Tonnen von Projekt Bundler Sound sind die häufigsten sind Webpack, Roll-up und Paket. Alle modernen JavaScript-Projekte werden von diesen Tools abgedeckt. Großartig, Kommen wir zu unserer Hauptfrage zurück, wie wir mit der Entwicklung einer neuen React-App beginnen können. Es läuft schließlich auf drei Durchgänge hinaus. Die erste Möglichkeit, eine React-App zu erstellen, besteht darin , alle Build-Tools wie Webpack für React von Grund auf neu einzurichten und zu konfigurieren . Die zweite Möglichkeit besteht darin, eine Projektvorlage zu verwenden. Wir haben Tools entwickelt, die bereits für die React-Entwicklung konfiguriert sind. Und der dritte Weg besteht darin, ein React-Framework wie nächste GS oder Gatsby zu verwenden . Es gibt keine richtige Antwort darauf, welche Sie wählen sollten. Es hängt alles davon ab, nach welcher Konfiguration Sie suchen, persönlichen Vorlieben, Besonderheiten und so weiter. Alles manuell einzurichten und Projekt Butlers wie Webpack von Grund auf neu zu konfigurieren , ist heutzutage selten zu sehen. Fast jedes Mal würden Sie entweder eine Vorlage oder ein Framework verwenden. Vorlagen werden übrigens oft als Boilerplates bezeichnet, was bedeutet, wann immer Sie sehen, wo die Boilerplate nicht ausflippt, ist es nur eine andere Möglichkeit, Word-Vorlage zu sagen. Es gibt viele verschiedene Community erstellte React-Projekt-Boilerplates, die eine Vorlage kopieren und anfangen nichts mehr zu entwickeln. Die bekannteste React-Boilerplate ist wahrscheinlich die Create React App, die vom React-Team unter der Haube verwaltet wird vordefinierte Webback-Konfiguration verwendet. Sie könnten versucht sein, nur Create React App zu verwenden. Es ist jedoch wichtig sich daran zu erinnern, dass die Create React App nicht die einzige Möglichkeit ist , React-Apps in der Gegenwart zu entwickeln, es gibt viele großartige Alternativen. Derzeit sind VDD und Snowpack ziemlich beliebte Tools für Front-End. Eine andere Möglichkeit, mit React umzugehen besteht darin, ein React-Framework zu verwenden. Frameworks sind derzeit sehr beliebt , besonders als nächstes, ja, aber ich würde sagen, dass es besser ist, mit dem Lernen zu beginnen, ohne ein Framework zu reagieren. Da Frameworks für ChES Frameworks spezifische Funktionen und Rollen in unseren Projekten enthalten, werden wir bereits konfigurierte Vorlagen und Build Hills verwenden . Welche? Setzen Sie sich selbst ein, sobald Sie in die Projekte einsteigen, sehen Sie andere 40. 1 TicTacToe Projektübersicht: Hallo ihr alle. Willkommen im Bereich Tic Tac Toe. Dies wird ein kurzes Einführungsvideo sein ein kurzes Einführungsvideo dem Sie eine Vorschau des Projekts anzeigen können. Das Projekt wird das Tic Tac Toe-Spiel sein, das Sie jetzt auf Ihrem Bildschirm sehen können. Wir können auf Quadrate klicken. Wir können das Spiel spielen. Immer wenn wir einen Gewinner haben, wird die Gewinnkombination hervorgehoben. Wir werden unterschiedliche aktive Wirkungen haben. Ebenfalls unten ist der Spielverlauf , Spielverlauf , wir durchqueren und sehen können, welche Züge wir gemacht haben, wenn wir auf Quadrate klicken, können wir den Verlauf überschreiben, falls wir die Schaltfläche zum Starten des Spiels benötigen, und ich würde sagen, das ist so ziemlich alles. Obwohl es vielleicht einfach aussieht. Es enthält viele grundlegende Konzepte, die eine gute Grundlage für Ihr React-Wissen bilden. Also lasst uns anfangen. 41. 2 Neues Projekt mit Vite erstellen und konfigurieren: Hallo zusammen. Wir werden endlich mit dem Bau des ersten Projekts beginnen, das Tic Tac Toe sein wird. Das Tool, mit dem wir Tic Tac Toe bauen werden, wird Vite sein. Dies ist die offizielle Vite-Website , die Sie gerade sehen können. Sie können es bei Google finden. Ich klicke auf „Get Started“ und lass uns sehen, was genau Vite macht. Im Grunde ist Vite ein Frontend-Tool, das das Projekt erstellt. Es kann alles sein. Es kann React sein, es kann rohes JavaScript sein oder es kann jedes andere unterstützte Framework sein. Unter der Haube verwendet Vite Rollup. Rollup ist ein Modul-Bundler. Rollup ist im Grunde das Tool, das das Projekt erstellt, und Vite ist die Konfiguration rund um Rollup. Vite ist ziemlich schnell und im Moment sogar sehr beliebt. Lassen Sie uns die Dokumentation durchgehen und zu Ihrem Projekt für die erste Woche scrollen. Wir benötigen Node-Version 14 und höher, aber ich bin mir ziemlich sicher, dass Sie die neueste stabile Version haben , die derzeit 18 ist. Wir können sehen, dass wir mit npm ein neues Projekt erstellen können , indem wir einfach diesen Befehl ausführen. Ich kopiere diesen Befehl und gehe zu CMD. In allen Projekten werde ich Git Bash verwenden, und in VS Code werde ich Git Bash verwenden. Für diesen werde ich jedoch CMD verwenden. Sie können jede andere Shell verwenden. Ich habe mich speziell für CMD entschieden weil Vite uns ein paar Fragen stellen wird und wenn Git Bash als separate Instanz ausgeführt wird, hat es im Gegensatz zu CMD Probleme mit der Interaktivität. Sobald ich diesen Befehl ausführe, stellt Vite mir ein paar Fragen und dann erstelle ich einen neuen Projektordner. Ich werde jedoch einen neuen Projektordner in unserer aktuellen Terminalnavigation erstellen . Im Moment werde ich in CMD navigiert, um meinen Benutzernamen zu sehen. Dies ist ein Benutzerordner, und sobald ich den Befehl Vite ausführe, wird der Projektordner hier in diesem Verzeichnis erstellt . will ich nicht tun. Ich möchte meinen eigenen Projektordnerpfad festlegen. Dafür muss ich zuerst entscheiden, wo ich mein Projekt platzieren möchte. Für mich wird es hier in d_Web sein. Dies ist der Ort, an dem ich mein Projekt platzieren möchte. Zuerst muss ich im Terminal zu diesem Ordner navigieren . In CMD gebe ich den Festplattennamen ein, um die Navigation auf Diskette D zu ändern. Wenn du in Git Bash bist, dann musst du cd d und Doppelpunkt eingeben, dann musst du cd d und Doppelpunkt eingeben, wenn du dich in einer anderen Shell befindest, dann bin ich mir ziemlich sicher , dass du Linux-Shell, wie Bash, oder vielleicht auf Mac, ich bin mir ziemlich sicher, dass du das nicht einmal brauchst. Wie dem auch sei, ich bin auf der D-Diskette, dann tippe ich cd ein, cd steht für Change Directory, und ich gebe einfach cd_web ein. Ich weiß, dass es _web ist, denn wenn ich ls eingebe, ist ls ein Unix-Shell-Befehl um alle Ordner in der aktuellen Navigation aufzulisten. Da CMD jedoch ein Windows-basiertes Terminal ist, muss ich dir verwenden, also ist dir die Befehlsalternative zu einem Less innerhalb von Windows Power Terminal. In D habe ich _web. Das ist genau das, was ich navigiere, also gebe ich cd_web und bumm, jetzt bin ich in diesem Ordner und kann den Vite-Befehl sicher ausführen. Ich werde den kopierten Befehl ausführen. Es hat mich nach einem Projektnamen gefragt, wir werden ihn Tictactoe-vite nennen. Ich drücke „Enter“. Jetzt muss ich ein Framework auswählen. Wir werden React wählen und die Variante wird JavaScript sein. Großartig. Jetzt war der Befehl erfolgreich. Da steht, dass das Gerüstprojekt in _web tictactoe-vite abgeschlossen ist. Führen Sie jetzt cd, npm install, npm run dev aus. Das machen wir in der Abteilung. Wir werden das beenden. Was ich nun tun werde, ich öffne die VS Code-Datei, öffne den Ordner und gehe jetzt zu D web und wähle Tictactoe-vite als Projektordner in VS Code aus. Sobald wir drinnen sind, haben wir hier ein paar Akten. Das allererste , was wir tun werden, die Installation von Abhängigkeiten. Wir haben die Dateien erstellt. Wir haben das Paket json mit einigen Abhängigkeiten bereits aufgeführt, aber wir haben keine davon installiert. Dafür öffne ich integrierte Terminal in VS Code, und hier, was ich tun werde, werde ich Abhängigkeiten installieren, indem ich npm install ausführe. Npm wurde ohne Argumente installiert und scannt das Paket json in der aktuellen Navigation. Meine aktuelle Navigation ist der Tictactoe-Vite-Ordner. Es sucht nach dem Paket json. Es sucht nach darin aufgeführten Abhängigkeiten und Entwicklungsabhängigkeiten, und wenn sie fehlen deinstalliert werden, installiert npm sie. Ich werde diesen Befehl schreiben und warten. Während es sein Ding macht, schauen wir uns an, welche Art von Abhängigkeiten wir hier haben. Standardmäßig haben wir die Abhängigkeiten React und React-Dom installiert. Dies sind Kernpakete von React, also React ist das Kernpaket und React-dom ist das Kernpaket speziell für das Web, da Web das DOM-Modell verwendet. In den Dev-Abhängigkeiten haben wir die Typen React, wir brauchen sie in den Typen react-dom eigentlich nicht. Das ist etwas für TypeScript. Ich bin mir nicht sicher, warum sie reinkommen. Dann haben wir Vitejs Plugin-React und Vite selbst als Tool. Außerdem sehen wir hier viteconfig.js. Da mit Vite jedes Frontend-Projekt erstellt werden kann, muss es erkannt werden. Zuallererst hat Vite fast keine Konfiguration. Wir müssen spezifizieren, wir müssen konfigurieren mit, okay, nimm meine React-Dateien und mach bitte die Magie, und Vite wird es tun. Dafür müssen wir das Plugin installieren, das bereits installiert ist, und dann müssen wir dieses Vite-Plugin in viteconfig hier auflisten. Sie sehen, alles ist bereits für uns konfiguriert. Wir müssen wirklich nichts tun. Wenn Sie mehr über die Vite-Konfiguration erfahren möchten, folgen Sie diesem Link hier. Es ist ziemlich einfach. Wenn ich mein Terminal wieder öffne, können Sie ab sofort hinzugefügte Pakete sehen, alles ist großartig. Zwei weitere Dinge erscheinen hier, package-lockjson und Node-Module. package-lockjson steht also für die Version , die wir gerade installiert haben. Es fängt die spezifische Version des Pakets ab , das wir installiert haben. Dann haben wir Knotenmodule. Knotenmodule sind der Ort, an dem all unsere Abhängigkeiten installiert wurden. Da wir diesen Ordner haben, können wir unsere Skripte jetzt einfach ausführen und sie werden funktionieren. Bevor wir das tun, lassen Sie uns hier noch ein paar Dinge konfigurieren. Wir werden unserem Projekt Eslint und Prettier hinzufügen. Um das zu tun, müssen wir sie zuerst installieren. Ich werde npm install dash dash save-dev ausführen. Save-dev wird npm install anweisen, die Pakete als Entwicklerabhängigkeiten zu installieren, also installiert npm eslint und prettier. Dann müssen wir Konfigurationsdateien für diese beiden erstellen. Sie können sehen, dass nach Abschluss des Befehls sowohl Prettier als auch eslint als Entwicklerabhängigkeiten im Paket json angezeigt werden. Ich werde eine neue Datei.prettierrc erstellen und die andere wird.eslintrc sein. Nun, wie werden wir diese beiden konfigurieren? Wir haben etwas namens Gist. Dieser Link wird mit Ihnen geteilt. In diesem Gist finden Sie.eslintrc - und.prettierrc-Dateien. Dies sind die Konfigurationen , die wir verwenden werden. Wir werden es einfach von hier kopieren und einfach so einfügen. Sie können jede hübschere Konfiguration wählen, die Sie möchten. Dies ist nur meine persönliche Präferenz, die ich speziell für dieses Projekt ausgewählt habe . Sie können alle Werte für Ihre Bedürfnisse ändern. Dann eslint config, ich habe auch von dort kopiert. Es ist jedoch eher interessant als hübscher. Hier machen wir ein paar Dinge. Wir erweitern eslint recommended, die in eslint integrierte Konfiguration. Wir müssen es nicht installieren. Dann erweitern wir Plug-in, React, Recommended und Plug-in React JSX Runtime sowie Prettier. Diese kommen eigentlich aus den Paketen, also diese Pakete müssen installiert werden. Wenn wir hier zu diesem Gist zurückkehren, können wir die Entwicklerabhängigkeiten MD, eslint-config-prettier und eslint-plugin-react finden . Wenn wir hierher gehen, müssen wir sie zuerst installieren. Dies sind die Plug-ins , die wir erweitern und sie erscheinen nicht aus dem Nichts. Sie müssen installiert werden. Ich kopiere einfach den Installationsbefehl für eslint-plugin-react und installiere ihn. Genau das Gleiche werde ich für eslint-config-prettier tun. Was machen die beiden? Das eslint-config-prettier stellt sicher, dass unsere Eslint-Konfiguration und Prettier-Konfiguration nicht miteinander kollidieren. Dieses Paket stellt nur sicher , dass wir nicht auf Missverständnisse zwischen diesen beiden Tools gestoßen sind. Eslint-Plugin-React ist ein ziemlich beliebtes Paket. Nun, im Grunde eine Liste von Regeln für Linting React-Projekte. Die Konfiguration, die wir hier unten haben, habe ich im Grunde Dokumentation der eslint-plugin-react-Seite entnommen. Sie finden ihn hier. Wir erweitern dieses Plug-in um zwei Dinge : das empfohlene Regelwerk sowie die JSX-Laufzeit. JSX-Laufzeit, darauf kommen wir zurück, was das genau ist. Insights-Regeln, ich habe die React-Requisitentyp-Regel deaktiviert, die aus dem Plugin-React-Paket stammt. Der Grund für diese Requisitentypen ist etwas, das wir nicht behandeln werden. Es ist jedoch hier enthalten, sodass wir es nicht wirklich brauchen. Es wird nur unseren Entwicklungsprozess stören, also haben wir diese Regel einfach komplett deaktiviert, wir haben sie abgeschaltet. Der Rest ist so, wie ich es dir gesagt habe, er wurde von hier aufgenommen. Großartig. Lassen Sie uns endlich versuchen, das Projekt auszuführen. In den Skripten sind standardmäßig drei Skripts definiert: dev, build und preview. Dev wird den lokalen Entwicklungsserver betreiben, bauen, wir werden das Projekt erstellen und ich bin mir ziemlich sicher, dass es uns eine Vorschau des endgültigen Produktions-Builds geben wird . Es wird die Produktions-Build-Dateien bereitstellen. Lassen Sie uns weitermachen und das Dev-Skript npm run dev ausführen. Nach einer Sekunde sehen Sie diese Meldung. Jetzt können wir tatsächlich auf diese URL zugreifen , sodass wir sie im Browser öffnen können. Wenn ich hierher gehe, wirst du das sehen. Nun, das ist im Moment unsere React-Anwendung. In diesem Fall hat es einen lokalen Server für uns erstellt und uns den Link bereitgestellt , über den wir auf den Entwicklungsserver zugreifen können. Dies ist der Ort , an dem wir das Projekt vor Ort sehen und entwickeln können . Beenden wir den Befehl, indem wir mehrmals Strg-C drücken . Lassen Sie uns den anderen Befehls-Build ausprobieren und sehen. Wenn ich npm run build starten werde, wirst du hier ein paar Dinge sehen. Vite erstellt den Ordner dist und innerhalb des dist-Ordners erstellt es SVG-, HTML - und interne Assets, es erstellt JS- und CSS-Dateien. Dieser Befehl nimmt alle Dateien im Quellordner und baut sie in HTML-, CSS-, JavaScript- und Sekundärdateien auf. Dieser Build-Befehl erzeugt endgültigen Produktions-Build unserer Anwendung. Später können wir den Ordner dist nehmen und ihn für das Hosting bereitstellen. Genau das werden wir später in diesem Projekt tun. Wir müssen wirklich nichts innerhalb von dist inspizieren. Es ist optimiert, es ist minimiert und man kann sehen, dass es hässlich aussieht. Das ist völlig in Ordnung, da es auf diese Weise optimiert werden soll. Auch hier verwendet Vite unter der Motorhaube Roll-up. Das Roll-up ist das Tool, das all diese Minimierung, Transpilation und den Rest erledigt. Schauen wir uns nun an, was haben wir hier unter anderen Dateien? Der Quellordner ist der Ordner, in dem wir unsere Quelldateien erstellen werden. Alle Reaktionskomponenten, der gesamte Code geht in den Quellcode. Die restliche Konfiguration, eslint, prettier, die nicht Teil des Quellcodes sind, aber Teil der Projektkonfiguration sind, befinden sich im Stammordner hier neben dem Paket Jason. Außerdem haben wir hier Index-HTML. Indexieren Sie HTML hier, das wird unser Einstiegspunkt sein. Hier beginnt unser Projekt von selbst. Darauf kommen wir später zurück. Was wir jetzt tun werden, wir werden nichts anfassen. werden wir im nächsten Video behandeln. Lassen Sie uns vorerst einen Überblick über den Rest geben. Wir haben einen öffentlichen Ordner und wir haben den Quellordner. Der öffentliche Ordner ist der Ort für statische Assets unseres Projekts. Sie werden immer unter dem Root-Pfad unserer Anwendung bereitgestellt . Was ich meine ist, dass wir den Befehl dev erneut ausführen lassen. Wenn wir darauf zugreifen wollen, schauen wir uns an, was wir in der Öffentlichkeit haben. Wir haben Vite SVG. Wenn wir also auf Slash zugreifen, was Root-Vite SVG ist, sehen wir, dass die Datei hier unter Vite SVG bereitgestellt wird, sodass der Pfad, den Sie für die Datei im öffentlichen Ordner haben , dem URL-Segment zugeordnet wird. Wenn ich einen Ordner erstellen will, nennen wir ihn. Ich weiß nicht, lol und wir können Vite hineinschieben lol dann wird Vite SVG unter lolvite.svg serviert. Dies ist der Ort für Dateien, die vom Build-Tool nicht werden sollen veröffentlicht oder irgendwie minimiert veröffentlicht oder irgendwie minimiert oder beeinflusst werden sollen. Sie werden so bleiben, wie sie hier sind, in der Öffentlichkeit, und wir können sie in unserer Anwendung referenzieren. Der öffentliche Ordner ist in jedem Frontend-Projekt weit verbreitet . Großartig. Jetzt, wo wir wissen, was all diese Dateien sind, gibt es nur noch eine Sache, die wir tun wollen, bevor wir mit der Entwicklung und dem Durchsuchen dieser Dateien beginnen können . Wir möchten Git in unser Projekt einführen . Was müssen wir tun, wir müssen zuerst initialisieren, Git hier. Im Terminal geben wir git init ein und hier kannst du sehen, dass Git jetzt vorhanden ist, also was wir tun können, wir werden das alles zur Stufe hinzufügen und dann alles übernehmen. Nur eine Anmerkung hier. Es gibt hier eine neue Datei namens Gitignore. Gitignore ist die vom Git-System erkannte Datei und alles, was in Gitignore aufgeführt ist , wird von Git ignoriert. In diesem Ordner haben wir viele sekundäre Dateien, die uns nicht wirklich interessieren. Wir haben hier jedoch auch Node Modules und dist. Diese beiden werden von Git ignoriert und wenn Sie den VS-Code sehen, sind sie nicht einmal hervorgehoben. Was heißt das? Das heißt, wenn wir Dateien übertragen, werden alle betroffenen Dateien als Teil des Git-Projekts hinzugefügt, aber die hier aufgelisteten Dateien werden von Git nicht erkannt. Sie werden einfach ignoriert und diese Knotenmodule werden ignoriert , weil wir sie nicht wirklich brauchen. Dies sind dynamisch generierte Dateien. Wenn wir, sagen wir, unser Projekt mit jemand anderem teilen wollen , Person, die alle Projektdateien herunterlädt wird diese Person, die alle Projektdateien herunterlädt, diese und Node-Module nicht haben , weil sie viel Gewicht und sie nicht wirklich brauchen, weil sie dynamisch erstellt werden können. Ich gebe einfach npm install ein, Node-Module werden neu erstellt. Ich gebe npm run build ein und der Ordner dist wird neu erstellt. Wir brauchen sie nicht wirklich viel Gewicht und sie können dynamisch erstellt werden. Deshalb sind sie in Gitignore aufgeführt. Lass uns weitermachen und alles mit dem Punkt git add zum Stage-Status hinzufügen, sodass wir hier eine Reihe von Warnungen sehen können. Manchmal ist es völlig in Ordnung. Git stellt sicher, dass unser Projekt plattformübergreifend zwischen verschiedenen Systemen unterschiedlichen Kodierungen läuft, sodass wir uns darüber keine Gedanken machen müssen. Danach übergeben wir all diese Staging-Dateien mit der ersten Commit-Nachricht und wenn wir git log eingeben, sehen wir, dass wir hier den ersten Commit haben. Fantastisch. Jetzt müssen wir dieses Git-Projekt auf GitHub hochladen. Was wir tun werden, wir gehen hier zu GitHub. Wir werden hier auf Neues Repository klicken. Name des Repositorys , wir bleiben bei TicTactoe-Game. Ich werde dieses Repository als öffentlich auswählen. Ich werde es später veröffentlichen, sobald wir damit fertig sind, wir brauchen keine ReadMe-Datei, die mit dem neuen Repository initialisiert ist, weil wir das später selbst erstellen werden, oder vielleicht können wir es jetzt tun, also erstelle ich eine neue Datei namens README.md, und darin werde ich die Markdown-Syntax verwenden. Dies ist die Syntax des Dokuments, also füge ich hier nur Hashtags hinzu. Denk nicht zu viel darüber nach. Nennen wir es Tic Tac Toe-Spiel. Ich speichere es und da es sich um eine neue Datei handelt, müssen wir erneut einen Commit hinzufügen. Hinzugefügt, README.md. Perfekt. Jetzt haben wir zwei Commits. Großartig. Wir brauchen ReadMe nicht, wir brauchen Gitignore nicht, weil Gitignore es bereits automatisch per Vite hinzufügt. Wir benötigen keine Lizenz. Ich klicke auf Repository erstellen. Großartig. Hier im Setup kann ich jetzt konfigurieren und mein neu erstelltes Repository auf GitHub mit meinem lokalen Repository auf meinem Computer verknüpfen mein neu erstelltes Repository auf GitHub mit . Wir können der Aufforderung hier folgen. Wenn wir ein komplett neues Repository erstellen, wenn wir keine Dateien haben, aber das ist nicht der Fall. Wir müssen uns dafür entscheiden, ein vorhandenes Repository an die erste gemeinsame Linie zu verschieben . Ich werde hier einfach Zeile für Zeile kopieren. Git remote am Ursprung. Sobald ich das gemacht habe, kann ich danach git remote-v eingeben und ich werde sehen, dass ich unter Alias Origin dieses Repository habe und wenn ich diesen Link kopiere und in einem neuen Tab öffne, führt es mich hierher, und ich werde sehen, dass ich unter Alias Origin dieses Repository habe und wenn ich diesen Link kopiere und in einem neuen Tab öffne, führt es mich hierher, was bedeutet, dass der Link korrekt ist. Dann schlägt es uns vor, git branch-M main einzugeben. Ich glaube nicht, dass wir das tun werden. Das Problem mit GitHub und Git Community ist, dass sie sich nicht entscheiden können, was der bessere Name für den Standard-Haupt-Branch ist, naja, normalerweise heißt er Master. Wir sind derzeit in der Master-Branche, aber die Leute wollen es ziemlich einfach machen. Anstelle von Master wollen manche Leute Main sehen. Wir bleiben beim Meister. Das ist doch keine große Sache. Was wir tun werden, da wir das Projekt jetzt mit dem Remote-Repository verknüpft haben, das es auf GitHub hochlädt, indem wir git push origin master eingeben . Origin ist der Alias , der auf das Repository verweist , und Master ist der Name des Zielzweigs im Repository, in den wir unseren aktuellen Code pushen werden . Ich mache diesen Befehl. Sie können sehen, dass etwas passiert ist , und wenn ich die Seite hier aktualisiere, sehe ich alle Projekte hier und die ReadMe-Datei , die wir erstellt haben. So etwas. Herzlichen Glückwunsch an alle. Wir haben die Tic Tac Toe-Projekte erstellt und konfiguriert. Wir sehen uns im nächsten Video. Wir werden endlich mit der Erstellung der App beginnen und wir können sehen, was die Komponenten sind. Tschüss. 42. 3 Eslint und Prettier: Hallo du, hier ist nur eine kurze Erinnerung an ESLint und Prettier. Da wir sicherstellen wollen , dass diese Tools in unseren VS-Code integriert sind und wir alles in Echtzeit sehen, die Highlights sehen und beim Speichern Defiles bilden, müssen wir sicherstellen, dass die Erweiterungen installiert sind. Gehen Sie hier zur Extension Stop und stellen Sie sicher, dass Sie hier die Prettier Code Formatter Extension sowie die ESLint-Erweiterung installiert haben Prettier Code Formatter Extension . ESLint-Erweiterung stellt sicher , dass alle ESLint-Probleme hervorgehoben werden, sodass Warnungen oder Fehler , die wir im Code haben, die Erweiterung kümmert sich darum. Prettier-Erweiterung stellt sicher, dass Dateien gegen den Konflikt formatiert sind , wenn sie sicher sind. Für die Prettier-Konfiguration benötigen wir jedoch etwas mehr Konfiguration Dafür müssen Sie in VS Code zu den JSON-Einstellungen gehen. Öffnen Sie die Benutzereinstellungen JSON, und hier im Inneren möchten wir sicherstellen , dass wir das Editor-Format auf save true sowie den Editor-Standardformatierer und JavaScript, den Editor-Standardformatierer, haben. All das wird auf der Seite Erweiterungen beschrieben. Öffnen Sie diese Seite einfach direkt im VS-Code, scrollen Sie einfach durch, kopieren Sie das Format sowie das Copy-Editor-Format und speichern Sie es und fügen Sie es einfach so in Ihr Einstellungs-JSON ein. Sobald Sie die Dateien speichern, werden sie automatisch formatiert. Für die ESLint-Erweiterung benötigen wir keine Konfiguration, es funktioniert einfach. Wir sehen uns. 43. 04 Was sind React und -Requisiten: Hallo zusammen, lasst uns endlich herausfinden , was wir im Quellordner haben. Lassen Sie uns zunächst sehen, wie Vite alles im Quellordner auflöst. Wenn ich npm run dev ausführen will, dann bedient Vite den Dev-Server und wir haben das. All das wird in der Quelle erstellt und definiert. Aber wie löst Vite das eigentlich? Wenn wir in package.json nachschauen und in das Dev-Skript, das Dev-Skript , schauen, was es tatsächlich tut, ruft es einfach den Vite-Befehl auf. Ein optionales Argument für den Befehl Vite ist jedoch der Pfad zu index.html , der als Eintrag für Vite dient, um zu verstehen, dass, hey, dies unser Einstiegspunkt ist. Index.html, das wir hier haben , ist der Eintrag, und wenn Vite ohne Argumente aufgerufen wird, sucht es standardmäßig wenn Vite ohne Argumente aufgerufen wird, nach index.html im aktuellen Ordner, was in unserem Fall korrekt ist. In index.html haben wir einfaches Markup, sodass Vite zu dieser index.html führt , sobald der Befehl gestartet wird, und es sieht, dass wir, okay, in index.html ein Skript haben, das okay, in index.html ein Skript haben, das auf die Quelle main.jsx verweist. Quelle main.jsx ist der Einstiegspunkt für die React-Anwendung, während index.html der Punkt zur Anwendung selbst ist. Nun, in einer Anwendung können Sie tatsächlich mehrere React-Apps haben, aber das kommt selten vor. Wir haben ein Skript, das auf main.jsx verweist. Wir haben dev mit der auf root gesetzten ID und wir haben hier ziemlich standardmäßige Met-Angriffe. Wir können es tatsächlich ändern und es Tic Tac Toe nennen. Sobald ich es gespeichert habe, können Sie im Terminal sehen , dass es zur Ladeseite geändert wurde. Wenn ich zurückgehe, wurde es automatisch für mich geladen. Ich habe nichts gedrückt und der Titel wurde geändert. Ziemlich genial, nicht wahr? Wenn wir hineinschauen, source main.jsx. Hier lernen wir React endlich kennen. Wir haben ein paar Dinge aus React und react-dom/client importiert . Dieser Import von React aus React, bevor React 17 in jeder Datei erforderlich war , in der Sie React-Code schreiben. Ab React 18 ist dies jedoch nicht mehr erforderlich. Sie können den Import in React weglassen. müssen wir ihn in unserem Fall Da wir den React-Namespace verwenden, um den strikten Modus zu verwenden, jedoch nur hier importieren, aber in allen anderen Dateien müssen wir Import React from React nicht eingeben. Dies war erst vor React 17 wieder notwendig. In eslintrc haben wir das Plugin jsx-runtime, um Eslint so zu konfigurieren , dass wir verstehen, dass wir React 18 verwenden Bitte sagen Sie uns nicht, dass wir React aus React importieren müssen. Eslint weiß davon. Wir importieren ReactDOM und bei einem ReactDOM-Objekt rufen wir createRoot auf. An die Methode createRoot übergeben wir get-Element des Dokuments mit der ID root. Wir holen uns ein Element aus index.html, das nur ein leeres Element ist, und dieses leere Element wird als Montagepunkt bezeichnet. Dies ist das nur leere Element. Es kann jedes gültige HTML-Element , das in HTML vorhanden sein muss. Es wird als Gefäß für die React-Anwendung dienen. Für den Komponentenbaum. Wir erstellen Root aus diesem HTML-Element. Wir bekommen es wieder von index.html, IDs müssen übereinstimmen, wenn ich etwas anderes eingeben will , das nicht mit root define und index.html übereinstimmt. Auf der Seite wird nichts erstellt. Nun, das ist offensichtlich. Großartig. Wir bringen es zurück auf den Root und stellen sicher, dass alles funktioniert. Sobald wir das Root-Objekt auf dem Root-Objekt haben , rufen wir die Render-Methode auf. An die Rendermethode müssen wir den Komponentenbaum übergeben , der auf der Seite vorhanden sein soll. Nun, um die Rendermethode zu rendern, übergeben wir im Grunde unsere React-Anwendung, unsere React-Komponenten. Die App-Komponente stellt fast immer die Hauptkomponenten der React-App dar. Es heißt fast immer, da bin ich mir ziemlich sicher, einfach App. React StrictMode, es ist etwas , das kürzlich in React eingeführt wurde. Es ist auch als Komponente erhältlich, aber was es tut, es macht nur ein paar Dinge die uns vor möglichen Problemen oder Fehlern warnen, die wir in der React-App haben könnten. Wir lassen es einfach so. Wir ändern hier nichts. Was Sie hier sehen, ist unser Komponentenbaum, einfach so. Alle Komponenten beginnen immer mit einem Großbuchstaben. Sie werden keine einzige Komponente sehen, die mit einem Kleinbuchstaben beginnt. Das ist unmöglich. Die erste goldene Regel lautet, dass Komponenten immer groß geschrieben werden. Immer, egal was passiert. Wir haben den React StrictMode-Modus und die App-Komponente, und dies ist unser Komponentenbaum. Lassen Sie uns nun endlich einen Blick in die App-Komponente werfen. In der App-Komponente, oh mein Gott, wir haben schon etwas. Wenn wir den Mauszeiger bewegen, können wir jeden Eslint-Fehler sehen von der React/JSX-No-Target-Leer-Regel herrührt. Nun, das ist in Ordnung wir werden nichts dagegen tun, wir werden das Markup sowieso entfernen, also ist es uns egal. Das ist gut. Dieser Eslint sagt uns , dass es unsicher ist, Anker-Tags ohne bestimmte Attribute zu verwenden. Perfekt. Dann fassen wir es einfach nicht an. Dies ist eine Komponente. App-Funktion, die Sie hier sehen , ist eine Komponente, sie heißt App, es ist also eine App-Komponente und wir haben hier bereits einige Dinge erstellt, aber lassen sie einfach entfernen, wir brauchen sie nicht. Ich werde das entfernen, ich werde das entfernen , was du gesagt hast und von dem wir nichts wissen , React-Logo, App.css. Vielleicht können wir App.css behalten. Rest können wir dann entfernen. Stattdessen können wir einfach hallo eingeben und den Klassennamen überhaupt entfernen. Wir haben ein einzelnes Div, hallo und close div, wir speichern es. Dann entfernen wir den Assets-Ordner. Wir brauchen es nicht. Wir werden index.css entfernen. Wir brauchen es nicht in main.jsx. Wir werden den Verweis auf index.css entfernen , da wir diese Datei gerade entfernt haben. Wir haben nur main.jsx, das die App-Komponente importiert, und in der App-Komponente haben wir App.css. Großartig. Eine Komponente ist nur eine Funktion, die JSX-Markup zurückgibt. Was Sie hier sehen, ist HTML, aber in Wirklichkeit ist es unter der Haube in JavaScript übersetzt. Alles, was du hier schreibst, ist JavaScript. Dieses HTML-Markup hier heißt JSX. Wenn ich mich nicht irre und wenn ich mich richtig daran erinnere, ist es die Kombination aus JavaScript und XML, da bin ich mir nicht sicher, aber dieses Markup heißt sowieso JSX. Wenn Sie sehen können, haben wir auch die Erweiterung.jsx. Wir hätten die Erweiterung just.js anstelle von jsx verwenden können, aber die Sache ist, da Vite ein Frontend-Tool ist und es auch irgendwie erkennen muss, wo genau wir React-Markup haben und wo genau wir reguläres JavaScript haben. müssen alle unsere Komponenten oder alle unsere Dateien benennen, in denen wir ein jsx-Markup mit der Erweiterung.jsx haben . Deshalb siehst du main.jsx weil wir JSX-Markup in einer App.jsx haben , denn nun, das ist eine Komponente und sie wird definitiv JSX-Markup enthalten. Auch hier ist eine Komponente nur eine einfache Funktion , die JSX-Markup zurückgibt, das wie HTML aussieht und im Grunde in JavaScript übersetzt wird. Wir können hier jedes gültige HTML eingeben. Wenn ich span-Tag oder h1-Tag eintippe und es einen Titel nenne, dann speichere ich es, dann gehe ich zurück, Sie können sehen, dass es hier wiedergegeben wird. Großartig. Wenn ich das Markup im Browser überprüfe, sehe ich die div-ID root, was wiederum unser Einhängepunkt für die in index.html definierte Anwendung ist, und dann wird unsere React-Anwendung im div gemountet, genau wie Sie hier sehen. Das Markup, das wir in der App-Komponente, dem Div und dem Titel definiert haben . So einfach ist das. Jetzt haben wir auch App.css hier. Wie Sie bereits bemerkt haben, , eine CSS-Datei zu erstellen, um einige Stile zu erstellen oder eine React-Anwendung zu stylen reicht es gerade aus, eine CSS-Datei zu erstellen, um einige Stile zu erstellen oder eine React-Anwendung zu stylen. Schreiben Sie hier normales CSS und importieren Sie es dann in die Komponente. Einfach so. Nichts besonderes. Um den Elementen, die wir im Markup haben, Klassen zuzuweisen , müssen wir das className-Attribut an Elemente übergeben , nicht class, sondern className, denn denken Sie daran, dass dies zwar HTML-Markup ist, es aber im Hintergrund in JavaScript übersetzt wird. Das bedeutet, dass es von React verarbeitet wird. In React übergeben wir nicht nur die Klasse, sondern das className-Attribut. Innerhalb des className-Attributs geben wir an, welche Klassennamen dieses Element haben soll. Lassen Sie uns etwas Zufälliges weitergeben. Lassen Sie uns die Kartenklasse übergeben , die in CSS definiert ist. Wir machen einfach eine Karte und speichern sie dann. Wenn wir uns das genauer ansehen, können Sie sehen, dass dieses Div eine Kartenklasse mit dem hier definierten CSS hat . Es funktioniert einfach so. Daran ist nichts Besonderes. Dann lassen Sie uns fortfahren und unsere eigenen Komponenten erstellen. Innerhalb des Quellcodes erstellen wir einen neuen Ordner namens Components. In diesem Komponentenordner erstellen wir eine neue Datei, die wir Square.jsx nennen werden. Hier erstellen wir eine neue Funktion namens square, und vorerst wird sie ein einfaches Div zurückgeben, hallo. Aus dieser Datei werden wir das Standardquadrat exportieren , einfach so. Jetzt haben wir gerade eine quadratische Komponente erstellt und möchten sie in einer anderen Komponente verwenden. In der Reaktion verwenden Sie Komponenten innerhalb anderer Komponenten. Alles ist eine Komponente von React. Wir kehren zur App JSX zurück und hier importieren wir Quadrat aus quadrierten Komponenten, und dann geben wir hier einfach square und selbstschließend ein. Sie können sehen, wann Sie Komponenten verwenden möchten, Sie verwenden sie wie HTML-Elemente. Aber auch hier die erste Regel: Sie werden immer großgeschrieben. Im Grunde genommen sind sie wiederverwendbaren HTML-Tags sehr ähnlich, aber sie sind Komponenten, in denen ihre eigene Logik definiert ist. Wenn wir erneut zur App gehen, können Sie sehen, dass Hallo hier hinzugefügt wird. Dies ist unsere Komponente und das Markup befindet sich auf der Innenseite des Quadrats. Es geht um Hallo. Wenn ich es in etwas anderes ändere, wird es hier wiedergegeben. So einfach ist das. Jetzt wissen Sie, dass jedes HTML-Attribut einige Argumente empfangen kann , um einige Informationen zu übergeben, um einige Daten an dieses Element zu übergeben. Zum Beispiel haben wir ein Image-Tag. Das Bild-Tag erwartet zwei Attribute, source und alt, falls das Bild nicht geladen wird. Lassen Sie uns fortfahren und versuchen, diese vite.svg als Quelle für dieses Image-Tag anzugeben . Da vite.svg unter root bereitgestellt wird, weil denken Sie daran, dass der öffentliche Ordner URL-Segmenten zugeordnet ist, gebe ich einfach vite.svg an, speichere es und Sie sehen, dass es funktioniert. Es verweist uns auf vite.svg, was korrekt ist. Komponenten haben auch Attribute, aber all diese Attribute werden von uns in der Komponentendefinition vollständig definiert. Diese Attribute werden Requisiten genannt. So wie HTML-Elemente Attribute haben, verfügen Komponenten über Anweisungen, um einige Daten innerhalb dieser Komponente zu übergeben . Wir haben eine quadratische Komponente. Wenn wir die quadratische Komponente öffnen, sind das hier nur statische Daten, es wird nur Hallo angezeigt. Was wäre, wenn ich die quadratische Komponente anzeigen und ändern möchte , was darin angezeigt werden soll? Nehmen wir an, wir können quadratische Komponenten einfach so duplizieren und wir werden mehrere quadratische Komponenten haben, zum Beispiel hallo, hallo, hallo, hallo. Aber was ist, wenn sie dynamische Größeninformationen benötigen, einige dynamische Daten wie Hallo 1, Hallo 2, 3, 4 usw.? Um das zu tun, müssen wir Requisiten weitergeben. Requisiten ist nur das Objekt , das die Komponente als erstes Argument erhält. Einfach so. Wenn wir Log-Requisiten stornieren und wenn wir die Konsole öffnen und ich die Seite aktualisiere, werden hier mehrere Konsolenprotokolle angezeigt. Warum haben wir mehrere? Weil wir die quadratische Komponente mehrmals ausführen. Für jede Komponente wird das Konsolenprotokoll gedruckt. Im Moment ist es ein leeres Objekt. Es ist nicht undefiniert, es ist ein leeres Objekt. Was auch immer wir als Requisite an die Komponente übergeben, erscheint hier unter dem Requisiten-Objekt. So wie wir Attribute an Elemente weitergeben, übergeben wir Requisiten an Komponenten. Nehmen wir an, zu dieser neuesten quadratischen Komponente geben wir Requisiten weiter. Auch hier wird es völlig benutzerdefiniert sein. Nennen wir es Wert. Wir werden String 5 bestehen. Wir gehen hierher zurück, ich aktualisiere die Seite, in der Browserkonsole können wir den Wert 5 sehen. Es wurde zweimal storniert und gesperrt. Nun, das ist falsch, dass es zweimal abgesagt wurde. Ich denke, der Grund könnte der strenge Modus hier sein. Lassen Sie mich es sehr schnell versuchen und es entfernen. Wenn ich aktualisiere, habe ich jetzt nur noch ein Konsolenprotokoll. Das ist seltsam. Die Sache ist, wenn die Komponente aktualisiert wird, wurde sie intern aktualisiert. Wenn die Komponente aktualisiert wird, JavaScript erneut ausgeführt und die Logik innerhalb der Komponente wird erneut ausgeführt. Aus irgendeinem Grund zwingt die Strict Bone-Komponente die Komponente, JavaScript innerhalb der Komponente erneut zu rendern, um es erneut auszuführen und wir sehen mehrmals ein Konsolenprotokoll für dieselbe Komponente. Lass es uns so belassen. Wir haben den Wert 5. Für den Rest der Komponenten, die wir hier haben, ist es immer noch ein leeres Objekt, denn nun, wir übergeben nichts darin, aber für die letzte Komponente übergeben wir den Wert 5, wir übergeben die Requisite. Großartig. Ich denke, es ist klar , dass es sich bei diesen Komponenten um ein leeres Objekt handelt, da wir hier nichts übergeben , aber hier übergeben wir den Wert 5. Jetzt haben wir innerhalb des Requisitenobjekts einen Schlüsselwert mit dem Wert string 5. Innerhalb der quadratischen Komponentendefinition können wir diesen Wert jetzt hier verwenden. Da es sich um ein Objekt handelt, ist es unter props.value verfügbar. Lassen Sie uns explizit log props.value trösten und die Seite aktualisieren, wir sehen undefined und five, denn auch hier gilt, dass für all diese Komponenten, die den Wert prop nicht übergeben, Wert undefiniert ist, aber für die letzte Komponente wird der Wert String 5 sein. Großartig. Jetzt können wir innerhalb des JSX-Markups JavaScript-Ausdrücke anzeigen. Wenn ich jetzt etwas tippe oder wenn ich möchte, schauen wir uns an, diesen Requisitenwert als Text in meiner Komponente anstelle von Hallo anzuzeigen , damit es sich dynamisch anfühlt. Ich würde wahrscheinlich props.value eingeben. Aber wird es funktionieren? Lass es uns versuchen und sehen. Wenn ich meine Seite öffne, sehe ich props.value als Text , weil es nicht funktioniert. Es ist nur eine Schnur. Aber wenn wir props.value als JavaScript in unserem JSX-Markup auswerten wollen , müssen wir geschweifte Klammern verwenden. Einfach so. In geschweiften Klammern können wir jedes gültige JavaScript eingeben. Es wird ausgewertet und schließlich in das von uns geschriebene Markup interpoliert. Wenn wir hierher zurückkehren, sehen wir nur fünf. Aber wo sind die restlichen Komponenten? Wenn wir das Markup überprüfen, sind sie einfach leer. Da sie leer sind, nehmen sie keinen Platz auf der Seite ein. In der letzten Komponente, die gerendert wurde, werden jedoch fünf Komponenten angezeigt. Was genau geben wir hier als Requisite durch? Wenn wir weitermachen und hier weitere Zeichenketten wie Hallo übergeben, wird Value mein Name sein. Der Wert wird etwas sein. Lass uns diesen entfernen und wir speichern ihn und wir gehen zurück. Sie können sehen, dass alles angezeigt wird , gerade als wir vorbeifahren. Auf diese Weise können wir mithilfe von Requisiten die Informationen an die Komponente weitergeben. Hier ist ein kurzer Tipp, da wir immer wissen, dass das erste Argument für die Komponentenfunktion das Requisitenobjekt sein wird. Wir können Destrukturierung verwenden, anstatt ständig Requisiten zu schreiben . Was ich tun werde, ich werde die Destrukturierung einfach direkt innerhalb der Funktionsargumente anwenden . Da wir den Wert von key aus dem Requisitenobjekt destrukturiert haben, werde ich ihn mir einfach so schnappen. Jetzt sieht es viel sauberer und wir müssen keine Requisiten mehr schreiben. Auf diese Weise können wir innerhalb der Komponente beliebig viele Requisiten übergeben . Abgesehen von [NOISE] können wir auch ein weiteres spezielles vordefiniertes Requisit namens Children übergeben . Kinder sind etwas , das Sie innerhalb der Komponente als eigenes Markup übergeben . Damit meine ich das, wenn Sie gerade in die quadratische Komponente schauen. Es ist selbstgeschlossen. Es ist und drinnen reichen wir verschiedene Requisiten. Wir können es aber auch so schreiben. Quadrat und schließen Sie es dann in einer separaten Zeile. Dann können wir drinnen so etwas wie div weitergeben, hallo. Vielleicht heißt es in einem anderen Titel, das ist ein Titel. In diesem Fall schließt sich diese Komponente jetzt nicht mehr von selbst. Diese bleiben automatisch geschlossen, aber das ist wie eine normale Komponente, die sich nicht selbst schließt und innerhalb dessen geben wir Markup weiter. Alles, was wir auf diese Weise in die Komponente übergeben . Dieses Markup hier, hallo da, das ist der Titel. Es wird in der Komponentendefinition verfügbar sein. Als Requisite der Kinder ist es ein reservierter Schlüsselname, der speziell dafür reserviert ist. Wenn ich hier weitermachen und Kinder auf der Konsole protokollieren soll. Wenn wir die Konsole erneut öffnen, können Sie sehen, dass sie für die übrigen Komponenten denen wir keine Kinder übergeben, undefiniert ist. Aber für die erste Komponente gibt es hier einige seltsame Dinge, wenn Sie sie öffnen. Dies ist das JavaScript , das dem JSX-Markup tatsächlich hinter dem JSX-Markup verwendet wird. Wir können die Kinder nehmen und es rendern. Wir können es als Steckplatz benutzen. In anderen Bibliotheken heißt es Slots. Im Reaktor heißt es Kinder. Sie übergeben etwas Markup innerhalb der Komponente und dann die Komponente darin, indem Sie es verwenden, da ein Kind entscheiden kann, wo genau es gerendert wird. In dieses Markup werde ich tippen, Kinder werden unten gerendert. Innerhalb des Div interpoliere ich Kinder, denn auch hier gilt, wenn ich nur solche Kinder übergebe, es als Zeichenkettenkinder betrachtet wird. Da children jedoch eine Variable in dieser Funktion ist, müssen wir sie in das JSX-Markup interpolieren. Einfach so. Wenn wir nun in unseren HTML-Code schauen, haben wir hier verschiedene Dinge. Für die erste Komponente haben wir etwas, dann haben wir Kinder, das unten gerendert wird. Dann haben wir div, Kinder, die wir an die darin enthaltene Komponente übergeben haben . Wir geben Hallo und das ist der Titel. Das ist genau das , was wir hier sehen. Dieses HTML-HTTP wird innerhalb einer quadratischen Komponente interpoliert. Es ist als Kind erhältlich. Es wurde als Requisite für Kinder ausgestellt. Auch hier kannst du dich nicht ändern. Es bleibt immer so. Es ist ein reservierter Requisitenname für Kinder. Es ändert sich nie und es wird immer so bleiben , egal was passiert. Für den Rest unserer Komponenten wird nichts gerendert. Du wirst sehen, dass es ein leeres Div sein wird. Wann immer Sie versuchen, undefinierte Null anzuzeigen, oder sagen wir was auch immer, versuchen Sie undefinierte Null zu interpolieren. Innerhalb des JSX-Markups wird es nicht gerendert, da es ja als leerer Wert betrachtet wird und nicht angezeigt wird. Wenn ich weitermache und einfach versuche, Null darin anzuzeigen, wird nichts da sein. Es wird nur ein leeres Div sein. Das Gleiche gilt für undefined und für false. Alle falschen Werte werden nicht zu etwas ausgewertet. Sie werden einfach weggelassen. Einfach so können wir Komponenten erstellen. Cool, nicht wahr? Im nächsten Video werden wir eine Platinenkomponente erstellen. Wir werden eine Quadratwurzelkomponente erstellen und versuchen, einige Funktionen in die App zu integrieren. Wir sehen uns dort. 44. 05 Wie man CSS-Stile anwendet: Hallo zusammen. Lassen Sie uns die App weiter entwickeln. letzte Mal haben wir die Komponenten besprochen, wie wir Komponenten erstellen können, wie wir Kinder weitergeben können, was die Komponenten sind, wie wir sie anzeigen können usw. Lassen Sie uns nun beginnen und unserer App Leben einhauchen. Was wir jetzt tun werden, wir werden das Markup erstellen , das in unserem Spiel verwendet wird. Wir kehren zur App JSX zurück. Wir werden alles von hier entfernen. Wir werden diesen Klassennamen vorerst entfernen, wir werden den Import von Square entfernen und wir werden fortfahren und eine neue Komponente im Komponentenordner erstellen , die wir Board JSX nennen werden. Es wird unseren Vorstand repräsentieren und wir werden die gesamte relevante Logik in diese Komponente integrieren. Auch hier werde ich eine Wortfunktion erstellen. Darin werden wir vorerst div als Hallo anzeigen und anhand dieser Datei werden wir diese Board-Komponente untersuchen. Dann importieren wir in der App JSX das Board vom Components Board. Dann werden wir es hier als selbstschließende Komponente versuchen. Jetzt kehren wir zum Browser zurück, wir sehen Hallo, das von Board Component stammt. Jetzt definieren wir innerhalb des Boards den ersten Marker. Wir geben ihm ein Klassennamenschild. Es wird noch nirgends behandelt, nicht in einer CSS-Datei, nirgends. Wir werden es einfach mit dem Klassennamenbrett kennzeichnen. Im Inneren werden wir Zeilen erstellen, denn wenn ihr euch daran erinnert unser Spiel Tic-Tac-Toe sein wird dass unser Spiel Tic-Tac-Toe sein wird und es muss diese, sagen wir, zeilenartige Struktur innerhalb von HTML sein . Wir werden drei Zeilen erstellen. Wir werden drei Tauchgänge machen. Jedes Div hat ein Klassennamenbrett, eine Reihe und innerhalb jeder Zeile haben wir drei Quadrate. Es wird im Grunde nur ein Raster sein, drei mal drei. In jeder Zeile verwenden wir die quadratische Komponente. Wir werden Quadrat von Quadrat importieren. Das./ steht übrigens für den aktuellen Ordner, in dem dieses Dateiboard JSX es in diesem Fall gefunden hat. Wenn ich tippe. /, es steht für diesen Komponentenordner. Das bedeutet, dass alles, was ich weiter eintippe , in diesem Ordner aufgelöst wird. Ich importiere Standard, exportiere, diesen, einen Namen, sein quadratisches Innenbrett, und all das wird aus dieser quadratischen Datei hier importiert. In jeder Reihe werde ich das Quadrat dreimal laufen lassen , einfach so. Irgendwann sieht es ungefähr so aus. Wenn ich aktualisiere, haben wir immer noch Markup aus dem letzten Video, aber lassen Sie uns es tatsächlich entfernen und lassen Sie uns nur die Value-Requisite verwenden. Aber wir müssen es immer noch in jede Instanz von square root, die wir ausführen, übergeben . Ich übergebe hier den Wert Null. Der Wert wird eins sein. Übrigens übergebe ich im letzten Video den Wert als Zeichenfolge. Einfach so. Eine Zeichenfolge kann ohne geschweifte Klammern übergeben werden, aber wenn Sie versuchen, fünf zu übergeben und möchten, dass es eine Zahl statt einer Zeichenfolge ist, müssen Sie geschweifte Klammern verwenden. Auch hier können Sie mit geschweiften Klammern überall im JSX-Markup alle gültigen JavaScript-Ausdrücke verwenden. Null als Zahl ist ein JavaScript-Ausdruck, und wir können ihn als Wertrequisite übergeben, und es wird nur die Zahl 0 oder Nummer eins sein. Wenn Sie möchten, dass es eine Zeichenfolge ist, können Sie sie einfach so eingeben und es wird eine Zeichenfolge sein. Ein Ausdruck, der zu einer Zeichenfolge ausgewertet wird. Aber wenn es eine Zeichenfolge ist, kannst du sie so übergeben. Wenn wir Zahlen übergeben, müssen wir geschweifte Klammern verwenden. Wert 0, Wert wie dieser. Lass mich das schnell alles kopieren und es bis acht so machen . Sie haben vielleicht eine Frage, warum es bei Null beginnt. Nun, ich habe es dir nicht gesagt, aber wir werden ganz kurz darauf eingehen , wie wir den Vorstand repräsentieren werden, wie wir das schaffen und wir irgendwie Quadrate darstellen müssen. Wir können sie durch Indizes darstellen. Eine Erhöhung der Programmierkenntnisse beginnt bei Null. Da wir eine Gehaltserhöhung verwenden werden, um ein Brettspiel zu verwalten, beginnen die Indizes bei Null. Deshalb geben wir unseren Quadraten vorerst Indizes und sie beginnen bei Null, weil dies Array-Elemente sein werden. Wir gehen zurück und sehen uns das an. Nun, wenn wir HTML untersuchen, ist das genau das, was wir geschrieben haben. Lassen Sie uns es jetzt ein bisschen stilvoller machen. Wir kehren zum Quadrat JSX zurück und unsere Quadrate werden anklickbar sein. Anstelle von div können wir eine Schaltfläche mit dem Typ button rendern und ihr den Klassennamen square geben , den wir gleich definieren werden. Nun, es sieht so aus, , und es ist nicht so schlimm, nicht wahr? Aber wir werden hier unsere eigenen Stile anwenden. Wenn wir hier zu Gast zurückkehren, genau auf dieser Seite, auf der Sie alle bereitgestellten Informationen für Sie haben können , wenn Sie hier scrollen, haben wir hier styles.scss. Nun, SCSS ist für Sass-Dateien. Sass ist ein CSS-Präprozessor , den wir verwenden werden. Was ist ein CSS-Präprozessor? Es ist im Grunde nur eine Sprache, die auf CSS aufbaut und über eigene Funktionen verfügt. Irgendwann, wenn wir dieses Etwas Punkt SCSS schreiben , wird es zu etwas Punkt-CSS kompiliert, und es wird genauso funktionieren wie normales CSS. Es hat jedoch Nachteile seiner eigenen Funktionen, zum Beispiel beim Verschachteln. In regulärem CSS dürfen wir Selektoren nicht verschachteln. Wir müssen sie in einer Reihe schreiben, wie Punkt History Rapper, dann Space, dann Punkt History. In SASS kann alles verschachtelt werden. Wir können Variablen und verschiedene Dinge haben. Sie können in Google nach SASS, Syntactically Awesome Style Sheets, suchen . Sie können es öffnen, auf „SASS lernen“ klicken und diese Seite sehr schnell durchgehen. Es ist nicht zu lang, es ist ziemlich kurz und es deckt und zeigt Ihnen alle SASS-Fähigkeiten, zum Beispiel Variablen. Durch die Verwendung des Dollarzeichens können Sie Variablen in CSS haben. Ziemlich cool, und du kannst nisten. Sie können sehen, wenn Sie dieses SASS-Markup schreiben, es wird in dieses CSS übersetzt, also werden wir SASS verwenden. Um das zu tun, müssen wir Vite anweisen. Wir müssen Vite sagen, dass wir anstelle von regulärem CSS auch SASS verwenden möchten und Vite unterstützt SASS. Wenn wir zur Vite-Dokumentation zurückkehren und auf „Suchen“ klicken und hier nach SASS suchen und den ersten Link öffnen, haben wir den Abschnitt CSS-Präprozessor, und Vite bietet integrierte Unterstützung für SCSS-Dateien. Sie dazu dann die Unterstützung, Aktivieren Sie dazu dann die Unterstützung, die wir für die Installation des SASS-Compilers benötigen. SASS-Compiler ist als npm-Paket namens SASS verfügbar. Sie können diesen Befehl hier sehen. Wenn ich npm SASS eintippe und ich den ersten Link setze. Dies ist das Paket , das uns die Möglichkeit gibt, SASS in CSS-Dateien zu kompilieren. Wir müssen es also nur installieren und Vite kümmert sich tatsächlich um den Transpilationsprozess. Ich kopiere einfach diesen Befehl, öffne das Terminal, stoppe den Befehl, indem ich Strg-C drücke, sodass unser Diff-Server kaputt geht, dann werde ich SASS installieren. Dash D ist im Grunde dasselbe wie Dash, dash save-dev. Nur eine Abkürzung. Es wird SASS als Entwicklerabhängigkeit installieren, und wenn Sie jetzt in das Paket JSON schauen , werden Sie SASS unter den Dev-Abhängigkeiten sehen. Großartig. Jetzt müssen wir zuerst npm run dev ausführen um den Server erneut zu starten, und wir können weitermachen und tatsächlich SASS-Dateien erstellen. Im Quellordner erstelle ich Styles.scss und was werde ich tun? Ich gehe einfach zum Gast und kopiere einfach alles von hier und füge es in Style-CSS ein. Sie müssen hier nicht zu sehr ins Detail gehen. Dies ist das letzte Markup , das wir in unserer Anwendung haben werden, da es in diesen Videos nicht um CSS geht. Wenn Sie etwas ändern müssen oder wenn Sie etwas Neues hierher bringen möchten, steht es Ihnen frei, das zu tun. Bitte mach weiter, ändere es, spiel damit, wir werden dieses Markup verwenden. In diesen Stilen haben wir eine Vorstandsklausel definiert. Dann verschachteln wir innerhalb des Bretts die Klasse Brettreihe und dann innerhalb der Brettreihenklasse die quadratische Klasse. Unter der Haube, wenn Sie SASS erneut öffnen, Nesting hier in diese Selektoren kompiliert, also im Grunde Board, und innerhalb der Board-Zeile wird zu etwas Ähnlichem kompiliert, und Square wird zu so etwas kompiliert. Das ist sehr praktisch, finde ich. Wir haben Board- und Board-Row - und Quadratwurzelklassen Was wir also tun werden, SASS-Punktdatei in unsere App zu importieren. Wir werden App Dot CSS nicht mehr benötigen, also löschen wir es einfach. Dann gehen wir zur App-Komponente und anstatt App-CSS zu importieren, importieren wir Styles Dot CSS, und es wird funktionieren. Jetzt haben wir hier die Klassen Board, Board Row und Square. Wir gehen zu Square und weisen die Klasse square zu, die sich diesem CSS auflösen wird. Innerhalb des Boards haben wir einen Vorstand und eine Vorstandsreihe, die sich für diese Klassen entscheiden wird. Jetzt kehren wir zur App zurück und bumm, Sie können sehen, es sieht einfach so aus. Sie können jedoch sehen, dass etwas nicht stimmt oder etwas nicht stimmt, ist eigentlich unser Markup also müssen wir es ein wenig ändern. Wenn wir hier zur App gehen, geben wir die Komponente, die unser gesamtes Markup umschließt. Wir geben ihm hier die App-Klasse , die wir einfach so definiert haben. Also können wir ihm den Klassennamen App geben. Was es tun wird, es wird uns die grundlegende Flex-Box mit dem Spalten-Setup geben . Wenn wir hierher zurückkehren, können Sie sehen, dass wir jetzt unser endgültiges Raster haben, das so aussieht. Ziemlich cool. Das war's mit dem Styling. Jetzt kennst du noch einen Trick, wie du deine App mit SASS stylen kannst. Wenn Sie bereits einen anderen Präprozessor wie Less kennen, können Sie auch in der Vite-Dokumentation nachlesen, in der Vite-Dokumentation nachlesen wie Sie ihn oder den Stift anschließen können. SASS ist in allen gängigen Anwendungslösungen sehr beliebt . Ich finde es ziemlich cool und sehr praktisch. Jetzt haben wir eigentlich mit Interaktivität angefangen , sind aber bei Stilen gelandet. Ich denke, vorerst werden wir mit Stilen enden , und im nächsten Video werden wir tatsächlich über Interaktivität sprechen. Ich denke, es macht dir nichts aus. Da wir hier schon viel gearbeitet haben, SASS eingeführt und wir Board - und Square-Komponenten erstellt und wir haben unser hübsches Markup hier, lasst uns eigentlich alles festlegen. Was haben wir hier? Wir haben App-CSS entfernt, wir haben das Paket JSON geändert, wir haben ein paar Dateien gelöscht. Also machen wir einfach weiter und fügen dem Stage State alles hinzu. Ich tippe „Git add dot“ ein, sodass alles unter Staged Changes erscheint und wir werden einfach alles übernehmen, und wir werden den Commit als installiertes SASS bezeichnen Board - und quadratische Komponenten erstellt, bloße Knochen, so etwas in der Art. Sehr seltsame Commit-Nachricht, aber ich denke, es wird reichen. Wir verpflichten uns zu allem. Damit alles auf GitHub erscheint, müssen wir es bereitstellen, denn auch hier müssen wir uns daran erinnern, dass Änderungen, wenn Sie sie übernehmen, lokal auf Ihrem PC verbleiben. Wenn du jetzt zu GitHub zurückkehrst, wird nichts geändert, da all deine Änderungen lokal übernommen werden . Du musst also jedes Mal, wenn du neue Änderungen lokal einführst, auf GitHub-Hosting bereitstellen , also git push origin master. Ich mache das und erfrische mich, und jetzt haben wir alles gut. Fantastisch. Wie versprochen, wird es im nächsten Video um Interaktivität gehen, also sehen wir uns dort. 45. 06 React State with useState hook, React Ereignisse: Hallo nochmal. In diesem Video werden wir wie versprochen über Interaktivität sprechen. Was ich mit Interaktivität meine. Interaktivität ist etwas , das passiert, wenn Benutzer mit der Webseite interagiert. Wenn ich auf den Button klicke, muss etwas passieren. Ein Ereignis tritt ein und etwas wird auf dem Bildschirm aktualisiert. Das nennt man Interaktivität. Jetzt würden wir sehen, wie wir das in React verwalten können. In rohem JavaScript, in reinem JavaScript ohne React, haben Sie eine JavaScript-Datei. Normalerweise greifen Sie nach Elementen mit der DOM-API, etwa zum Abrufen von Dokumenten nach der ID. Du schnappst dir eine Schaltfläche, dann schreibst du den Button.add Event Listener, und an diesen Listener hängst du eine Funktion an, die ausgeführt wird, wenn du auf die Schaltfläche klickst. Aber als Reaktion ist es so ziemlich dasselbe. Es sieht anders aus, aber es ist fast dasselbe, also lasst uns JSX hier öffnen. Beispiel eine Lassen Sie uns als Beispiel eine Schaltfläche erstellen und damit spielen. Ich habe das Board vorerst entfernt. Wo war die Komponente vorerst? Wir brauchen es nicht. Wir haben hier einen Eslint-Editor, keine ungenutzten Variablen. Es erzeugt einen Fehler, anstatt zu vergeben Lassen Sie uns es tatsächlich zum Laufen bringen, damit es weniger Variablen sind. In Eslint verwende ich einfach keine ungenutzten Variablen und ich wollte eine Warnung ausgeben, also wird sie jetzt orange statt rot sein und es wird uns nicht sehr stören. Also werde ich weitermachen und ein Button-Element erstellen und es aufrufen, bitte klicken Sie mich an. Nun, was ich mit dieser Schaltfläche tun möchte, vielleicht möchte ich etwas aktualisieren oder ich möchte das Loggen abbrechen und einen Wert in der Browserkonsole sehen. Wie können wir das machen? jedes Element, an jedes HTML-Tag, das im JSX-Markup verwendet wird, können Sie einen Event-Handler übergeben, sodass wir Ereignisse, Klickereignisse, Mausereignisse, verschiedene Arten von Ereignissen haben Klickereignisse, Mausereignisse, und wann immer ich Event-Handler sage, beziehe ich mich auf die Funktion, die ausgeführt wird , wenn dieses Ereignis eintritt. Nehmen wir zum Beispiel dieses Button-Element. Wenn ich versuche, ein Attribut, das mit einem beginnt, von der Intelligenz aus zu übergeben , sehe ich eine ziemlich lange Liste verschiedener Ereignisse, die für dieses Element verfügbar sind. Onsubmit, onResize, onMouse, over onKeyUp usw. Im Moment interessieren wir uns für das onClick-Ereignis, also mache ich einfach onClick und für dieses Attribut auf dem Button-Element muss ich einen Event-Handler übergeben, eine Funktion, die ausgeführt wird, wenn der Klick erfolgt, also übergebe ich hier eine leere Funktion und innerhalb dieser Funktion werde ich console.log, „Hallo“ also wenn ich es speichere, gehe ich zurück zur App. Wenn ich jetzt auf den Button klicke, siehst du, dass Hallo jedes Mal gedruckt wird, wenn siehst du, dass Hallo jedes Mal gedruckt wird ich darauf klicke, sodass es tatsächlich funktioniert. In reinem JavaScript erhalten alle Event-Handler immer das Ereignisobjekt als erstes Argument, sodass diese Funktion hier in reinem JavaScript immer ein Ereignisobjekt erhält , das das Ereignis darstellt. Versuchen wir, das Loggen dieses Objekts hier abzubrechen. Mal sehen, ob es einen Unterschied gibt. Wenn ich also hier auf die Schaltfläche klicke, kann ich Hallo sehen und dann sehe ich das Event-Objekt. Dieses Event-Objekt ist also ein Wrapper um ein natives Event-Objekt, das du normalerweise mit reinem JavaScript bekommst, aber in React ist das etwas, das als syntaktisches Ereignis bezeichnet wird, also ist es im Grunde nur ein Wrapper natives Ereignis mit den wenigen React-Eigenschaften. Wenn Sie es sich ansehen, haben Sie hier einen Haufen verschiedener Eigenschaften sowie ein natives Ereignis, auf das Sie nur mit dem Ereignis event.native zugreifen können . Auf diese Weise können Sie bei Bedarf ein natives JavaScript-Ereignisobjekt abrufen. Aber meistens reicht es gerade aus, um sich synthetisches Ereignis zu beziehen. den meisten Fällen enthält es die Informationen, nach denen Sie suchen, falls Sie sie verwenden müssen. In diesem Fall benötigen wir also überhaupt kein Event-Objekt. Wir sind daran interessiert , der App etwas Interaktivität zu Lassen Sie uns sie jetzt ausprobieren und sehen, wie wir das tun können. Nehmen wir an, wir haben einen Zähler. Lassen Sie mich weitermachen und eine Variable erstellen. Nennen wir es „Lass den Zähler zählen , der bei eins beginnt“. Was ich nun tun möchte, ich wollte nur diesen Zähler hier anzeigen und jedes Mal, wenn ich auf die Schaltfläche klicke, möchte ich den Wert eins, 2, 3 usw. erhöhen . innerhalb des OnClick-Ereignishandlers versuchen, Lassen Sie uns innerhalb des OnClick-Ereignishandlers versuchen, diese Funktion hier in die App zu verschieben , damit sie schöner aussieht. Es sieht einfach ansprechender und einfacher zu lesen aus, also können wir diese Funktion hier erstellen und wir können sie onBtnClick nennen und ich werde sie einfach von hier kopieren, hier einfügen und für das onClick-Attribut werde ich btnClick weitergeben. Einfach so, sagen wir, innerhalb dieses Event-Handlers möchte ich den Zähler hier erhöhen, möchte ich den Zähler hier erhöhen also lassen Sie uns ihn anstelle des Konsolenprotokolls vielleicht behalten. Lassen Sie uns weitermachen und sagen, Zähler ist Zähler plus eins. Nichts besonderes. können wir sehen, dass es tatsächlich erhöht wurde? Gehen wir nach vorne und unten. Lassen Sie uns den Zählerwert anzeigen also verwende ich geschweifte Klammern um den Wert erneut in nur sechs zu interpellieren , da es einen variablen Zähler hat. Ich speichere es. Ich gehe zurück , ich sehe einen. Nur wir haben es anfangs, großartig. Wenn ich versuche, darauf zu klicken, passiert nichts. Aber warum ist das so? Das Problem bei diesem Ansatz ist, dass React nicht genau den gleichen Regeln folgt wie normales JavaScript. Wenn Sie also einfaches JavaScript verwenden und versucht hätten , eine sehr ähnliche Logik zu schreiben, hätte es funktioniert, aber nicht mit React. In React müssen Sie immer dann, wenn Sie einen Wert benötigen , der sich über einen bestimmten Zeitraum ändert, nachdem, sagen wir, über den Zeitraum der Interaktivität die Änderungen abgewertet haben, ihn als Status festlegen. In React muss ein Wert, der sich ändert, also ein Zustand sein. In nur einer Sekunde können wir jetzt unseren ersten Staat erstellen. Aber bevor wir das tun, lassen Sie mich Ihnen kurz erklären, warum das nicht funktioniert. Ich werde Paint öffnen und dir einfach schnell schreiben, wie React damit umgeht. In React gibt es das Konzept des erneuten Renderns. Bei einem erneuten Rendern wird die Komponente im Grunde auf der Webseite neu gezeichnet. Wenn wir state verwenden, löst state immer das erneute Rendern einer Komponente aus, und der Status beim nächsten erneuten Rendern wird aktualisiert. Aber wenn wir einfach solche Variablen erstellen und versuchen, sie zu aktualisieren, wird das nichts bewirken. Der Grund dafür ist , dass, wenn wir einfach versuchen, die Variable einfach so zu mutieren, dies nicht dazu führt, dass die Komponente erneut gerendert wird. Lebenszyklus einer Komponente basiert eigentlich auf erneuten Renderings. Wenn wir die Seite aktualisieren, wird die Komponente auf der Seite gemountet. Das bedeutet, dass es zum ersten Mal gerendert wird. Nehmen wir also an, dieses Quadrat hier steht für einen einzelnen Render. Die Komponente ist auf der Seite gemountet, sie wurde gerendert, sie wurde angezeigt. nun nach den React-Regeln Wenn ich nun nach den React-Regeln etwas auf dem Bildschirm aktualisieren möchte, wenn ich etwas innerhalb dieser Komponente aktualisieren möchte, muss ich dafür ein erneutes Rendern auslösen. Ungefähr auf diesem Bild wird es so aussehen. Dieses erneute Rendern wird zu einem anderen Rendern führen. Dies sind Frames und React wechselt über sie. Das ist also unser erster Render. Nehmen wir an, wir aktualisieren den Status. Auch hier ist der Status der Wert , der sich über einen bestimmten Zeitraum ändert. Der Status wurde aktualisiert, Statusaktualisierung löst ein erneutes Rendern aus, und jetzt haben wir eine Komponente , die erneut gerendert wurde. Nochmals, bei Variablen wird es nicht funktionieren, wenn wir sie einfach so verwenden . Der Grund für diese Variablenaktualisierung ist diese Zeile Nummer 9, sie löst kein erneutes Rendern aus und das ist ein Problem. Wir bleiben bei diesem ersten Frame und versuchen, diesen Zähler plus einen hier zu aktualisieren, und das ist nichts, es löst kein erneutes Rendern aus, was bedeutet, dass wir state für alle Werte verwenden müssen, von denen wir wissen, dass sie sich nach einiger Interaktivität über einen was bedeutet, dass wir state für alle Werte verwenden müssen , von denen wir wissen, dass bestimmten Zeitraum ändern werden . Jedes Rendern hier, also das ist das erste Rendern, das zweite Rendern, sie oszillieren voneinander, sie wissen nichts voneinander. Das erste Rendern weiß nicht , dass es ein zweites Rendern geben wird, und genauso wie das zweite Rendern nicht weiß ob es ein erstes oder ein vorheriges Rendern gab , oszillieren sie miteinander. All das wird intern vom React verwaltet, aber der Hauptpunkt hier ist, dass wir wissen müssen , dass wir, um etwas zu aktualisieren, eine Komponente zum erneuten Rendern auslösen müssen. Immer wenn ein Status aktualisiert wird, löst er das erneute Rendern einer Komponente aus. Wenn wir nun wollen, dieser Zähler aktualisiert wird und wie erwartet funktioniert, müssten wir von React aus etwas namens useState untersuchen. Oben werde ich einfach useState importieren und hier verwende ich named import from React. Was ist UseState? Im React gibt es ein Konzept von React Hooks. Was ist ein Haken? Hook ist im Grunde nur eine Funktion, mit wir den Lebenszyklus von Komponenten manipulieren können. Was ist der Lebenszyklus einer Komponente? Der Lebenszyklus einer Komponente ist nur ein Zeitraum , in dem etwas innerhalb der Komponente passiert. Es wird montiert, es wurde aktualisiert, es wird demontiert, das ist also der Lebenszyklus einer Komponente. Wir können React Hooks verwenden, um den Lebenszyklus dieser Komponente irgendwie zu manipulieren. UseState ermöglicht es uns also, einen Wert zu schaffen , der sich im Laufe des Lebenszyklus einer Komponente verändert. Wie wir es verwenden können. In unserer Komponente müssen wir nur useState als Funktion aufrufen. Auch hier sind alle React Hooks Funktionen. Übrigens beginnen alle React Hooks immer mit dem Präfix use. Das ist also die Konvention in React. Wann immer Sie etwas verwenden sehen, ist es definitiv ein React Hook. Wir nennen es als Funktion und als erstes Argument müssen wir den Anfangszustand übergeben. Was wird der Standardwert für diesen Staat sein? In unserem Fall wollten wir ihm den Anfangswert eins geben, also geben wir einfach eins weiter. Jetzt gibt diese useState-Funktion immer ein Array zurück. useState gibt immer ein Array mit genau zwei Elementen zurück. Lassen Sie uns weitermachen und ihn vorerst einen Rückgabewert nennen und versuchen, ihn auf der Konsole zu protokollieren und direkt in die Komponente zu schreiben. Mal sehen, was wir hier haben? Also aktualisiere ich die Seite und hier habe ich, wie ich dir gesagt habe, eine Reihe von genau zwei Elementen. Das erste Element ist zu diesem Zeitpunkt beim aktuellen erneuten Rendern ein Zustandswert, und der zweite Wert innerhalb dieses Arrays die Aktualisierungsfunktion , die wir aufrufen müssen , um diesen Status zu aktualisieren. Lass mich dir zeigen, was ich meine. In den meisten Fällen werden Sie sehen, dass wir eine Restrukturierung verwenden werden weil wir wissen, dass useState immer ein Array mit genau zwei Elementen zurückgibt, sodass wir eine Umstrukturierung getrost anwenden können. Das erste Element wird unser Status sein und das zweite eine Funktion, die wir aufrufen müssen, um den Status zu aktualisieren. Diese werden als Status- und Statusaktualisierungsfunktion bezeichnet , und wir können sie beliebig benennen. Unser Status wird Counter genannt, und die Aktualisierungsfunktion, um den Status festzulegen, werden wir ihn SetCounter nennen. Jetzt entferne ich diesen Let-Zähler ist eins. Ich entferne diesen Zeilenzähler plus 1, wir brauchen ihn nicht wirklich. Versuchen wir, unseren Zähler zu trösten. Wir mussten es eigentlich nicht stornieren, wir haben es schon hier. Wenn ich es speichere, aktualisiere ich die Seite, wir haben immer noch eine hier. Das ist unser Ausgangszustand. Wenn wir nun den Status aktualisieren möchten, müssen wir die Status-Aktualisierungsfunktion setCounter aufrufen. Zwischen Klick und Klick passiert, wir wollen den Wert erhöhen. Also, was wir tun können. Wir können setCounter aufrufen und müssen darin nur einen neuen Wert für diesen Status übergeben . Lassen Sie uns vorerst einfach einen statischen Wert angeben. Sagen wir 10. Ich speichere es, gehe zurück zum Browser, jetzt klicke ich auf die Schaltfläche und Sie sehen, dass der Wert auf 10 geändert wurde. In der Konsole ist wichtig , dass Sie hier Hallo sehen. Was passiert ist, ist, dass beim Klicken auf die Schaltfläche SetCounter aufgerufen wurde der Status von eins auf 10 aktualisiert wurde. Dann fand das erneute Rendern statt. Wenn wir hier zu diesem kleinen Diagramm zurückkehren, ist das, was passiert ist, dass diese Komponente auf der Seite gerendert wurde. Wir klicken auf die Schaltfläche, wir haben den Status aktualisiert, und diese Statusaktualisierung hat das erneute Rendern ausgelöst. Der zweite Frame hier stellt unser aktuelles Rendern dar , wobei der aktuelle Status 10 ist. Warum sehen wir hier das Konsolenprotokoll? Tatsächlich sehen wir hier das Konsolenprotokoll, weil wir es in onBtnClick haben. Aber was ist, wenn wir das Konsolenprotokoll hier außerhalb von onBtnClick platzieren . Lass es uns noch einmal versuchen. Ich aktualisiere die Seite. Wir sehen zuerst zwei Konsolenprotokolle, aber das ist zu erwarten, denn wie Sie sich erinnern, habe ich Ihnen im vorherigen Video über React StrictMode gesagt, es war beabsichtigt die Komponente zweimal zu rendern, um Fehler zu erkennen, aber das ist nicht der Punkt, oder vielleicht wird das der Punkt sein. Lassen Sie mich React StrictMode für eine Sekunde entfernen . Ich aktualisiere die Seite. Wir sehen ein Konsolenprotokoll hallo, weil die Komponente gemountet wird, die Logik innerhalb der Komponente läuft, wir sehen das Konsolenprotokoll. Großartig. Aber wenn ich jetzt auf die Schaltfläche klicke, sehen wir, dass der Wert aktualisiert wird, die Komponente gerendert wird und wir sehen zum zweiten Mal Hallo. Wir sehen das, weil auch hier bei jedem neuen Rendern die Logik innerhalb der Komponente erneut ausgeführt wird. Javascript wird erneut ausgeführt, wenn die Komponente erneut gerendert wird, sodass der Status beibehalten wird, da useState eine interne React-Funktion ist. Nun, es wird vollständig auf React verwaltet, sodass der Wert, der sich im Laufe der Zeit ändert , von React verwaltet wird. Es ist hartnäckig. Alles ist cool. Aber wir sehen hier das Konsolenprotokoll, weil, nun, das ist etwas, das wir in die Komponente bringen und die Logik wird erneut ausgeführt, also sehen wir es ein zweites Mal. Wenn wir kurz davor sind, den Status erneut zu aktualisieren, wenn die Komponente das nächste Mal neu gerendert wird, erscheint ein weiteres Hallo usw. Sie werden jedes Mal Hallo sehen, Sie werden jedes Mal Hallo sehen wenn die Komponente erneut gerendert wird. Aber was passiert, wenn ich erneut auf den Button klicke? Siehst du, ich klicke noch einmal darauf und wir sehen kein Hallo mehr. React ist intelligent genug, um zu erkennen dass der Status derselbe bleibt, sodass der Wert gleich bleibt. React ist intelligent genug, um die Komponente nicht immer wieder zu aktualisieren. Es führt nicht ständig eine Neuberechnung durch wenn der Zustandswert derselbe ist. Lass uns weitermachen und versuchen, einfach den Zähler zu erhöhen. Wir können Zähler plus 1 machen, einfach so. Wenn ich jetzt die Seite aktualisiere, klicke ich auf die Schaltfläche, ich sehe 2, ich sehe Hallo, weil die Komponente erneut gerendert wird. Ich klicke erneut auf den Button und jetzt das Hallo, wir sehen 3 und so weiter und so weiter. diesem Ansatz mit der Aktualisierung des Zustands müssen wir jedoch einen etwas anderen Ansatz verwenden, wenn wir einen neuen Wert für diesen Zustand festlegen müssen und einen neuen Zustandswert aus dem aktuellen Zustandswert berechnen möchten Zustand festlegen müssen und einen neuen Zustandswert aus dem aktuellen Zustandswert berechnen Zustandswert aus dem aktuellen Zustandswert . Anstatt einen Zähler plus 1 zu machen, können wir tatsächlich einen alternativen Callback an die State-Update-Funktion übergeben . Status-Aktualisierungsfunktion kann eines von zwei Argumenten empfangen. Entweder ein neuer Zustandswert, genau wie Sie gesehen haben, also 5, 10, neuer Wert, der die Voraussetzungen bereitet, oder wir können einen Callback an diese Zustandsupdate-Funktion übergeben, und innerhalb dieses Callbacks ist das erste Argument ein Wert, aktuellen Status darstellt. Sagen wir Stromzähler. Was auch immer wir von diesem Callback zurückgeben , wird als neuer Wert festgelegt. Nach diesem Rückruf können wir jetzt den aktuellen Zähler plus 1 zurückgeben . Es wird dasselbe sein und aus Benutzersicht wird nichts geändert, aber intern ist dies der richtige Ansatz, wenn Sie einen neuen Zustandswert aus dem aktuellen oder vorherigen Zustandswert berechnen müssen neuen Zustandswert aus dem aktuellen oder vorherigen Zustandswert berechnen . Da dies der Zähler ist und wir ihn erhöhen möchten, müssen wir den aktuellen Zählerstatus kennen. Sie in dieser Situation Verwenden Sie in dieser Situation immer den Callback-Ansatz. Wenn wir es nur auf eine Zufallszahl setzen wollten, brauchen wir es nicht wirklich, da wir den aktuellen Status nicht benötigen , um den neuen Status zu berechnen. Wir kehren zur App zurück. Ich erfrische mich. Auch hier hat sich, wie ich Ihnen gesagt habe, aus Benutzersicht nichts geändert. Mit so etwas können Sie Elemente auf der Seite manipulieren. Basierend auf diesem einfachen Grundwissen werden alle React-Apps einfach so erstellt. Sie haben mehrere Staaten. Sie können so viele Staaten erstellen, wie Sie möchten. Sie können sie nach Belieben manipulieren mit verschiedenen Ereignissen beim Klicken auf Ereignis, Schweben, wenn etwas geöffnet wird, etwas geschlossen wird, alles wird mit solchen Zuständen verwaltet. Ich denke, für dieses Video wird das reichen. Jetzt weißt du über React-Events , an die du etwas weitergeben kannst. Für dieses Attribut können Sie einen beliebigen Event-Handler übergeben , um eine Funktion auszuführen , wenn ein Ereignis eintritt. Dieser Event-Handler erhält immer ein Ereignisobjekt als erstes Argument, falls Sie es benötigen. Wenn du es nicht tust, nun, benutze es einfach nicht. Wenn Sie einen Wert auf der Seite, den Farbzähler, den Text oder was auch immer aktualisieren Farbzähler, den Text oder müssen, haben wir dafür eine Erklärung. Variablen funktionieren nicht , weil React nicht auf diese Weise funktioniert. React basiert auf dem Konzept des Re-Renderings, und um den Wert aller Renderings beizubehalten, müssen wir State verwenden. Wir können das tun, indem wir den Use-State-Hook verwenden. Hooks in React sind nur Funktionen, die Sie während des Lebenszyklus einer Komponente aufrufen , um Daten innerhalb der Komponente zu bearbeiten. Sowas in der Art. Im nächsten Video werden wir sehen, wie wir dieses Wissen nutzen und wie wir es in unserem Spiel anwenden können. Wir werden den Spielstatus erstellen und die Quadrate manipulieren, sodass der Status irgendwie aktualisiert wird, wenn wir darauf klicken . Wir sehen uns dort. 46. 07 Creating erstellen: Hallo. Im letzten Video haben wir über Interaktivität gesprochen, über Staat, was Staat ist, wie er uns helfen kann. In diesem Video können wir mit dem Status fortfahren, aber dieses Mal werden wir ihn in unserem Spiel anwenden. Im Vergleich zum vorherigen Video habe ich hier ein paar Dinge geändert. Ich werde nur sehr schnell auf diese Änderungen verweisen und die eslintrc-Konfiguration ist veraltet. Ich habe als Warnung keine unbenutzte Vars-Rolle gesetzt. Lassen Sie uns dafür eigentlich einen weiteren Commit hinzufügen. Vergabe von Balken reduziert die Erwärmung. Okay, das wird großartig funktionieren. Lassen Sie uns nun mit der Interaktivität fortfahren. Wenn wir also zum Board gehen, erstellen wir hier unseren Spielbrettstatus, der im Grunde unser Spielbrett darstellt. Aber die Frage ist, wie werden wir das machen? Wenn Sie sich erinnern, habe ich einmal erwähnt, dass es ein Array sein wird. Deshalb haben wir hier neun Elemente und sie beginnen alle mit Null. Sie beginnen einfach bei Null, nicht alle. Also, ich werde Paint hier öffnen. Ich sage dir, wie genau wir den Spielstatus mit einem Array darstellen können . Es wird eine Reihe von neun Elementen sein. Standardmäßig ist es also ein leeres Array mit neun Elementen. Und standardmäßig ist jedes Element null, okay. Standardmäßig haben wir zunächst ein Array mit neun Elementen, jedes Element wird Null sein. Dann, wenn wir auf ein Quadrat klicken. Unsere Quadrate werden also durch Indizes innerhalb dieses Arrays dargestellt . Das erste Quadrat hat den Index Null, das zweite Quadrat den Index eins, zwei und so weiter. Wenn wir auf ein Quadrat klicken, sagen wir, wir klicken auf ein Quadrat mit dem Index eins, wird sein Wert von Null auf x oder Null geändert , je nachdem, wer auf dieses Quadrat geklickt hat. Und einfach so werden wir den Staat verwalten. Irgendwann werden wir also ein Array von neun Elementen haben, jedes Element kann entweder eine Null sein , wenn das Quadrat nicht angeklickt wird, oder x oder Null, wenn das Quadrat angeklickt wurde. Lassen Sie uns weitermachen und intern werden wir zuerst useState aus React importieren. Innerhalb von Bord werden wir einen neuen Staat erstellen , den wir Quadrate nennen können. Setze Quadrate, es wird useState sein. Jetzt müssen wir zunächst ein Array von neun Elementen erstellen , und jedes Element ist standardmäßig Null. Dafür können wir hier nur einfaches JavaScript verwenden, sodass wir den Array-Konstruktor nicht mit neun als Array-Länge aufrufen können . Dann rufen wir die Punktfüllmethode und füllen das Array mit Nullen. Schließlich wird es ein Array von neun Elementen erzeugen , in dem jedes Element Null ist. Nun, wie können wir eigentlich jedes Quadrat jeder Komponente zuordnen , die ein Quadrat darstellt? Im Moment bestehen wir 0,1,2,3 und 4. Also werden wir stattdessen die Quadrate Null übergeben. Da das Quadrat also unser Zustand ist, wird es immer ein Array sein , das das erste Element aus diesem Array abgerufen hat. Für das zweite Quadrat können wir uns also das zweite Element schnappen und so weiter. müssen wir für jedes Quadrat tun. Machen wir weiter und machen das für jedes Quadrat. Also speichern wir es. Wir kehren zur App zurück. Diese Seite kann nicht erreicht werden. Das liegt daran, dass ich den Entwicklungsserver nicht besucht habe. Also, npm run dev. Ich gehe zurück und jetzt können wir sehen, dass unsere Quadrate leer sind. Nun, das wird erwartet, weil wir einen Nullwert haben. Wir bestehen Nullen. Und wenn Sie sich erinnern, wenn wir versuchen, Null anzuzeigen, wird es nicht ausgewertet. Es wird zu nichts und zu HTML führen. Nun, was können wir eigentlich tun? Sie können sehen, dass wir den Status irgendwie aktualisieren müssen, um die Quadrate zu aktualisieren, um den Zustand zu aktualisieren, wenn wir auf ein Quadrat klicken, wie können wir das machen? Wir sind also an Bord geblieben, aber wir haben die ganze Logik der quadratischen Komponente innerhalb der quadratischen Komponente. Was wir tun können, wir können Requisiten benutzen. Also können wir hier im Board eine Funktion definieren , die die Logik verwaltet, und wir können diese Funktion als Requisite an die quadratische Komponente übergeben . Also nochmal, wir setzen nur Requisiten ein, um einige Daten, einige Informationen an Komponenten weiterzugeben . Also hier, was werden wir tun? Wir werden eine neue Funktion namens handle square click erstellen . Diese Funktion erhält ein Argument. Wir werden diese Funktion mit einer Argumentposition aufrufen . Es wird der 0,1,2,3,4,5,6,7 sein und 8 wird der Index des Quadrats sein. Und innerhalb dieser Funktion werden wir etwas tun. Vorerst lassen wir es einfach leer. Also, wie ich Ihnen sagte, werden wir Eingabeaufforderungen verwenden , um Daten an Square zu übergeben. Was wir tun wollen, wenn wir auf dieses Quadrat klicken, dieses Handgriff-Quadrat wird kalt sein. Was können wir also tun, wir können onClick oder Squared Click weitergeben , wie auch immer Sie diese Requisite benannt haben. Nennen wir es einfach onClick. Und für diese OnClick-Requisite gehen wir weiter und bauen Square Click. Aber das Problem ist, dass, da wir das Handle quadrat click here übergeben, und wenn wir es auf diese Weise übergeben, dann nehmen wir das onClick hier innerhalb des Quadrats, und wir müssen diese Funktion innerhalb von square aufrufen und die Position als Argument übergeben , weil Handles Quadrate click das Positionsargument erhält. Also, wenn wir diese Funktion aufrufen, müssen wir diese Position übergeben. Aber das Problem ist, dass Square darüber eigentlich nichts wissen muss. Was wollen wir idealerweise tun, wir wollen nur die onClick-Funktion hier abrufen und für das onClick-Attribut wollen wir diese Funktion so übergeben. Und Square wird diesbezüglich keine Logik anstellen. Alles wird hier an Bord verwaltet. Um das zu tun, was wir hier für die onClick-Requisite tun können, können wir eine Funktion übergeben, und diese Funktion ruft handleSquareClick mit der Position auf, die wir benötigen. Irgendwann sieht es also ungefähr so aus. Wir können das sogar vereinfachen und den Funktionskörper entfernen. Jetzt sieht es prägnanter aus und es sieht so aus. Warum müssen wir eine Funktion übergeben , die eine andere Funktion aufruft? Warum können wir es so nennen? Nun, das Problem ist, wie Sie sich erinnern, dass, wenn die Komponenten auf der Seite eingebunden werden, JavaScript innerhalb der Komponente ausgeführt wird, und mit dieser Syntax, etwas JavaScript, gehen wir Zeile für Zeile vor, und sobald JavaScript Licht verwendet, wird es sehen, dass wir diese Funktion einfach hier in dieser Zeile aufrufen. Was es also tun wird, es wird diese Funktion sofort write aufrufen . Und was auch immer die Funktionsstörung zurückgibt, wir werden gesetzt, hier wird der Wert für onClick prop übergeben, da unsere Funktion nichts zurückgibt, sie wird undefiniert sein, und irgendwann wird onClick hier innerhalb des Quadrats undefiniert sein. Nichts wird passieren. Wir werden diese Funktion „write straightaway“ und am Ende „ undefined“ haben. Das ist nicht genau das , was wir wollen. Zuallererst ist der Event-Handler in erster Linie eine Funktion. Deshalb übergeben wir eine Funktion, nichts anderes. Also übergeben wir eine Funktion , die Handles schnell mit den Argumenten aufruft , die wir benötigen. Nun, wie Sie sehen, müssen wir das für jedes Quadrat hier machen, einfach so und eine andere Position passieren , aber Sie können feststellen, dass es hier eine kleine Wiederholung gibt. Wir haben viele Dinge , die wir hier vereinfachen können. Anstatt also Werte, Quadrate, dann den Array-Index, dann onClick und das ständige Wiederholen von Handgriffen zu bilden, können wir diese Funktion vereinfachen. Wir können diese Syntax vereinfachen, indem wir eine andere Funktion verwenden. Also, was können wir hier tun, um diese Wiederholung zu vermeiden, hier im Board können wir eine weitere Funktion erstellen, die wir so etwas wie ein Renderquadrat nennen können . Dieses RenderSquare erhält wieder eine Position, die der quadratische Index sein wird , und innerhalb dieser Funktion können wir dann das JSX-Markup zurückgeben. Wir werden es einfach hier kopieren. Von RenderSquare aus können wir jetzt square zurückgeben, also statt Quadrate Null übergeben wir squares position und handleSquareClick. Anstelle von Null werden wir die Position bestehen. Irgendwann so etwas. In JSX verwenden wir jetzt geschweifte Klammern, um JavaScript hinein zu interpolieren. Da wir hier Variablen, die JavaScript-Ausdrücke sind, auf genau die gleiche Weise interpolieren können JavaScript-Ausdrücke sind, auf genau die , können wir hier Funktionen aufrufen, da Funktionen auch Teil von JavaScript-Ausdrücken sind . Anstatt alle Quadrate einfach so zu schreiben , was wir tun können, können wir einfach geschweifte Klammern öffnen und RenderSquare aufrufen und den Nullindex darin übergeben. Sobald die Komponente springt, wird diese Funktion mit Null als Argument aufgerufen , das die Position innerhalb der Komponente sein wird . Es gibt JSX-Markup zurück und dieses JSX-Markup wird an der Stelle interpoliert, an der diese Funktion gut aufgerufen wurde, im Grunde hier. Genau das Gleiche werden wir für den Rest unserer Quadrate tun . Ich kopiere es einfach zweimal. Ich entferne das, weil wir es nicht mehr brauchten, und ich werde genau dasselbe für die restlichen Quadrate tun, also 3, 4 , 5, 6, 7, 8. Auch hier rufen wir die Funktion auf, wenn die Komponente gemountet Diese Funktion gibt JSX-Markup zurück, und dieses JSX-Markup wird an der Stelle eingefügt, an der diese Funktion aufgerufen wird. Wenn Sie diese Funktion nur so referenziert haben, passiert nichts. Wenn ich zurückgehe, schauen wir mal, was passiert. Nun, wir sehen hier einige seltsame Dinge und wenn wir versuchen, es zu sehen, haben wir hier nur zwei Quadrate. Was wir gerade machen, im Grunde versuchen wir, die Funktion selbst anzuzeigen. Nicht das, was die Funktion zurückgibt sondern die Funktionssignatur naja und reagieren, es funktioniert nicht so, wenn Sie versuchen , Objekte so darzustellen, wie sie sind, werden Sie das nicht können. Sie müssen sie zuerst in Zeichenketten umwandeln, aber das werden wir jetzt nicht tun. Das ist eine etwas fortgeschrittene Sache und darauf werden wir in Zukunft zurückkommen. Wir nennen diese Funktion, wir übergeben ihr ein Argument und wir überprüfen, ob alles funktioniert. Wir haben unsere Komponente im Grunde nur leicht überarbeitet , aber sie macht genau das Gleiche. Es rendert den Wert an dem Index, den wir hier angeben, einen Wert aus unserem quadratischen Array, das der Zustand ist. In handleSquareClick müssen wir hier etwas Logik anwenden, also etwas Logik, um Quadrate irgendwie anzuzeigen. Um den Quadratstatus zu aktualisieren, müssen wir in unserem Fall die Funktion state update aufrufen , wenn wir die Quadrate indexieren. Das ist genau das, was wir tun werden. Da unser Status ein Array ist , das im Laufe der Zeit geändert wird, und unser neuer Array-Status , den wir berechnet haben , aus dem aktuellen Status berechnet werden muss , verwenden wir die Callback-Version von set state. Ich werde hier den Callback weiterleiten und das erste Argument wird zu diesem Zeitpunkt Square State sein. Ich nenne es CurrentSquares und wir müssen den CurrentSquares-Zustand irgendwie manipulieren und einen neuen und einen neuen Quadratstatus mit aktualisierten Werten erhalten. Ein Punkt, den ich im vorherigen Video nicht erwähnt habe, ist, dass wir die Zustandsvariable nicht mutieren können. Was meine ich damit? Wenn wir useState verwenden und versuchen, diese Quadrate zu nehmen und versuchen, so etwas zu tun, entsprechen Quadrate an einer bestimmten Position etwas. Was wir hier machen, wir manipulieren diesen Zustand direkt , anstatt diese Status-Update-Funktion zu verwenden , das wird nicht funktionieren. Dies ist auf diese Weise verboten, der Status wird nicht aktualisiert. In React funktioniert das nicht so. müssen wir ständig die Status-Update-Funktion aufrufen Dazu müssen wir ständig die Status-Update-Funktion aufrufen, also wird das auch hier nicht funktionieren. Wir nennen setSquares und innerhalb von Setsquares haben wir auch CurrentSquares, das den jeweiligen Bundesstaat darstellt. Wenn wir versuchen, den Staat hier erneut direkt zu mutieren, funktioniert das nicht. Das wird einfach nicht funktionieren. So funktioniert React nicht. Wir müssen die Funktion aufrufen und einen neuen Wert zurückgeben. Bei React geht es nicht darum, Werte direkt zu mutieren. React geht es darum, neue Werte zurückzugeben , wenn das für Sie Sinn macht. Aus den SetSquares müssen wir einen neuen Wert zurückgeben. Was wir tun können, um all unsere Quadrate zu wiederholen und sie irgendwie zu aktualisieren, wir können die Methode Array.map verwenden und die Methode Array.map verändert den Zustand nicht, sondern gibt einen neuen Array-Wert zurück. Deshalb ist es sicher, das zu tun. Ein gibt CurrentSquares.map zurück, also werden wir unseren quadratischen Zustand wiederholen. Unser erstes Argument wird der Wert sein, den wir gerade in einer Schleife überarbeiten, also wird es unser SquareValue sein. Dann haben wir den Index des Quadrats. Nennen wir es einfach Pos. Da wir in diesem Funktionsbereich bereits eine Position haben, kommt es zu einer Kollision von Variablen, wenn wir versuchen, sie Position zu nennen . Wir bleiben einfach auf dem Laufenden. Immer wenn ich von der.map für das aktuelle Element zurückgekehrt bin, wird diesem Element ein neuer Wert zugewiesen. Hier wird die Logik ziemlich einfach sein. Die Position, die wir an diese Funktion übergeben, ist die Position, auf die wir im Grunde klicken. Um uns nicht zu verwirren, benennen wir es tatsächlich in geklickte Position um und hier, Index in Array.map, rufen wir Position auf. Wir werden herausfinden, ob die angeklickte Position der Position des Quadrats entspricht , das wir betrachten In diesem Fall geben wir vorerst X aus der.map zurück. Andernfalls geben wir einfach denselben Quadratwert zurück, wenn das Quadrat, das im Moment in einer Schleife angezeigt wird , nicht das Quadrat ist, auf das wir geklickt haben. Jetzt speichern wir es, es sieht so aus, als ob es, wenn es formatiert ist etwas verwirrend sein könnte, weil wir eine Funktion haben , die Funktion aufruft , und innerhalb der Funktion haben wir einen Callback Gewöhnen Sie sich einfach daran, also kehren wir zur App zurück. Versuchen wir nun, auf ein Quadrat zu klicken. Ich klicke in die Mitte und zack, nichts passiert. Warum ist das so? Versuchen wir es hier im Konsolenprotokoll mit dem quadratischen Zustand. Mal sehen, was wir haben. Wir haben eine Reihe von Nullraten und wenn ich klicke, passiert eigentlich nichts. Mal sehen, was hier falsch sein könnte. Der falsche Teil hier ist, dass Sie sehen können die quadratische Komponente nicht gespeichert wurde. Das liegt daran, naja, was auch immer ich gerade hier geschrieben habe, es wurde nicht gespeichert, also wurden die Änderungen im Grunde nicht übernommen. Ich speichere es und jetzt sollte es funktionieren. Ich klicke auf das Quadrat und du siehst, jetzt habe ich X hier und wenn du hier siehst, wurde der Status aktualisiert. Da ich nun auf ein Quadrat mit dem Index 4, 0, 1, 2, 3, 4 geklickt habe, haben wir auf dieses Quadrat geklickt und innerhalb dieses Arrays das Element mit Index 5 aktualisiert und seinen Wert auf X gesetzt, und seinen Wert auf X gesetzt was genau das enthält, was wir brauchen. Wenn wir weitermachen und all diese Quadrate anklicken, werden Sie sehen, dass alle Quadrate mit Zugriff gefüllt werden, was genau das ist, was wir wollten, und wir sehen all diese Konsolenprotokolle ständig wieder. Denn seit wir diesen Status aktualisieren, rendert die Komponente die Logik in den internen Läufen erneut und wir sehen jedes Mal, wenn die Logik erneut ausgeführt wird, das Konsolenprotokoll. Großartig. So etwas können wir unseren Staat verwalten. Im Moment denke ich, dass das genug sein wird. Im nächsten Video stellen wir unsere Spieler vor. Wir werden tatsächlich den aktuellen Spieler haben, sodass wir unterscheiden können, wer als Nächstes auf dieses Quadrat klickt. Es wird entweder X oder Null sein, also können Sie jetzt sehen, dass wir nur X haben, was nicht gerade das ist, wonach ich suche. Im nächsten Video werden wir uns damit befassen. Wenn wir auf dieses Quadrat klicken, ist es entweder X oder Null. Wir sehen uns dort. 47. 08 Spieler X und O hinzufügen: hallo. Im vorherigen Video haben wir über diese Zustandsquadrate gesprochen, und wir haben es tatsächlich geschafft, X in das Quadrat zu setzen , wenn wir darauf klicken. In diesem Video werden wir weitere Funktionen hinzufügen. Wenn wir also auf das Quadrat klicken, Wenn wir also auf das Quadrat klicken können wir entweder x oder Null anzeigen. Mit anderen Worten, wir werden einen Spieler haben. Bevor wir neue Änderungen einführen, haben wir bis jetzt viele Änderungen gegenüber dem vorherigen Video vorgenommen. Wir haben diese Funktion hinzugefügt, wenn wir auf das Quadrat klicken, wir zeigen X darin an. Nun, lassen Sie uns weitermachen und diese Änderungen vornehmen. Ich tippe einfach git add ein. und ich nenne diese Commit-Nachricht, sagen wir mal Display X, wenn man auf ein Quadrat klickt. Lassen Sie uns den Server erneut starten. Fantastisch. Lassen Sie uns nun im Grunde eine Player-Funktionalität hinzufügen. Der Spieler ist etwas, das sich im Laufe des Komponentenzyklus ändern wird. Das heißt, es wird ein Staat sein. Was wir einführen werden, ist ein neuer Staat, und der Staat wird der Spieler sein. Wir werden diesbezüglich jedoch keine Komplikationen machen. Es wird nur ein einfacher boolescher Wert sein , der uns sagt , wer der nächste Spieler sein wird. Wir werden es so etwas wie ISXNext nennen. Wenn es wahr ist, setzen wir den Zustand auf x, andernfalls wird er Null sein, so einfach ist das. Innerhalb des Boards können wir weitermachen und einen neuen Status erstellen und ihn in isxNext umbenennen und die Funktionen aktualisieren, indem wir neuen Status erstellen und ihn in isxNext umbenennen und die Funktionen aktualisieren, isxNext setzen, und standardmäßig ist er falsch. Da wir bereits so ziemlich alles haben , was wir brauchen, werden wir nur diese Zeile 12 modifizieren. Hier geben wir x zurück. Es ist hier fest codiert. Aber stattdessen werden wir nur eine weitere einfache „wenn nicht“ -Bedingung einführen . Wir werden fragen. Wenn xNext ist, dann ist der Wert, den wir dem angeklickten Quadrat zuordnen , X , andernfalls wird er Null sein. Gleich nachdem wir den setSquare-Status aktualisiert haben, werden wir auch setisXNext aktualisieren. Wir werden es umschalten, da es ein Boolean ist. Ich rufe setisxNext auf, und da wir es umschalten müssen und es in der Reihenfolge umschalten wird, müssen wir den aktuellen booleschen Schalter kennen , der in diesem Moment entweder wahr oder falsch ist, und wir werden ihn einfach umdrehen. Wir werden wieder die Callback-Version von Set State Updater verwenden . Wir drücken auf Rückruf. CurrentIsxNext oder machen wir es einfacher. Nennen wir es einfach wie P oder prev für previous, oder lassen Sie uns ohne Komplikationen vorgehen, unabhängig von CurrentIsXNext. Um diesen booleschen Wert umzuschalten, müssen wir nur die Negation im Voraus anwenden, einfach so, und das war's. Was es tun wird, es wird das aktuelle boolesche Stadium erreichen. Es wird entweder wahr oder falsch sein, wenn es falsch ist, wenden wir Negation auf Falsch an, es wird wahr, und wenn das wahr ist, wenden wir Negation an, es wird falsch. Drehen Sie im Grunde den booleschen Wert um und wir tun es, nachdem wir den Status der gesetzten Quadrate aktualisiert haben. Wir machen das, wir kehren zu unserer App zurück. Wir klicken und jetzt haben wir zuerst Null. Jetzt klicken wir weiter, wir haben X und wir gehen los, und Sie können sehen, dass es hin- und hergeschoben wird und alles so funktioniert, wie wir es erwarten. Wenn ich jedoch erneut auf das Quadrat klicke, siehst du hier etwas geworfen. Das Problem ist, wenn wir auf das Quadrat klicken, die Logik erneut ausgeführt und das Quadrat am Index an der Position aktualisiert , auf die wir geklickt haben. Was wollen wir hier hinzufügen, eine weitere Bedingung. Wenn das Quadrat bereits einen Wert hat, wenn es nicht Null ist, dann führen wir diese Logik einfach nicht aus. Hier sind die oberen inneren Griffe quadratisch, wir können fragen, ob die Quadrate schon, clickedPosition, der Wert wahr ist. Wahrer Wert bedeutet nicht Null. Unser Quadratwert kann entweder Null, X oder Null sein. Wenn dieser Wert wahr ist, bedeutet das, dass er nicht Null ist. In diesem Fall kehren wir einfach von dieser Funktion zurück. Das Schlüsselwort return beendet die Funktion und geht nicht weiter. Wir speichern es. Mal sehen, unsere wird so aussehen. Ich klicke auf Quadrate und versuche erneut, auf das Quadrat zu klicken , und nichts passiert, weil es erneut den Zustand überprüft und die Funktion beendet. Ziemlich cool. So etwas, wir haben Spieler in unser Spiel aufgenommen. Unser nächster Schritt wird darin bestehen, oben die Nachricht anzuzeigen, wer der nächste Spieler sein wird. werden wir jedoch im nächsten Video tun . Vorerst werden wir unsere aktuellen Änderungen festlegen. Ich nenne diesen Commit. Was wir getan haben, lassen Sie uns überprüfen. Wir haben hier im Grunde einen Spieler vorgestellt. Hat einen Spieler in das Spiel eingeführt. Wenn Sie auf ein Quadrat klicken, zeigen Sie entweder x oder Null an. Das verpflichten wir uns, wir setzen es ein. Ich habe es falsch geschrieben. Drücken Sie Origin Master. habe ich nur, weil ich hinter den Kulissen etwas gemacht habe , als ich das Video ausgeschaltet habe. Entschuldigung, das solltest du nicht haben. Ich werde einfach das erste Flag einfach so verwenden und jetzt ist alles auf GitHub. Bitte mach dir nichts aus diesem Teil, du wirst ihn nicht haben. Großartig. Wir sehen uns im nächsten Video. 48. 09 Zeige nächsten Spieler und winner: Hallo. Im vorherigen Video haben wir es geschafft, unserem Spiel Spielerfunktionen hinzuzufügen. In diesem Video werden wir fortfahren und die Meldung hier oben auf dem Spielfeld anzeigen, die besagt, dass der nächste Spieler da ist und wenn wir einen Gewinner haben, zeigen wir den Gewinner an. In diesem Video werden wir all das sowie die Berechnung des Gewinners behandeln . Zuallererst, was wollen wir tun? Wir müssen entscheiden, was genau wir als Markup für die Nachricht verwenden möchten. Der nächste Spieler ist x oder Null. Nun, wir wollen es in App jsx machen. Hier nur ein einfacher H2-Tag, der besagt, dass der nächste Spieler vorerst jemand ist. Wenn ich zurückgehe, sieht es vorerst so aus. Wir haben jedoch bereits ein Problem. Was wir hier verwenden müssen um anzuzeigen, wer der nächste Spieler sein wird. Wie Sie sehen können, befinden sich die gesamte Logik und der Status in der Platinenkomponente. Das bedeutet, dass es für die Außenwelt nicht verfügbar ist. Die einzige Komponente , die über Quadrate und den gesamten Zustand und all diese Logik Bescheid weiß , ist die Platinenkomponente selbst Sie können alle Daten, die Sie von dieser Komponente benötigen, an ihre untergeordneten Komponenten weitergeben . Zum Beispiel, wie wir es mit Quadraten machen. Wenn wir von außen auf diesen Staat oder die Daten zugreifen wollen , ist das unmöglich. Wir haben hier zwei Möglichkeiten. Die erste Option besteht darin, den nächsten Spieler , der eine Nachricht innerhalb des Spielbretts ist , tatsächlich zu bewegen nächsten Spieler , der eine Nachricht innerhalb des Spielbretts ist . Vielleicht stell es hier hin. Wir haben im Rahmen dieser Nachricht alle Daten, die wir benötigen , sodass wir daraus etwas herausholen und es schließlich anzeigen können . Wir haben den nächsten Spieler. Diese oder die zweite Option besteht darin , einen Teil dieser Logik in die übergeordnete Komponente zu verschieben. Zum Beispiel an die App-Komponente und dann die erforderlichen Informationen über Requisiten an die Board-Komponente übergeben über Requisiten an die Board-Komponente und dann hier weitere Informationen, die für die Nachricht benötigt werden, pausieren . Wenn wir versuchen, es zu visualisieren, wenn wir Paint öffnen, haben wir ein solches Bild. Wir haben eine App-Komponente , die die Board-Komponente rendert , und auch innerhalb der App rendern wir Nachrichten. Es ist vorerst nicht Bestandteil, aber immer noch Teil der App, nicht Teil des Boards. Der Status wird hier innerhalb der Bordkomponente verwaltet. Da die Nachricht nicht Teil des Forums ist, hat sie keinen Bezug dazu. Es lebt wie ein separates Blatt, dann bedeutet das, dass es unmöglich ist, Zugang zu dem zu erhalten, was an Bord passiert. Die erste Option, die ich erwähnt habe, besteht darin, die Nachricht hier zu einem Teil der Board-Komponente zu machen . Wenn wir zum Board gehen und hier eine Nachricht posten, können wir auf Daten zugreifen, sodass wir sie hier verwalten können. Das ist die erste Option, aber das werden wir nicht tun, wir möchten, dass die Nachricht Teil der App-Komponente ist. zweite Option besteht darin , die Logik zu erhöhen, den Status auf die übergeordnete Komponente, die App, und dann die erforderlichen Daten mithilfe von Requisiten an die entsprechenden Komponenten zu übergeben . Die Logik wird in der App gespeichert und dann geben wir Daten über Requisiten an das Board weiter und dann übergeben wir weitere Daten an die Nachricht, in Zukunft wieder Requisiten verwenden. Moment ist es keine Komponente, aber die Idee ist dieselbe. Wir teilen Daten in der Patentkomponente. Wir öffnen das Board und vom Board aus nehmen wir den Status und verschieben ihn in die App-Komponente. Das Gleiche werden wir mit dem Import machen. Wir werden es in die App einfügen und auch den Quadratklick bearbeiten. Von nun an wird es live sein und innerhalb der App-Komponente verwaltet werden. Ich kopiere es hier. Ich habe es in die App gesteckt. Einfach so. Wir speichern das Board, aber Sie können sehen, dass wir im Board keinen quadratischen Mauszeiger mehr haben. Wenn wir den Mauszeiger bewegen, ist die Quadratwurzel nicht definiert, da sie hier nirgends erstellt wurde, das Gleiche gilt für Quadrate. Platinenkomponente hat jetzt diese undefinierten Werte. Nun, das bedeutet, dass wir irgendwie Zugriff darauf bekommen müssen und das werden wir durch Requisiten tun. Da wir jetzt Quadrate haben und Quadrat hier in der App verwalten, können wir es mit Requisiten an die Board-Komponente weitergeben. Ich werde hier einfach so Quadrate weitergeben und das Quadrat Click genauso handhaben. Jetzt kann ich innerhalb des Boards Destruct Link anwenden und Quadrate nehmen und das Quadrat anklicken. Wenn ich jetzt beide Dateien speichere, öffne ich meine App erneut. Alles funktioniert wie zuvor, aber jetzt lebt der Staat in der App, und alle erforderlichen Daten werden über Requisiten an die Leiterplattenkomponenten weitergegeben. Großartig. Das bedeutet, dass die Nachricht, die wir in der App-Komponente anzeigen, jetzt Zugriff auf den Status hat. Wir können die Nachricht anzeigen. Unsere Logik wird ziemlich einfach sein. Ich werde hier eine neue Variable erstellen und Ihnen sagen, warum. Wir nennen es eine Nachricht oder sagen wir eine Statusmeldung. Hier machen wir isxNext, wir geben x string zurück, andernfalls Nullzeichenfolge und eine Statusmeldung zurück , da sie verfügbar ist, werden wir sie in JavaScript interpolieren. Wir sagen, der nächste Spieler ist {Statusmeldung}, oder sagen wir, statt der Statusmeldung nennen wir ihn den nächsten Spieler. Der nächste Spieler ist der nächste Spieler. Wir speichern es und nächste Spieler ist Null. Fantastisch. Wir klicken. In der Tat war es Null, und Sie sehen, dass es sich geändert hat und es geht weiter und alles funktioniert wie erwartet. Möglicherweise haben Sie jedoch eine Frage, warum werden wir hier als Variable angezeigt? Warum gründen wir dafür nicht vielleicht acht Bundesstaaten? Die Sache ist, dieser nächste Spieler ist ein sogenannter abgeleiteter oder berechneter Zustand, und warum erstellen wir dafür nicht einen anderen Zustand mit use state? abgeleitete oder berechnete Status ist ein Wert, der vom letzten Status abgeleitet wird. Da wir isxNext als Status haben und wissen, dass bei jeder Ausführung der Komponente die interne Logik ausgeführt wird, was bedeutet, dass diese Codezeile bei jedem erneuten Rendern der Komponente erneut ausgeführt wird . Die Sache ist, wenn die Komponente erneut gerendert wird, wird der Status aktualisiert. Das bedeutet, dass für das aktuelle Rendering der Status, den wir hier haben, aktuell sein wird. Es ist der letzte Staat, den wir haben. Da diese Logik erneut ausgeführt wird, verwendet sie hier immer den neuesten Status isxNext. Deshalb müssen wir dafür nicht wirklich einen weiteren Staat schaffen. Wir erstellen einfach einen Wert, der vom neuesten Zustandswert abgeleitet wird. Nun, es klingt vielleicht etwas kompliziert, aber wenn Sie darüber nachdenken, ist daran nichts Raffiniertes. Wir haben bereits einen Wert, der sich ändert, und wir leiten tatsächlich etwas von diesem Wert ab. Nichts weiter als das. Deshalb müssen wir keinen weiteren Use State erstellen, das macht keinen Sinn. Jetzt haben wir die Nachricht , die besagt, wer der nächste Spieler sein wird , aber lassen Sie uns noch weiter gehen und den Gewinner anzeigen. Wann immer wir einen Gewinner haben, möchten wir ihn ausstellen. Der Gewinner ist dieser Typ, der nächste Spieler X. Wenn wir zu dem Gast zurückkehren , der am Anfang mit Ihnen geteilt wurde, und wenn Sie darin nach calculatewinner.js suchen, haben Sie hier eine Funktion: Gewinner berechnen. Lassen Sie uns diese Funktion kopieren. Kehren wir zu unserer App und dem internen Quellcode zurück, erstellen wir eine neue Datei und nennen sie winner.js. Falls Sie es bemerkt haben, haben wir diese Datei nicht mit der Erweiterung dot.js6 benannt , da diese Datei kein js6-Markup enthält. Es ist nur ein normales JavaScript. Von hier aus, aus der JS-Datei, werden wir die Funktion calculatewinner exportieren. Was es macht, es nimmt unser Quadrat Array, das wiederum, wenn Sie sich erinnern, ein Array ist, in dem wir unsere quadratischen Werte speichern; Null, X oder Nullen, und aus diesem Array berechnet es den Gewinner. Wenn es keinen Gewinner für Baumwollquadrate gibt, wird Null zurückgegeben. Wenn es einen Gewinner gibt, wird X oder Null zurückgegeben, was in Zeile 15 stattfindet. Wie funktioniert das? Wie funktioniert die Funktion? Hier haben wir eine Linienanordnung definiert, die im Grunde alle möglichen Gewinnkombinationen im Tic-Tac-Toe-Spiel darstellt . Zum Beispiel ist 0, eins und 2 die Kombination 0, 1 und 2, also wenn Sie Xs in einer Zeile haben. Sie können jede mögliche Kombination überprüfen , die Sie hier sehen. Auch hier ist es nur ein Satz aller möglichen Gewinnkombinationen. Was machen wir dann hier? Wir verwenden den einfachen For-Loop. Und wir schauen uns diese an. Wir gehen jede Gewinnkombination durch. Ich meine sehr einfach. Wir vergleichen unser aktuelles Quadrat mit einer Gewinnkombination. Wenn wir diese Gewinnkombination in unserem Quadrat-Staat und unsere Quadrate in der Reihe haben, wir einfach den Gewinner zurück. Hier verwenden wir die Array-Destrukturierung in Zeile 13. Linien in Augenposition stellen dieses Array dar. Aus diesem Array umschließen wir das erste, zweite und dritte Element und nennen sie a, b c. Für dieses Array wird zum Beispiel a Null sein, b wird eins sein, zwei wird c. Dann sehen wir, ob es einen Gewinner gibt, wenn wir diese if-Logik verwenden . Wenn Sie wirklich daran interessiert sind, wie es funktioniert, versuchen Sie einfach, die Werte selbst in diese, sagen wir, Formel einzubauen. Ein bisschen Logik hier. Wir kehren zur App zurück und können dies tun, indem wir diese Funktion einfach in der App-Komponente ausführen . Da wir Square State bestehen müssen und Calculatewinner als Gewinner ausgibt. Wir müssen keinen weiteren Staat gründen. Diese Gewinnervariable, die wir haben, wird wiederum der vom quadratischen Zustand abgeleitete Zustand sein. Ich werde hier weitermachen, vielleicht oben, ich werde die Gewinnervariable erstellen. Was ich tun werde, ich werde calculatewinner importieren. Dies heißt Export, also importiere ich es mit geschweiften Klammern von Winner. Ich nenne das hier Funktion und darin übergebe ich unseren quadratischen Zustand. Ich werde hier einen Gewinner haben. Lass uns versuchen, es zu protokollieren und zu sehen, was wir haben. Ich öffne die Konsole. In der Konsole habe ich Null, weil wir, naja, keinen Gewinner haben. Wenn ich das Spiel spiele, null, null. Lassen Sie uns einen Gewinner erstellen. Wenn ich jetzt hier klicke, habe ich die Gewinnkombination und Sie sehen, dass sie hier Null ergibt, denn jetzt haben wir einen Gewinner, und zwar Null. In diesem Fall müssen wir anzeigen. Lass uns weitermachen. Wir haben bereits, dass der nächste Spieler der nächste Spieler ist, aber wir werden diese Nachricht leicht ändern. Oder vielleicht werden wir es nicht anfassen. Hier erstellen wir eine weitere Variable , die wir zu diesem Zeitpunkt Statusmeldung nennen werden. Hier werden wir fragen, ob wir einen Gewinner haben, dann sagen wir, Gewinner ist Gewinner, die Variable, die wir haben. Wir müssen hier jedoch eine Zeichenkettenvorlage verwenden , um die Zeichenketteninterpolation anzuwenden. Ich werde diese Zeichenfolge in eine Zeichenkettenvorlage umwandeln indem ich normale singuläre Anführungszeichen durch hintere Häkchen ersetze. Dadurch kann ich die Interpolation verwenden, indem das Dollarzeichen und geschweifte Klammern verwende, sodass der Gewinner der Gewinner ist. Andernfalls verwenden wir, falls wir keinen Gewinner haben, verwenden Nachricht des nächsten Spielers, die wir bereits hier haben. Anstatt zu zeigen, dass der nächste Spieler der nächste Spieler ist, zeigen wir diesmal nur die Statusmeldung. Ich habe es falsch geschrieben. Es wird eine Statusmeldung sein. Schauen wir uns nun an, was wir hier haben? Wir haben also nur den nächsten Spieler, der nächste Spieler ist. Ich verstehe. Stattdessen müssen wir sagen, dass der nächste Spieler der nächste Spieler ist. Wir gehen zurück, wir haben den nächsten Spieler, der Null ist. Lass uns das Spiel spielen. Lassen Sie uns einen Gewinner erstellen. Jetzt sehen wir die Nachricht, Gewinner ist X. Großartig, weil wir einen Gewinner haben. Cool. Hier gibt es jedoch ein Problem. Wenn du versuchst, das Spiel zu spielen, wenn du weitermachst, können wir immer noch auf Quadrate klicken, aber das kann leicht behoben werden. Wir haben bereits die Logik , die Funktion zu beenden, wenn wir auf dasselbe Quadrat klicken zweimal oder dreimal auf dasselbe Quadrat klicken, nur mehrmals. Hier verlängern wir einfach diese Bedingung und wir werden es sagen. Wenn wir zweimal auf dasselbe Quadrat klicken oder wenn wir einen Gewinner haben, beenden wir einfach die Funktion. So einfach ist das. Lass es uns versuchen. Ich habe das Spiel gespielt. Wir haben jetzt einen Gewinner. Wenn ich auf eines der Quadrate klicke, lasse ich keine Logik laufen, weil wir hier enden weil das vielleicht falsch, vielleicht wahr ist, es spielt keine Rolle, aber hier stimmt es definitiv. Wir haben die Ausgangsbedingung. Einfach so, wir sind fast fertig mit unserem Spiel. Die einzige Funktion , die wir hier hinzufügen werden , ist die Spielhistorie. Wir werden in der Lage sein, durch den Spielverlauf zu navigieren. Wir werden unsere Spielzüge, die wir gemacht haben, verfolgen und zwischen ihnen hin- und herreisen können, aber das werden wir im kommenden Video regeln. Im Moment reichen diese Änderungen aus. Lassen Sie uns sie tatsächlich auf Git da wir hier viele verschiedene Dinge vorstellen werden. Ich öffne das Terminal, füge alles zur Bühne hinzu und benenne all diese Änderungen als, mal sehen, lass uns einen Überblick geben. Zuerst haben wir den Staat von Bord geholt. Es erschien in der App-Komponente und dann haben wir den Gewinner angezeigt. Nun, das ist eine Menge. Wir werden es Ihnen mitteilen, die Komponente „Status zur App“ angehoben und dem Benutzer eine Statusmeldung anzeigen. Keine Statusmeldung an den Benutzer, berechne den Gewinner. Machen wir es uns mit den Nachrichten nicht kompliziert. Ich denke, das wird ausreichen. Schließlich stellt Lead alles auf GitHub bereit. diesem tiefgründigen Hinweis Lassen Sie uns zu diesem tiefgründigen Hinweis dieses Video hinzufügen. Wir sehen uns im nächsten. 49. 10 Zeige game: hallo. In diesem Video werden wir weiterhin über Nachrichten sprechen, die wir dem Benutzer hier anzeigen. Der einzige Punkt, den wir vorherigen Video, in dem wir die Statusmeldung angezeigt haben, übersehen haben, ist die Auslosung des Spiels. Was ist, wenn wir das Spiel beenden , aber irgendwann keinen Gewinner haben? In diesem Fall möchten wir dem Benutzer eine weitere Meldung zeigen, dass, sagen wir, X und Null unentschieden sind, es also ein Unentschieden gibt. Um das zu tun, müssen wir hier mehr Logik anwenden. Aber wir werden das in einer Komponente tun , die wir speziell für Statusnachrichten erstellen werden. Innerhalb der Komponenten erstelle ich eine neue Datei, die ich Statusmeldung nennen werde. Dies wird die neue Komponente sein. Von hier aus erstelle ich eine Komponente für den Export von Statusnachrichten. Statusmeldung. Vorerst einfach so, es wird ein Div sein, das Hallo sagt. Außerdem muss ich es von hier aus exportieren. Dann werde ich in App JSX Quadrate aus quadrierten Komponenten importieren. Ups, Entschuldigung, nicht quadratisch, Statusmeldung. Dann werden wir hier anstelle der H2-Statusmeldung die Statusmeldungskomponente einfach so anzeigen. Also entfernen wir das. Jetzt sollte sich die Statusmeldung irgendwo in der Statusnachrichtenkomponente befinden. Wir haben hier jedoch keine Daten , weshalb wir erneut Requisiten verwenden werden, um alle erforderlichen Daten an die Statusnachrichtenkomponente zu übergeben. Wir haben hier die nächste Ebene und die Statusmeldung, wodurch sie direkt in die Statusnachrichtenkomponente verschoben werden. Wir haben kein ISXnext und wir haben hier keinen Gewinner. Aus diesem Grund erwarten wir, dass sowohl der Gewinner als auch ISXnext bestätigt wird. Die Gewinnerberechnung erfolgt hier. Die Sache ist jedoch, dass wir auch herausfinden müssen, wann wir keine leeren Quadrate und keinen Gewinner haben? Wir müssen diese Logik schreiben. Um Unentschieden anzuzeigen, müssen wir wissen, ob alle Felder mit etwas belegt sind und wir immer noch keinen Gewinner haben, diesen Wert zu erhalten, den booleschen Wert, der angibt , dass wir erneut Zugriff auf unseren Quadrat-Status benötigen . Wir werden es auch in der Statusmeldung benötigen. Wir werden es auch hier weitergeben. Winner, isxNext und Squares bleiben hier. Gib alles als Requisiten weiter. Also hier, wenn ich eine Komponente für Statusmeldungen rendere , gebe ich Winner, ich übergebe isxNext und ich gebe Quadrate weiter. Großartig. Nun, hier werden wir etwas verwenden, das als bedingtes Rendern bezeichnet wird. Nun, davon weißt du eigentlich nichts, aber wir haben hier in Zeile 3-5 bereits bedingtes Rendern angewendet . Beim bedingten Rendern wird einfach etwas angezeigt, das auf der Bedingung basiert. hier zum Beispiel Wenn ich hier zum Beispiel geschweifte Klammern in JSX öffne und sagen wir, eine einfache Bedingung schreibe , ist fünf weniger als 10. In diesem Fall zeige bitte div an, was bedeutet, dass fünf kleiner als 10 ist. Andernfalls zeige ein anderes Div an, das etwas anderes sagt. Was Sie hier sehen, wird als bedingtes Rendern bezeichnet. Ist im Grunde genau das, was wir hier machen. Anstatt hier einfach nur Zeichenketten zu verwenden, können wir einfach so JSX-Markup schreiben , und irgendwann sieht alles so aus. Aber wir brauchen kein JSX-Markup, wir brauchen einfache Zeichenketten, also belassen wir es so. Nun, was ist mit Draw? Was ist die Logik für die Anzeige von Draw? Wir müssen wissen, dass alle Felder auf dem Spielfeld belegt sind und wir keinen Gewinner haben. Um den booleschen Wert zu erhalten , der angibt, ob wir keine freien Quadrate auf dem Brett haben, erstellen wir eine weitere Variable, da es sich wiederum um einen abgeleiteten Zustand handelt. Wir nennen es „Keine Züge mehr“. Es wird die Methode squares.every.. every sein , die Methode , die als Löschen bezeichnet werden kann. Es wird entweder wahr oder falsch zurückgegeben. Wir leiten den Rückruf an alle weiter. Dieser Callback wird für jedes Element innerhalb eines quadratischen Arrays ausgeführt . Wenn jeder Callback, wenn der Callback für jedes Element den Wert true zurückgibt, dann wird der endgültige Wert irgendwann wahr sein. Wenn mindestens ein Callback False zurückgibt, der Endwert falsch. Das ist im Grunde der Name jeder. Der Callback hat genau die gleichen Argumente wie die Map-Methode. Zuerst haben wir das Element , das in unserem Fall der Quadratwert sein wird . Das ist genug, wir brauchen keinen Index und wir brauchen kein Array selbst. Wir prüfen einfach, ob der Quadratwert nicht gleich Null ist. Das überprüfen wir. Wenn nicht jeder Wert gleich Null ist, gibt die gesamte Bedingung den Wert wahr zurück. Wenn mindestens eine Quadratwurzel nicht Null ist, die gesamte Struktur, die gesamte Bedingung, den Wert Falsch zurück. Das ist genau das, wonach wir suchen. Jetzt nehmen wir einfach das Div und können hier mehrere Bedingungen anwenden. Wenn wir einen Gewinner haben, können wir etwas ausstellen. Hier ist der Trick, wie wir auch bedingtes Rendern anwenden können . Wenn wir einen Gewinner haben, können wir ein logisches Ende verwenden und dann jede gewünschte JSX anzeigen. Dies ist auch bedingtes Rendern und dies ist eine Alternative zum Schreiben. Wenn wir einen Gewinner haben, zeigen Sie dies an, andernfalls zeigen Sie bitte Null an. Wenn Sie sich erinnern, wird Null zu nichts ausgewertet und irgendwann wird nichts angezeigt, aber es könnte mühsam sein, jedes Mal zu schreiben, deshalb wählen die Leute normalerweise diese Art, Dinge zu schreiben. Aber du musst vorsichtig sein. Dieses Ding hier, wenn Sie nach der Bedingung suchen, muss es sich um einen booleschen Wert handeln. Wenn es kein boolescher Wert sein soll sondern etwas, das wahr ist, zum Beispiel Null, wird Null angezeigt. Null wird als falscher Wert betrachtet , dies ist jedoch kein boolescher Wert. Der Operator und funktioniert also nur, wenn diese Bedingung genau falsch zurückgibt. Wir müssen sicherstellen, dass dieser Wert boolesch ist, wenn Sie diesen Ansatz mit logischem Ende verwenden möchten . In unserem Fall ist der Gewinner bereits ein boolescher Wert, also müssen wir das nicht tun. In Zukunft werden Sie jeden Fall auf diese Situation stoßen, wenn Sie sich daran erinnern werden, insbesondere wenn Sie es mit einem Rennen und Daten zu tun haben, die von APIs stammen. Unsere Logik besteht darin, wie folgt zu sein. Wenn wir einen Gewinner haben, möchten wir den Gewinner als Gewinner anzeigen. Ich kopiere es einfach und lege es hier ab. Dann können wir hier ein weiteres bedingtes Rendern anwenden und sagen, wenn wir keinen Gewinner und keine Züge haben, können wir etwas anderes anzeigen. Wenn ich es speichere, wird es automatisch formatiert. Wir werden am Ende eine solche Struktur haben. Dann haben wir eine weitere Bedingung, in der wir keinen Gewinner haben und wir haben keine Knoten, die sich nach links bewegen. Aber dieses Ding sieht nicht hässlich aus, aber es könnte sehr unpraktisch und manchmal sehr schwer zu lesen sein. Anstatt das zu tun, können wir es besser lesbar schreiben. Wenn Sie sich also erinnern, was wir in der Board-Komponente gemacht haben, haben wir diese quadratische Renderer-Funktion erstellt , von der wir das JSX-Markup zurückgeben. Hier können wir genau den gleichen Ansatz anwenden und die Bedingungen für bedingtes Rendern in diese Funktion schreiben . Hier werden wir es erzählen. So etwas wie eine Statusmeldung rendert, okay? Diese Funktion akzeptiert nichts als Argumente, weil wir uns hier mit keinen Argumenten befassen. Wir erhalten Zugriff auf alle Daten, die wir im oberen Bereich haben. Hier werden wir nur fragen. Wenn wir einen Gewinner aus dieser Funktion haben, geben wir Gewinner als Gewinner zurück. Dann fragen wir, ob wir keinen Gewinner haben und wir keine Züge mehr übrig haben. Das bedeutet, dass wir ein Unentschieden haben, in diesem Fall zeigen wir die Höhe Null und x an. Ansonsten können wir technisch gesehen eine weitere Bedingung hinzufügen, zum Beispiel wenn wir keinen Gewinner haben und keine Züge mehr übrig haben In diesem Fall gehen die Spiele weiter und wir zeigen an, dass der nächste Spieler der nächste Spieler ist, so. Wir können es jedoch wie eine Standard-Rückgabeanweisung diese Funktion machen, weil es keinen Sinn macht, dies anzuwenden, weil dies die letzte ist und dann definitiv nur ausgelöst wird , wenn diese beiden fehlschlagen, also müssen wir es hier nicht wirklich überprüfen oder wir können es tun, lassen Sie es uns so belassen, lassen Sie uns nach dieser Bedingung suchen und unter Wenn wir in diesem Fall keine IF-Bedingung haben , die uns zufrieden stellt geben wir nichts zurück, nur für den Fall, dass bei uns etwas schief geht. Dies wird jedoch niemals passieren. Lass es uns in Div verpacken. Der nächste Spieler wird der nächste Spieler sein, wir brauchen kein Dollarzeichen, wir brauchen eigentlich nichts mehr, wir haben nur eine Render-Statusmeldung und statt all dieser seltsamen Konstruktion können wir einfach die Render-Status-Nachrichtenfunktion aufrufen. Jetzt sieht es viel lesbarer aus, nicht wahr? Wir kehren zu unserem Spiel zurück und sehen, dass der nächste Spieler da ist, was richtig ist Lass uns weitermachen und einen Gewinner erstellen und alles funktioniert wie erwartet, aber lass uns weiter gehen und eigentlich keinen Gewinner haben, naja, das ist schwer. Das ist nicht schwer, also wie Sie jetzt sehen können, sind alle Felder mit irgendwas belegt, aber Sie haben keinen Gewinner und irgendwann haben wir Null und X unentschieden, genau das, was wir gemacht haben, was großartig ist. Lassen Sie uns nun weitermachen und das stylen, denn Sie können sehen, dass wir diese Styles-Datei von Anfang an hier haben, aber wir haben nicht viel dagegen weil wir mit all diesen Funktionen beschäftigt waren. Lassen Sie uns also weitermachen und diese Statusmeldung stylen, Lassen Sie uns also weitermachen und diese Statusmeldung stylen da wir unsere Styles hier bereits haben. Wenn wir uns die Geschichte genauer ansehen, werden wir uns in Zukunft damit befassen, wir haben hier die Statusnachrichtenklasse definiert, großartig, also gehen wir hier zur Statusnachricht und zu diesem Wrapping-Element zu div. Lassen Sie uns eine Statusmeldung für den Klassennamen hinzufügen, wenn wir speichern, haben wir schon so, wir haben einen Rand, vielleicht machen wir daraus ein H2-Element, wie es zuvor war, aber eigentlich wird sich nichts wirklich ändern, weil wir die Schriftgröße haben, die hier eingestellt ist, großartig. Gehen wir jetzt los und fügen hier etwas hinzu , denn wie Sie sehen können, die Span-Elemente, die seit einer Statusmeldung gehen , auch die Schriftstärke normal, da ist wahrscheinlich, dass ich beabsichtigt habe, dass es dieses H2-Tag ist. Außerdem haben wir hier Klassen, Text grün und Texte orange, die wir auf unsere X- und Zero-Spieler anwenden können, also was ich tun werde, werde ich so machen, also für diese Null und X, die wir hier haben, können wir sie in solche Span-Elemente einwickeln, und zu diesem Span-Element können wir tatsächlich Pluspunkte hinzufügen. X wird grün sein und Null wird orange sein, also fügen wir die grünen Tags für x hinzu, für Null fügen wir den Plusnamen des Textes Orange hinzu, jetzt sieht es so aus, ziemlich cool. Als Nächstes müssen wir, wenn wir den nächsten Spieler haben, Stile irgendwie bedingt anwenden, nun, das , Stile irgendwie bedingt wenn wir den nächsten Spieler haben, Stile irgendwie bedingt anwenden, ist etwas Neues, über das wir noch nicht gesprochen haben, also müssen wir Klassen irgendwie bedingt anwenden. Auch hier werden wir den nächsten Spieler in die Spanne packen und den nächsten Spieler hier anzeigen, aber jetzt müssen wir auch dynamisch Klassen auf der Grundlage des Spielers anwenden, also für die Spanne geben wir den Klassennamen weiter und anstatt nur eine Zeichenfolge zu übergeben, übergeben wir einen JavaScript-Ausdruck, also verwenden wir dafür wieder Klammern und hier sind wir werde fragen. Wenn Xnext ist, wenden wir in diesem Fall die grüne Textklasse an, andernfalls wenden wir die orangefarbene Textklasse an. Da es sich also um ein JavaScript handelt, können Sie jede verfügbare Methode verwenden, um die Zeichenfolge irgendwie zu transformieren, anzuwenden, zu kombinieren , zu verketten, und schließlich wird sie hier als Zeichenfolge für den Klassennamen ausgewertet, also schauen wir mal. nächste Ebene ist Null und sie ist tatsächlich orange und während wir das Spiel spielen, können Sie sehen, wie sich die Farben ändern und die Farben funktionieren, was erstaunlich gut funktioniert. Am Ende haben wir also auch den Gewinner als Gewinner, also die gleiche Logik wie hier, wir werden uns für den Gewinner bewerben. Gewinner ist Gewinner, aber dieses Mal fragen wir, ob Gewinner gleich x ist, nur dann verwenden wir die Tags grün, sonst text, orange, lass uns schnell überprüfen, großartig, Gewinner ist x. Vielleicht eine Sache, die wir hier hinzufügen können und die für die Zukunft nützlich sein könnte und für uns jetzt ist, dass Sie jetzt sehen können, wann immer wir etwas anzeigen wollen, es ist immer in ein Element eingewickelt, in diesem Fall in ein H2-Tag, in div, aber was ist, wenn ich hier kein Div löschen, überhaupt kein Div anzeigen möchte ? Was ist, wenn ich nur Winner is anzeigen möchte, wie es mit dem span-Tag ist, ohne das in ein Div zu packen, weil wenn Sie Markup öffnen, es in das Div eingeschlossen ist, was ist, wenn ich das nicht tun möchte? Ich möchte nur Winner is und span ohne Div anzeigen , wie direkt in H2. In diesem Fall können wir etwas verwenden, React-Fragmente genannt wird, also ist das React-Fragment im Grunde nur ein leeres Element Wenn ich also das Div entferne und wenn ich React.Fragment eintippe, also importiere React aus React, weil jetzt der React-Namespace im Grunde eine Komponente ist, aber er ist wie eine leere Komponente, nur ein Platzhalter. Wenn ich React Fragment überall hier verwende, aktualisiere ich die Seite, ich spiele das Spiel, ich öffne Markup, ich öffne Markup, hier wird nichts gerendert, außer dass der Gewinner ist, entschuldigen Sie , außer dass der nächste Spieler in Span ist, ich hatte kein Wrapping-Element. Auch hier stellt das React-Fragment im Grunde ein leeres Element dar, aber das React-Fragment ist eine sehr breite Syntax und es ist gut zu wissen, dass Sie es immer verwenden können React-Fragment hat jedoch eine leichtere Syntax. Wenn Sie es entfernen und Ihre Klammern einfach so leer lassen, ist dies eine Kurzversion des React-Fragments. Wir können den React-Namespace von hier entfernen und React-Fragmente überall und einfach so leere Klammern behalten und es wird funktionieren, also das ist auch das React-Fragment, aber das ist eine kurze Syntax davon ohne explizit React.Fragment zu sagen, zögern Sie nicht, jede zu verwenden, ich bevorzuge diese Syntax, weniger Code, desto besser. jetzt sind wir mit den Statusmeldungen für immer fertig, also lasst uns weitermachen und unsere Nachrichten übertragen, entschuldigen Sie mich, unsere Änderungen, denn nun, wir haben viel getan, wir haben über bedingtes Rendern gesprochen, wir haben über bedingte Stile, dynamische Stile, dynamische Klassennamen gesprochen und wir haben auch die Auslosungsnachricht angezeigt, großartig. Jetzt habe ich bereits alles zum Stitch-Status hinzugefügt, diesmal verwenden wir die VSCode-Benutzeroberfläche, also klicke ich hier auf das „Plus“ -Zeichen, um alle Änderungen zu speichern, jetzt sind sie alle in Phase und wir können hier eine Nachricht eingeben und auf Commit drücken, aber ich bevorzuge es, alles manuell auszuwählen, aber ich möchte, dass es in Staging ist und dann manuell git commit und determine eingeben. Nachricht übertragen wird diese Komponente abspielen oder ja, Nachricht anzeigen, Nachricht anzeigen, Stile anwenden oder Statusnachricht , und das war's. Im nächsten Video werden wir mit der Spielhistorie beginnen, wir werden darüber sprechen, wie wir diese Spielhistorie-Funktion, die wir nutzen können, einführen können, das wird Spaß machen. Wir sehen uns dort. 50. 11 Implementierung von Spielverlauf: hallo. In diesem Video werden wir über die Geschichte des Spielens sprechen. Im letzten Video, das wir über Game Draw gesprochen haben, werden die Nachrichten , die hier oben erscheinen, angezeigt. nächste Spieler ist, wir haben einen Gewinner, wir haben ein Unentschieden, was unglaublich ist, aber dieses Mal werden wir über die Spielgeschichte sprechen , sodass wir auf jeden Zug klicken können , den wir gemacht haben, und dann durch die Geschichte reisen können. Um das zu erreichen, müssen wir unseren Staat tatsächlich transformieren. So wie wir derzeit einen Spielstatus verwalten, tun wir das, indem wir Quadrate und isxNext-Zustände verwenden. Das ist in Ordnung und wir werden es auch weiterhin so handhaben. Wir werden jedoch seine Form leicht ändern. Da Geschichte etwas ist, an das wir uns erinnern müssen weil wir sie durchqueren können, müssen wir sie irgendwie in eine Reihe verwandeln. Lass mich Paint öffnen und dir zeigen wie genau wir den Gaming-Status repräsentieren werden. Da es sich um eine Geschichte handelt, wird es eine Reihe von Elementen geben. Es wird ein Array sein und innerhalb dieses Arrays wird jedes Element ein Objekt sein. Es wird im Grunde ein Array von Objekten sein und jedes Objekt in diesem Array hat zwei Schlüssel, Quadrate und isxNext. Jedes Objekt in diesem Array repräsentiert den Zustand des Spielbretts zum Zeitpunkt unseres Zuges. Um den Überblick über die Züge zu behalten, die wir im Spiel machen, unserem CurrentMove, benötigen wir einen Zähler. Wir müssen irgendwie verfolgen, was unser CurrentMove ist , damit wir in dieser Geschichte reisen können. Wenn wir auf ein Historienelement klicken, sagen wir, wir gehen zu Zug Nummer 1, gehen wir tatsächlich zu Zug Nummer 1 und unser CurrentMove wird geändert. Dafür brauchen wir einen anderen Staat, der das nachverfolgt. Lassen Sie uns weitermachen und sehen wie das in der Realität aussehen wird. Hier oben in der App erstelle ich einen neuen Status , den wir history und setHistory nennen werden, und das muss ein Array sein. Standardmäßig haben wir bereits den Spielstatus, der leer ist, genau wie hier in den Zeilen 11 und 12. Wir erstellen ein leeres Array mit einem Objekt darin, und standardmäßig sind es Quadrate, was ein Array von neun Elementen sein wird was ein Array von neun Elementen sein , die mit Nullen gefüllt sind, und dann wird isxNext falsch sein, genau wie wir es hier haben. können wir getrost entfernen. Dann erstellen wir einen weiteren Status , der unseren CurrentMove darstellt . Wir machen weiter. Wir erstellen CurrentMove und setCurrentMove. Standardmäßig ist unser CurrentMove Null. Unser Zähler wird auf Null basieren. Großartig. Jetzt können wir sehen, seit wir alles geändert haben, wir haben hier viele Fehler. Lass uns das ändern. Wie können wir den neuesten Stand des Spielbretts abrufen, den wir hier haben? Wir können eine weitere Variable erstellen, die unser abgeleiteter Wert aus den Zuständen History und CurrentMove sein wird . Wir können es, sagen wir, GamingBoard nennen. Das wird Geschichte sein und unser CurrentMove. Eigentlich wird es uns dieses Objekt für unseren CurrentMove geben . Anstatt hier nur Quadrate zu analysieren, geben wir GamingBoard.Squares weiter. Sie können sehen, dass ich dafür sogar den IntelliSense habe. Fantastisch. Nun, handleSquareClick, wir werden das in einer Sekunde berühren. Gehen wir hier zur Statusmeldung. Moment analysieren wir zwei Requisiten, isxNext und Squares. Jetzt ist alles unter einem Objekt zusammengefasst. Wir können das Objekt einfach an die Statusmeldung übergeben. Was ich tun werde, ich werde GamingBoard einfach direkt zur Statusmeldung analysieren. Ich werde diese beiden Requisiten entfernen. Ich werde hier die Statusmeldung öffnen. Da ich GamingBoard analysiere, , anstatt isxNext und Squares zu destrukturieren werde ich GamingBoard verwenden, anstatt isxNext und Squares zu destrukturieren. Ich werde GamingBoard hier destrukturieren. Jetzt muss ich GamingBoard.Squares, GamingBoard.isxNext und auch hier GamingBoard.isxNext eingeben GamingBoard.isxNext . Aber was ich tun werde, da GamingBoard nur ein Objekt mit zwei Tasten, Quadraten und isxNext ist , werde ich hier eine weitere Destrukturierung anwenden. Was ich vom GamingBoard-Objekt aus machen werde, ich werde Quadrate und isxNext destrukturieren . Eine kurze Erinnerung. Das ist dasselbe. Diese einzelne Zeile ersetzt uns jedes Mal, wenn wir GamingBoard.Squares like that und GamingBoard.isxNext schreiben GamingBoard.Squares like . Fantastisch. Wir haben uns mit der Statusmeldung befasst. Kümmern wir uns um alles andere. Um an Bord zu kommen, analysieren wir Quadrate. Jetzt haben wir GamingBoard.Squares, und jetzt müssen wir uns irgendwie mit HandleSquareClick auseinandersetzen. Nun, die Logik ist, dass wir eine Geschichte haben und wann immer wir einen neuen Zug entwickeln, wann immer wir das Spiel spielen, müssen wir unser Array erweitern. Wir müssen diesem Array neue Werte hinzufügen. Lassen Sie uns das in HandleSquareClick tun. Zuerst haben wir jetzt GamingBoard.Squares hier. Dann werden wir statt Set-Quadraten setHistory machen und wir werden in einer Sekunde zu dieser Logik zurückkehren. anstelle von setisxNext Was werden wir anstelle von setisxNext tun? Wir werden einfach unseren CurrentMove erhöhen. Immer wenn wir auf ein Quadrat klicken, wird der Zug, der Zähler erhöht. Wenn Sie sich an unser Beispiel aus früheren Videos zum Thema Zähler erinnern , ist dies genau der Fall. CurrentMove, und wir können es intern CurrentMove nennen. Wir haben diesen Namen hier jedoch bereits als unseren Bundesstaat, also nennen wir ihn einfach Move. Zug wird Zug plus 1 sein. Wir werden es einfach noch einmal erhöhen. Move wird unseren aktuellen Status für CurrentMove darstellen . In setHistory werden wir es statt CurrentSquares CurrentHistory nennen, und jetzt müssen wir die Historie irgendwie erweitern. Zuallererst müssen wir unseren aktuellen Spielstand kennen. Um das zu tun, müssen wir das neueste Element aus dem History-Array abrufen . können wir tun, indem wir tippen. Lassen Sie uns vielleicht die Variable lastGamingState nennen , die Geschichte sein wird , und wir holen uns das letzte Element, indem history.length minus 1 eingeben. Auf diese Weise können wir das neueste Element aus dem History-Array abrufen , das wiederum ein Objekt dieser Form sein wird. Was wir nun tun können, ist, wir tatsächlich einen neuen Status berechnen können dass wir tatsächlich einen neuen Status berechnen können, den wir dem History-Array hinzufügen werden. Wir haben hier bereits die Logik. Anstatt return setzen wir es in eine neue Variable namens NextGamingState. Anstelle von CurrentSquares verwenden wir LastGamingState.Squares und anstelle von isxNext werden wir LastGamingState.isxNext verwenden. Um nun den neuen Wert für den History-Status festzulegen, müssen wir von diesem Callback zurückkehren. Ausgehend von diesem Rückruf, dem, was wir tun werden, werden wir das, was wir gerade hier erstellt haben, NextGamingState, mit unserem aktuellen Geschichtsstatus verknüpfen. Wir können dafür die Methode array.concat verwenden. CurrentHistory.concat und wir werden hier ein neues Objekt vorstellen. Wir müssen ein Objekt dieser Form analysieren. Squares wird NextGamingState sein. Wir haben es NextGamingState genannt, nennen wir es NextSquaresState. Wir werden es so analysieren. isxNext wird wieder die Umkehrung eines Booleschen Werts sein, wie wir es zuvor getan haben, aber dieses Mal beziehen wir uns auf unseren latestGamingState, den wir hier haben, also latestGamingState.isxNext. Wir wenden Negation an, um den Booleschen Wert umzukehren , und alles wird jetzt auf magische Weise funktionieren. Gehen wir zurück und versuchen wir Konsolenprotokollverlauf und CurrentMove, beide, auszuprobieren, um zu sehen, was tatsächlich vor sich geht. Wir gehen zum Konsolenprotokollverlauf und zu CurrentMove. Übrigens protokolliere ich beide auf der Konsole im Objekt. Ich mache das nur nach meinen persönlichen Vorlieben. Auf diese Weise ist es einfacher , sie in der Konsole anzuzeigen. Es gibt keinen besonderen Grund dafür. Sie können sie einfach so auf der Konsole protokollieren , nacheinander. Wenn Sie sie jedoch auf der Konsole als Objekt protokollieren, ist es einfacher, sie anzuzeigen. Wir gehen zurück zum Spiel, wir inspizieren, wir sehen die Konsole, wir öffnen das Objekt. Wir haben CurrentMove, Null, wir haben History, das ist ein Array. erste Element ist dieses Objekt mit Nullquadraten. Lassen Sie uns nun das Spiel spielen und sehen, wie sich das ändert. Ich klicke mehrmals irgendwo und wenn ich diese öffne, kannst du sehen, dass unser CurrentMove-Index für den nächsten erhöht wurde und bei jedem nächsten Zug der Index erhöht wird. Wächst. Anfangs war es nur eine Reihe von Nullen innerhalb des ersten Elements, dann haben wir das Spiel gespielt, das haben wir dem History-Array hinzugefügt, dann haben wir erneut gespielt, wir haben mehr Elemente zur Historie hinzugefügt, sodass wir es auf diese Weise verfolgen können. Die Frage ist nun, wie können wir es tatsächlich anzeigen? Da wir ein Array haben, ist das sehr einfach. Wenn wir zur App-Komponente zurückkehren, müssen wir sie hier irgendwie anzeigen. Ich schlage vor, eine weitere Komponente im Ordner der Komponente zu erstellen , die wir History nennen werden. Dies wird ein Bestandteil der Geschichte von Yan sein. Wir werden es standardmäßig aus History JSX exportieren. Vorerst wird es nur eine leere Funktion sein. In der App werde ich den Verlauf aus der Komponentenhistorie importieren . Ich werde nach unten scrollen und diese Verlaufskomponente unter Bord rendern . Ich speichere es, und jetzt wollen wir in der Historie irgendwie alle Schritte anzeigen, die wir gemacht haben. In der Realität sieht es so aus. Wenn Sie ein Array von Elementen haben, möchten Sie normalerweise, dass jedes Element etwas im Markup darstellt. Wenn wir zum Beispiel eine Liste von Früchten haben, die als Array dargestellt werden, sagen wir Apfel, Kiwi und etwas anderes in React, sieht das normalerweise so aus. Sie nehmen ein Array von Elementen und ordnen jedes Array-Element dem JSX-Markup zu. Diese Apfelzeichenfolge wird in div umgewandelt, wodurch diese Apfelzeichenfolge angezeigt wird, und dasselbe gilt für die übrigen Elemente. An die Geschichtskomponente übergeben wir unser History-Array als History-Requisite. In der Geschichte können wir es stützen, indem wir das Objekt verwenden, das vom Requisiten ablenkt. Von der Komponente aus kehren wir zum JSX-Markup zurück, die umschließenden Elemente sind div, und dafür verwenden wir ein geordnetes Listenelement. Hier müssen wir jedes Array-Element in unserer Geschichte dem JSX-Markup zuordnen. Ich öffne geschweifte Klammern, um JavaScript in JSX zu interpolieren. Ich werde history.map machen. Jetzt, vorerst ohne zusätzliche Logik, die div anzeigen wird, also von d.mapcallback, ich auch JSX-Markup zurück und sage hier Hallo. dich jetzt nicht um die rote Nachricht, wir können sie in einer Sekunde anhängen. Speichern wir es einfach und schauen wir, was wir haben. Wir haben Hallo. Wir haben das Spiel gespielt und Sie können sehen, dass jedes unserer Array-Elemente tatsächlich dem entsprechenden Div innerhalb von HTML zugeordnet ist . Da wir sechs Elemente haben, wurde jedes Element hier dem Div zugeordnet. Mir ist übrigens gerade aufgefallen, dass wir auch etwas falsch gemacht haben, weil wir hier nur diese anzeigen. Lass uns sehen. Ich habe irgendwie die Logik geändert. Lassen Sie uns schnell überprüfen , ob es funktioniert. Großartig. Ich habe davon gesprochen, dass jedes Array-Element dem entsprechenden Div zugeordnet ist. Das haben wir mit der Methode.map gemacht. Sie haben jedoch bereits bemerkt, dass in der Konsole eine Warnung angezeigt wird, und wenn ich den Mauszeiger hier bewege, wird es dasselbe sein, Schlüsselstütze für das Element im Iterator fehlt. Die Sache ist, wenn Sie.map innerhalb des JSX-Markups verwenden , um das Array-Element JSX zuzuordnen, müssen Sie immer die Schlüsseleigenschaft für die JSX-Elemente übergeben , die zugeordnet werden. Der Grund dafür ist, dass React intern jedes Element verfolgen muss , das Sie dem JSX-Markup zugeordnet haben, falls es in Zukunft geändert wird. Der Grund dafür ist , dass dieses Array dynamisch ist jedes zugeordnete JSX-Element innerhalb dieses Arrays eindeutig dargestellt werden muss. Um zu helfen, eindeutig dargestellt zu reagieren und jedes Array-Element eindeutig zu identifizieren, müssen wir die Schlüssel-Requisite übergeben und die Schlüssel-Requisite muss für jedes Element eindeutig sein. In unserem Fall ist jedes Array-Element ein Objekt, Quadrate und IsNext-Schlüssel, sodass wir hier nichts Besonderes haben. Was wir in einfachen Fällen tun können, wir können einfach einen Array-Elementindex als Schlüssel übergeben , weil er für jedes Element eindeutig ist, weil er für das erste Element Null ist, für das zweite, eins usw. Es identifiziert das Element in diesem Array eindeutig. Es wird für unseren Fall ausreichen. Wir werden uns diesen Index hier holen. Zuerst haben wir das Objekt mit den Quadraten und isNext. Wir brauchen es nicht, aber wir müssen es trotzdem definieren, weil wir sonst den Index nicht abrufen können , der als zweites Argument dient. Da wir kein Objekt verwenden werden, das es Unterstrich nennen wird, und wir werden den Index abrufen. Für den Schlüssel werden wir den Index einfach so übergeben. Wenn ich es speichere, wenn ich es aktualisiere, können Sie sehen, dass jetzt alles beim Alten geblieben ist, aber wir haben keine Probleme mehr mit dem Schlüssel, da jetzt jedes Element innerhalb des Arrays eindeutig identifiziert ist. Jetzt haben wir hier den Index, und wir können ihn auch innerhalb des Div interpellieren und diesen Index anzeigen. Was wir hier sagen können, ist der Index. Mal sehen, was haben wir? Wir haben Zug ist eins, Zug ist 2, 3 und 4. Großartig. Bisher sieht es ziemlich gut aus, aber zunächst möchten wir nicht anzeigen, dass Bewegung Null ist. Wir wollen so etwas wie ein neues Spiel anzeigen oder das Spiel starten. Wir werden hier bedingtes Rendern anwenden. Anstatt das zu tun, werden wir fragen, ob der Index gleich 0 ist, dann werden wir den Text für das neue Spiel wie diesen anzeigen. Andernfalls öffnen wir Backticks und sagen, geh zum Verschieben des Hashtags. Hier werden wir den Index anzeigen. Mal sehen, wie das aussieht. Wenn ich die Seite aktualisiere, haben wir standardmäßig ein neues Spiel. Wenn ich das Spiel spiele, können Sie sehen, dass wir jetzt viel sauberere Ergebnisse haben. Aber statt eines neuen Spiels, lassen Sie es uns vielleicht nennen, gehen Sie zum Spielstart. Tatsächlich können Sie sehen, dass sie überhaupt nicht anklickbar sind. Lassen Sie uns dieses Div in ein Button-Element vom Typ a Button konvertieren , ich speichere es und jetzt sehen Sie, dass es kaputt ist. Wenn Sie sich jedoch erinnern, haben wir unsere Styles in styles.css. Für diese Geschichte können wir diese Klassen, die hier bereits geschrieben sind, tatsächlich anwenden . Zuerst haben wir History-Wrapper , den wir div history-wrapper zuweisen können. Dann haben wir die Geschichte selbst. Dies wird unser ungeordneter Listenverlauf sein. Dann wird in der Historie jedes Li-Element gestylt. Nun, eigentlich richtig, weil wir vergessen haben, dass es das Element sein muss. Anstelle der Schaltfläche geben wir hier li ein und verschieben die Schaltfläche hinein. Wir haben immer noch diese Nachricht für den Schlüssel, weil ich dir gesagt habe, dass der Schlüssel zugewiesen werden muss und nur an das Wickelelement weitergegeben werden darf. Die Schaltfläche befindet sich in diesem Element. Das Element selbst ist eine Lüge. Ich muss ihm den Schlüssel für das Li-Element übergeben . Jetzt speichere ich es. Wir haben hier auch die Klasse btn-move. Wir können diesem Button ClassName btn-move geben. Mal sehen, das Ergebnis. Sieht soweit ziemlich gut aus. Sie können sehen, dass es viel, viel schöner aussieht. Aber die Sache ist, dass wir jetzt nichts tun können. Wir müssen irgendwie die Traversing-Funktion hinzufügen. Die Logik, wo wir das tun werden, wird in App jsx platziert. Wir haben bereits den Status CurrentMove, der angibt, in welchem Schritt wir uns gerade befinden. Hier können wir eine Funktion erstellen, die unseren CurrentMove ändert. Wir werden diese Funktion moveTo nennen. Dieser MoveTo wird ein Argument erwarten. Nennen wir es Bewegung. Was wird es tun? Es wird nur den Status auf den Vorgang aktualisieren , der gerade bestanden wird. Immer wenn wir sie MoveTo nennen, sagen wir fünf, wird MoveTo fünf gesetzt. Jetzt geben wir einfach diese moveTo-Funktion als solche Requisite an die Geschichte weiter. In der Geschichte schnappen wir uns MoveTo. Hier können wir dieses MoveTo an das onClick-Ereignis anhängen. Für dieses Button-Element spezifizieren wir den onclick-Event-Handler. Wir übergeben eine Funktion, die moveTo mit dem Index dieser Bewegung aufruft. So etwas. Ich speichere es. Ich aktualisiere die Seite. Lass uns das Spiel spielen. Wir haben hier mehrere Züge. Immer wenn ich hier klicke, habe ich moveTo keine Funktion, das liegt daran, dass ich App jsx wieder nicht gespeichert habe. Lass es uns noch einmal versuchen. Ich spiele es, ich klicke auf „Moves“ und du kannst sehen der Spielstatus tatsächlich ändert. Es funktioniert wie erwartet. Um es jedoch benutzerfreundlicher zu gestalten, möchten wir unseren aktuellen Schritt hervorheben , an dem wir uns gerade befinden. Wir kehren zum Code zurück und hier in der Geschichte können wir erneut dynamische Klassen anwenden. Wenn wir uns Stile ansehen, haben wir hier eine aktive Klasse, die btn-move gegeben werden kann. Wir haben bereits die Klasse btn-move, aber sie ist für alle Elemente statisch. Jetzt öffnen wir geschweifte Klammern. Wir werden hier btn-move weitergeben. Wir werden diese Zeichenfolge in eine Zeichenkettenvorlage umwandeln, damit wir die Zeichenketteninterpolation anwenden können, wodurch wir JavaScript in dieser Zeichenfolge verwenden können. Hier werden wir eine sehr einfache Logik anwenden. Wenn index oder sagen wir, CurrentMove gleich Index ist, dann wird dieses Element aktiv und diese Kacheln werden angewendet. Wir geben eine aktive Klasse, andernfalls geben wir ihr eine leere Klasse. Aber wir haben CurrentMove hier nicht , also müssen wir es wieder als Original und in App jsx erhalten . Ich werde unseren CurrentMove gleich hier oben weitergeben. CurrentMove ist gleich CurrentMove. Sowas in der Art. Lass uns sparen und mal sehen. Nun, jetzt wird es tatsächlich grün. Lassen Sie uns das HTML-Markup untersuchen. Wir haben btn-move und wir haben eine aktive Klasse. Genau das, was wir geschrieben haben, weil der Index des ersten Elements Null ist und CurrentMove standardmäßig Null Dies ist unser Anfangszustand. Wir spielen das Spiel und Sie können sehen wie sich der Klassenname ändert und das neueste Element standardmäßig immer eine aktive Klasse hat. Aber wenn wir auf „Verlauf“ klicken, um es zu bereisen, können Sie sehen, wie sich ClassName ändert. Ziemlich cool. Sowas in der Art. Versuchen wir jedoch, das Spiel zu spielen. Gehe zu einem Zug und spiele dann das Spiel weiter. Du kannst sehen, dass hier einige seltsame Dinge vor sich gehen. Das Problem ist, dass unser Spielstatus nicht mit dem Schritt übereinstimmt, zu dem wir zurückgekehrt sind. Das ist problematisch. Was wir tun wollen, wenn wir durch die Geschichte reisen und wenn wir auf das Quadrat klicken, wollen wir die Geschichte überschreiben. Jetzt müssen wir hier eine weitere Logik hinzufügen , um das zu erreichen. Wir müssen erkennen, ob wir die Geschichte durchqueren , und wenn wir sie durchqueren, wollen wir sie überschreiben. Ansonsten wollen wir es so lassen, wie es jetzt ist. Kommen wir zurück zu App jsx und Insights Set History. Lassen Sie uns zunächst feststellen, ob wir eine Route durchqueren. können wir tun, indem wir die neue Variable isTraversing einführen. Die Logik wird die nächste sein. Wenn unser CurrentMove plus 1 nicht CurrentHistory.Length entspricht. Dann können wir versuchen, es auf der Konsole zu protokollieren und zu sehen, ob das stimmt und warum wir den aktuellen Zug plus 1 ausführen. Lassen Sie uns erneut einen CurrentMove trösten und protokollieren Sie history.length. Nennen wir es seine Geschichtslänge. Mal sehen, warum wir hier plus 1 hinzufügen müssen? Wenn ich „Konsole“ öffne und das Spiel spiele, siehst du, dass unsere Historienlänge immer plus 1 ist. Dann der CurrentMove , den wir haben. Dies liegt daran, dass die Mindestlänge der Historie eine ist , die hier von unserem Standardstatus festgelegt wird, während CurrentMove auf einem Index von Null basiert. Um das zu normalisieren, müssen wir zum aktuellen Zug plus 1 addieren, damit sie zueinander passen. Wir überprüfen einfach. Wenn „CurrentMove“ der Länge entspricht, die wir haben, dann wissen wir, dass wir uns im letzten Zug befinden und nicht die Geschichte durchqueren. Aber wenn wir nicht gerade bei unserem letzten Zug sind, dann durchqueren wir, so etwas in der Art. Jetzt müssen wir irgendwie auch unseren „LastGamingState“ ändern , denn wann immer wir unseren letzten Zug machen, verketten wir immer, wir fügen die aktuelle Spielhistorie am Ende des Arrays hinzu. Wenn wir jedoch überschreiben wollen, wollen wir die Historie erweitern, die sich zum Zeitpunkt dieses Schritts befindet. uns egal Zug Nummer drei und was auch immer darunter liegt, ist uns egal. Im Moment interessieren wir uns nur für Geschichte. Wir müssen hier die folgende Logik schreiben . Wir müssen es ändern. Wir können fragen, ob wir auf der Durchreise sind, in diesem Fall nehmen Sie bitte die aktuelle Historie bei aktuellem Zug. Andernfalls nimm das neueste Element aus dieser Geschichte. Die Logik mit „NextSquareState“ ändert sich nicht , und jetzt müssen wir hier, anstelle von Concat für die aktuelle Historie, anstelle von Concat für die aktuelle Historie, auch ein anderes Basisarray in Betracht ziehen , dem wir den neuen Status des Spielbretts zuordnen werden. Wir werden eine neue Variable erstellen und sie vielleicht so etwas wie base nennen. Hier werden wir noch einmal fragen, ob wir in diesem Fall bitte aus der aktuellen Geschichte herausschneiden , hier nur diese Elemente herausschneiden. „Gehe zum Spielstart“, „gehe zu Zug 1“, „gehe zu Zug 2“. Wir schneiden vom Nullindex zum aktuellen Historienindex von letzter plus 1. Andernfalls behalten Sie bitte den aktuellen Verlauf als Basisarray bei. Anstelle von Last wollen wir Last Gaming State verwenden, und anstelle von Current History möchte ich Base verwenden. Wir werden gleich auf diese Logik zurückkommen. Ich weiß, es sieht furchtbar aus, besonders bei all diesen Nestern. Aber schauen wir uns an, wie unser Spiel gerade aussieht. Wir reisen durch die Geschichte, alles ist gut. Wir sind im dritten Zug, und wenn ich die Geschichte überschreiben möchte, kann ich das jetzt tun. Sie können sehen, dass wir im Grunde den Rest der Geschichte streichen und ihn mit unserem neuen Schritt hier außer Kraft setzen. Einfach so. Es funktioniert reibungslos. Was ist nun mit der Logik hier? Auch hier wird slice verwendet, um einige Elemente aus diesem Array zu trennen, aus dem aktuellen History-Array. Wir haben vom ersten Element bis zum Index der aktuellen Historie von plus 1 aufgeschlüsselt . Wir nehmen einfach den Index geringsten Spielstatus, den wir haben, und fügen einen hinzu, weil wir auch hier den auf Null basierenden „CurrentMove“ haben. Könnte verwirrend sein, aber gehen Sie es einfach ein paar Mal durch und es wird Sinn machen. Es ist auf den ersten Blick nicht so einfach, aber es ist nicht allzu komplex, und Sie müssen nicht wirklich viel darüber nachdenken. Jetzt haben wir die Spielhistorie und es funktioniert erstaunlich gut. Wir können reisen, wir können die Geschichte problemlos überschreiben. Perfekt. Nun, es scheint, als hätten wir viel getan und wir haben tatsächlich viel getan. Lassen Sie uns das unnötige Konsolenprotokoll entfernen und sehen, ob wir hier etwas hinzufügen müssen. Vielleicht können wir hier eine Nachricht hinzufügen, so etwas wie den aktuellen Spielverlauf. Mal sehen, wie es aussieht. Es sieht so aus, was in Ordnung ist, und ich denke, das wird für dieses Video ausreichen. Lassen Sie uns versuchen, alles zu tun, was wir hier getan haben. Das ist eine Menge. Ich werde die App beenden, alles zur Stage hinzufügen und ich werde alles festlegen und ich nenne es Spielverlauf bearbeiten. Im Grunde ist das genau das, was wir gemacht haben. Wir haben diesen Zustand in ein Array umgewandelt. Wir haben unsere Logik geändert und alles an die neue Staatsform angepasst , die wir mit der Geschichte eingeführt haben. GIT commit hat Game History hinzugefügt. Fantastisch. Vielleicht fügen wir hier noch eine zusätzliche Sache hinzu. Es ist völlig unnötig, aber es wird uns für das zukünftige Video helfen, und ich werde Ihnen bis zum nächsten Video eine kleine Übung geben . Ich werde den Server erneut starten und was ich tun werde, ich werde das Array als Anfangszustand außerhalb der Komponente verschieben . Ich werde es hier erstellen und es neues Spiel nennen. Ich habe alles in Großbuchstaben geschrieben, weil dies die konstante globale Wertdefinition ist die konstante globale Wertdefinition die wir nicht ändern werden, und ich gebe ihr dieses Array so. Für den ersten Status werde ich ein neues Spiel bestehen. Ich kann es tatsächlich innerhalb der Komponente bewegen, aber es ist besser, es draußen zu lassen. Der Grund dafür ist , dass, wenn Sie sich daran erinnern, jedes Mal, wenn wir ein neues Zeilen-Rendern haben, JavaScript Inside ausgeführt wird, und wann immer JavaScript ausgeführt wird, alle neuen Variablen erstellt, und da ein neues Spiel etwas Statisches ist, das wir nicht bei jedem Zeilen-Rendern neu erstellen müssen, können wir es einfach nach draußen verschieben. Dies ist nur eine sehr kleine Optimierung, aber sie wird uns nur für GIT dienen. Warum haben sie das getan? Im nächsten Video, was wir tun werden, fügen wir eine Schaltfläche hinzu, auf die wir klicken und die das Spiel zurücksetzt. Hier ist eine kleine Übung für dich bis zum nächsten Video. Versuche es selbst zu machen. Erstellen Sie eine Schaltfläche, zeigen Sie sie irgendwo hier an, und wenn Sie darauf klicken, wird der Spielstatus auf den ursprünglichen Zustand zurückgesetzt. Auch hier spielst du das Spiel, du klickst auf die Schaltfläche, es aktualisiert den Status. Versuchen Sie, dies mit der neuen Spielvariablen zu implementieren , die wir außerhalb der Komponente erstellt haben . Ich werde das bestätigen und sagen, dass ich außerhalb der App-Komponente in einen neuen Spielstatus versetzt wurde , und ich werde alles auf Master pushen und im nächsten Video wird es uns helfen, das Spiel zurückzusetzen. Versuche Sport zu treiben. Wir sehen uns im nächsten. 51. 12 Hinzufügen des game: Hey, wie war deine Übung vom letzten Video? Hast du das geschafft? Mal sehen. In diesem Video fügen wir eine Schaltfläche hinzu, die unseren Spielstatus zurücksetzt. Lass uns gehen. Also hier oben im Markup, direkt über dem aktuellen Spielverlauf, fügen wir ein Button-Element vom Typ Button hinzu und teilen mit, dass ein neues Spiel gestartet wird. Wenn wir also darauf klicken, soll es etwas tun. Wir werden den onClick-Handler hier platzieren, und für dieses onClick-Ereignis werden wir onNewGameStart angeben, und dass onNewGameStart eine Funktion sein wird, die wir hier und jene Funktion erstellen werden, das einzige, was es tut, es wird nur den Status aktualisieren. Im vorherigen Video haben wir ganz am Ende das neue Spiel an die Außenseite der Komponente verschoben , und das wird uns jetzt helfen. Jetzt können wir tatsächlich anrufen, Verlauf festlegen und wir können ein neues Spiel bestehen, was unser Ausgangszustand ist. Neben der Historie müssen wir auch den Zähler für unseren aktuellen Zug zurücksetzen. Wir werden weitermachen und „ Aktuelle Bewegung setzen“ aufrufen und auf Null zurücksetzen. Mal sehen. Wenn ich es speichere, spiele ich das Spiel, ich klicke auf „Neues Spiel starten“. Alles wurde jetzt aktualisiert. Es ist jedoch ungestylt und wenn wir uns das Style-CSS ansehen, haben wir hier die Klasse.btn-reset. Lass uns weitermachen und es benutzen. Für diese Schaltfläche übergebe ich also den Klassennamen und ich übergebe btn-reset. Aber wenn du siehst, gibt es hier auch die aktive Klasse. Was ich tun wollte, als ich diese aktive Klasse eingeführt habe , war, dass diese Schaltfläche immer dann aktiv wird, wenn wir einen Gewinner haben . Also werden wir hier die Logik innerhalb des Klassennamens anwenden. Da wir wieder JavaScript anwenden werden, verwenden wir geschweifte Klammern und zunächst wird dies eine Zeichenkettenvorlage mit Backticks sein. Wir geben ihm die statische Klasse btn-reset und dann öffnen wir Anführungszeichen für die Zeichenketteninterpolation und innerhalb dieser geschweiften Klammern für die Zeichenketteninterpolation werden wir fragen. Wenn wir also einen Gewinner haben, geben Sie ihm bitte eine aktive Klasse, andernfalls lassen Sie es leer. So etwas und jetzt mal sehen. Wir haben also diesen hübschen Button hier und wenn wir das Spiel spielen und loslegen und einen Gewinner haben, und wann immer wir einen Gewinner haben, wird dieser Button aktiv. Wenn wir die Geschichte durchqueren, funktioniert alles wieder wie erwartet. Sieht gut aus. Das war's für den Button-Reset. Wie Sie sehen, ist das nicht kompliziert, also lassen Sie uns weitermachen und es festlegen. Ich werde diese Änderungen dem Status Phase hinzufügen und mich dann verpflichten. Commit-Nachricht wird hinzugefügt, um das Spiel zurückzusetzen oder ein neues Spiel zu starten. Fantastisch. Ich schiebe alles auf GitHub und wir sehen uns im nächsten Video. 52. 13 Hervorheben des game (Gewinnkombination): Hallo zusammen. Was werden wir in diesem Video tun? Wir können die Gewinnkombination anzeigen falls wir einen Gewinner haben, und auch, aber wir ändern die Farbe der Quadrate, da sie jetzt schwarz sind. Lassen Sie uns jetzt vielleicht zuerst mit Farben beginnen. Wenn wir zum Komponentenquadrat gehen, wird die Logik hier so ziemlich dieselbe sein , wie wir sie in der Statusmeldung haben. Wenn Sie sich erinnern, haben wir hier den dynamischen Klassennamen angewendet. Wenn der Gewinner X ist, ist der Text grün, andernfalls ist der Text orange. Die Klassen, die wir hier innerhalb von Styles definiert haben, geben im Grunde nur die Farbe dem Element, das hier durch die SAS-Variable definiert ist. Hier im Quadrat konvertieren wir es einfach in einen JavaScript-Ausdruck. Wir werden Anführungszeichen von doppelten Anführungszeichen zu Backticks ändern . Ich werde weitermachen und fragen, ob unser Wert X ist, dann werden wir Text grün anzeigen, andernfalls werden wir Text orange anzeigen. Einfach so, nichts Kompliziertes. Sie können jetzt sehen, dass alles in ein wunderschönes Farbsystem umgewandelt wurde . Wenn wir klicken, wenn wir spielen, funktioniert es. Großartig. Lassen Sie uns nun darüber nachdenken, wie wir die Gewinnfelder tatsächlich hervorheben können. Um Gewinnfelder hervorzuheben, müssen wir die Quadrate kennen. Wir müssen ihre Indizes kennen. Wir müssen wissen, dass, wenn wir Gewinner X für diese Gewinnkombination haben, wir Gewinnquadrate und Index 2 haben. Dann haben wir 0, 1, 2 , 3, Index 4 und Index 6. Das sind unsere Gewinnfelder. Wir berechnen den Gewinner in der Funktion „Gewinner berechnen und geben nur das Gewinnquadrat zurück, nur seinen Wert. Mit dieser Funktion können wir jedoch auch Gewinnfelder zurückgeben. Denn hier überprüfen wir jede mögliche Gewinnkombination. Wir haben bereits diese Variablen a, b und c, sie sind hier strukturiert stellen die Gewinnindizes dar, die Gewinnkombination. Mit dieser Funktion „ Gewinner berechnen können wir ein Objekt zurückgeben nicht nur Null oder den Gewinner. Wir können ein Objekt mit dem Gewinner und den Gewinnfeldern zurückgeben . Falls wir keinen Gewinner haben, wir jetzt Null zurück. Aber ändern wir es in ein Objekt. Wir geben Gewinner oder Null zurück, und die Gewinnquadrate werden ein leeres Array sein. Aber falls wir einen Gewinner haben , geben wir ein Objekt zurück, Gewinner wird das Quadrat c oder das Quadrat a oder das Quadrat b sein , es spielt keine Rolle. Aber für Gewinnfelder wir die Linien i zurück oder wir können sie tatsächlich so zurückgeben. Wir können ein neues Array erstellen und dann explizit angeben, dass wir a, b und c zurückgeben , oder wir können eine Zeile a, Zeile i, angeben. Jetzt kehren wir zu J6 zurück. Jetzt ist dieser Gewinner ein Objekt. Wenn ich markiere, wird mir auch ein Objekt angezeigt. Ich kann diese Struktur hier verwenden. Aus der zurückgebenden Objekt-ID-Struktur, Gewinnerschlüssel und den Gewinnquadraten. Gewinner und ein Gewinnquadrat. Jetzt können wir diese Gewinnfelder als Requisite an die Brettkomponente weitergeben und dort mit dieser Logik umgehen. Ich gebe die Gewinnfelder an das Brett weiter, und innerhalb des Bretts schnappe ich mir Gewinnfelder und die quadratische Komponente , die hier auftauchen würde. Ich kann eine Requisite übergeben , die angibt, ob dieses Quadrat ein Gewinnquadrat ist oder nicht, und dann etwas Logik innerhalb der quadratischen Komponente anwenden. Im Renderquadrat werde ich überprüfen, ob das Quadrat ein Gewinnquadrat ist. Ich erstelle nur eine Variable innerhalb des Renderquadrats und nenne sie Gewinnerquadrat. Gewinnfelder sind eine Reihe von Gewinnindizes. Wie 0, 1 und 2. Nehmen wir zum Beispiel diese Kombination. Wir müssen überprüfen, ob die Position dieses Quadrats innerhalb der Reihe der Gewinnquadrate liegt. Wenn das stimmt, dann wissen wir, dass das Quadrat Teil der Gewinnkombination ist. Wir können einfach WinningSquares.Includes überprüfen Dies ist ein Array, das die globale Methodenposition enthält. Das war's. Dann können wir dieses Gewinnquadrat weitergeben, während ich zur quadratischen Komponente heruntergehe. Wenn wir die quadratische Komponente öffnen, verschieben wir sie hierher. Innerhalb des Quadrats, seit wir bestanden haben, befindet sich das Gewinnfeld. Wir schnappen uns dieses Gewinnquadrat aus dem Requisitenobjekt. Hier können wir einen anderen dynamischen Klassennamen anwenden , der auf diesem gewinnenden quadratischen Boolean basiert . Die Methode dot includes wird als boolescher Wert zurückgegeben , der angibt, ob dieses Array dieses Element enthält. Wir haben hier bereits einen dynamischen Nachnamen basierend auf dem Wert angewendet. Wir können genau das Gleiche für sein Gewinnfeld tun. Ich werde diese Zeichenfolge einfach um eine weitere Interpolation erweitern diese Zeichenfolge einfach um eine weitere Interpolation und fragen, ob dies das Gewinnquadrat ist Bitte wenden Sie etwas ClassName an und etwas ClassName wird sein, wenn wir Styles öffnen, CSS, darin haben wir diese gewinnende Klasse. Diese Siegerklasse fügt die hier definierte skalierte Textanimation hinzu, die die Schriftgröße unendlich vergrößert. Gehen wir zurück zum Quadrat. Wenn es sich um ein Gewinnquadrat handelt, fügen wir die Gewinnklasse hinzu. Andernfalls hängen wir eine leere Klasse an. Mal sehen, ob es funktioniert und danach werden wir etwas mit dieser Folie machen , weil Sie sehen, dass sie gerade etwas chaotisch aussieht. Lass uns einen Gewinner haben. Bumm. In der Tat funktioniert es. Schau dir das an. Wir haben hier alles vorbereitet. Ziemlich cool, nicht wahr? Immer wenn wir die Geschichte durchqueren und zu den letzten Zügen zurückkehren , wird die Animation immer noch da sein. Wenn wir uns das Markup ansehen, haben wir jedem Quadrat, das Teil der Gewinnkombination ist, die Gewinnklasse zugeordnet . Ziemlich cool. Lassen Sie uns jetzt etwas mit dieser Zeichenfolge machen, weil sie ein bisschen chaotisch aussieht. Wir können eigentlich nicht viel dagegen tun. Wir können es in mehrere Variablen aufteilen und dann alles miteinander kombinieren, vielleicht so etwas wie colorClassName. Dann können wir diese Logik von hier aus einfach herausschneiden, sie so formulieren, dann können wir vielleicht etwas wie WinningClassName sagen und dann machen wir genau dasselbe. Wir haben diese Logik einfach herausgeschnitten und sie hier platziert. Anstatt diese Logik in der Zeile zu verwenden, wie wir es gerade getan haben, wird die Variable übergeben. Das wird ColorClassName sein. Wir interpolieren diesen Variablenwert innerhalb dieser Zeichenfolge und machen dasselbe hier, WinningClassName. Jetzt sieht es viel sauberer aus. Wir haben die Logik im Grunde in mehrere Zeilen aufgeteilt. Was auch immer du bevorzugst. Wenn Sie es etwas sauberer machen möchten , ist dieser Weg in Ordnung. Wenn es dir auf die chaotische Art gefallen hat, kannst du das gerne tun. So etwas haben wir die Gewinnkombination, sie wurde in der Spielhistorie hervorgehoben . Großartig. Ich denke, im nächsten Video werden wir die letzten Vorbereitungen treffen und ein paar Dinge mehr geben , vielleicht nur zusätzlichen Text, mehr Stile. Wir werden die App endlich für die Bereitstellung auf einem Hosting vorbereitet haben . Fantastisch. Bevor wir das Video beenden, entfernen wir nun Kommentare und Konsolenprotokolle und lassen Sie uns alles bestätigen. Sehen wir uns an, was wir gemacht haben, also haben wir die Berechnung geändert als die Rückgabe diesen Wert in ein Objekt mit zwei Schlüsseln, Gewinner- und Gewinnquadraten, zurückgab, dann geben wir diese Gewinnquadrate an Ihre Board-Komponente weiter. Innerhalb des Boards erkennen wir, ob das Quadrat, das wir durchlaufen haben, ein Gewinnquadrat ist, und basierend auf dieser inneren quadratischen Komponente wenden wir dynamisch Klassennamen an, um die Animation umzuschalten. So etwas. Lass uns gehen und alles begehen. Git füge das hinzu. Die Nachricht wird hervorgehoben und die Gewinnkombination wird hervorgehoben. Fantastisch. Lass uns alles vorantreiben. Bis zum nächsten, wir sehen uns dort. 53. 14 Endnote: hallo. In diesem Video geben wir unserer Anwendung vor dem Einsatz den letzten Schliff. Nun, wenn wir zu unseren Stilen gehen, genauer gesagt hier, zu body element, wenden wir diese Roboto-Schrift an, aber wir haben sie nicht wirklich auf unserem PC. Wir haben es nirgends. Woher kam es? Die Sache ist, dass es nicht wirklich angewendet wurde . Lassen Sie uns das reparieren. In dem Gast, den wir mit uns geteilt haben, haben wir hier einen HTML-Index mit einigen Eigenschaften. Wenn wir in unser Index-HTML schauen, haben wir diesen Link zu dem Stylesheet , das wir hier haben, nicht . Das Stylesheet, was es tun wird, es wird die Roboto-Schriftart von Google APIs herunterladen. Wir werden das einfach einbeziehen und in dieser Zeile, wenn wir die App aktualisieren, ändert sich nichts, weil wir den Dev-Server nicht ausgeführt haben. Ich betreibe den Server, ich gehe zurück zur App. Jetzt haben wir tatsächlich die Roboto-Schrift angewendet. Wenn ich diese Zeile entferne, sehen Sie, wie sich die Schriftfamilie ändert. Aber sobald wir die Schrift, die wir im Stylesheet angegeben haben, nicht laden , funktioniert alles. Großartig. Fügen wir nun den Titel oben zu unserer App hinzu. Hier in der App, direkt über der Statusnachrichtenkomponente, werden wir das einfache h1-Titel-Tag anzeigen und TIC TAC TOE mitteilen. Um es ansprechender zu gestalten, können wir die Farbe von TAC ändern. Wickeln wir es in ein Span-Element ein und geben ihm einen Klassennamen mit grünem Text. Speichern wir es. Jetzt sieht es viel besser aus, und ich denke, wir sollten die Eigenschaft font-weight bold wirklich aus dem aktuellen Titel mit der Spielhistorie entfernen die Eigenschaft font-weight bold . können wir tun, indem wir Inline-Styles anwenden. Nun, was großartig ist. Wir haben es nicht gehört oder wir haben es vorher nicht gesehen. Die einzige Möglichkeit, wie wir Stile in der App angewendet haben , war die Verwendung der Klassennameneigenschaft. Klassennamen werden hier in der SaaS-Datei definiert. Was ist jedoch, wenn wir keine CSS-Dateien oder SaaS-Dateien haben ? Wie können wir Stile anwenden? Nun, ohne React in nur einer HTML-Datei können wir zwei Arten von Stilen haben. Wir können Elementen Klassennamen geben, oder wir können Inline-Styles übergeben. Das Gleiche können wir hier in React tun. An diesen Spielverlauf können wir die Stileigenschaft übergeben und die Stileigenschaft muss ein Objekt sein. Wir müssen Stile mit JavaScript angeben, nicht mit CSS, sondern mit JavaScript. Wir werden CSS mit Hilfe von JavaScript schreiben, und das wird Inline-Styling genannt. Wir möchten die fett gedruckte Schrift aus dem Titelelement entfernen , das wir hier haben. Elementstil wird der normalen Schriftstärke entsprechen. Hier müssen wir die Schriftstärke einfach so normal übergeben. Mal sehen, ob es geklappt hat. Wenn wir das Element untersuchen, kann ich sehen, dass der Stil und die Schriftstärke normal sind. Dies sind Inline-Styles. Das JavaScript-Objekt , das wir hier übergeben wurde in diese Inline-Style-Zeichenfolge konvertiert. Sie können sehen, dass ich den Bindestrich zwischen Schrift- und Gewichtungswörtern nicht angegeben habe zwischen Schrift- und Gewichtungswörtern denn wenn Sie Inline-Styles angeben, müssen Sie die Kamel-Groß- und Kleinschreibung verwenden. Wenn Ihre Eigenschaft einen Bindestrich zwischen Wörtern oder Leerzeichen enthält, was auch immer, ersetzen Sie sie immer durch Kamelbraun. Zum Beispiel Schriftfamilie. Sie hätten eine Schriftfamilie in Camel Case Manier. So etwas. Lass uns die Inline-Styles woanders anwenden. Wenn wir zur Komponentenhistorie gehen, haben wir hier diese Schaltfläche, die dieses Element in der Liste darstellt. Machen wir es fett, wann immer es aktiv ist. Wenn wir Klassennamen öffnen, schauen wir mal, ob sie dort fett gedruckt sind. Eigentlich ist es mutig. Was wir hätten tun können, wenn wir keine Stile verwendet hätten, hätten wir Folgendes tun können, wenn wir in die Geschichte gehen. Hier hätte ich Style bestanden und spezifiziere, du siehst hier doppelte Klammern. erste Klammer gibt an, dass wir JavaScript in ihren Klammern verwenden werden , und die zweite in ihren Klammern bedeutet, dass sich um ein Objekt handelt, in das wir ein Objekt übergeben. Deshalb haben wir hier doppelte Klammern. Schriftgewichtseigenschaft, wir hätten fragen können, ob die aktuelle Bewegung dem Index entspricht, wird sie fett gedruckt, andernfalls normal. Wenn wir diese Klassen nicht hatten, lassen Sie uns sie entfernen und sehen, ob sie funktioniert haben. Wenn ich hineinzoome und das Spiel spiele, können Sie sehen, dass das Element, für das diese Bedingung zutrifft, fett dargestellt wird. Im Grunde genommen wird unser aktueller Schritt gewagt. Andernfalls ist die Schriftstärke normal. Wir benötigen es nicht für dieses spezielle Element , da dies bereits in CSS funktioniert hat. Sie können sehen, dass die Schriftstärke fett gedruckt ist, wenn sie aktiv ist, sodass wir hier keine Inline-Styles benötigen. Ich denke, das ist es. Ich würde sagen, wir sind mit unserer Bewerbung fertig. Wir haben alle Funktionen, wir haben all diese Stile. Alles funktioniert reibungslos und sieht toll aus. Fühlen Sie sich frei, alles zu modifizieren, fühlen Sie sich frei, Ihre eigenen Stile anzuwenden , damit zu spielen, es zu erweitern oder vielleicht etwas zu ändern. Es gibt keine strengen Anforderungen, dass dies speziell auf diese Weise geschehen muss. Du bist hier der Entwickler und du bist derjenige, der entscheidet. Wenn Sie den Titel hier ändern müssen, können Sie den Titel gerne ändern. Wenn Sie zusätzliche Metatags in den Kopf einfügen möchten, können Sie das gerne tun. Wir sind hier fertig. Dies ist der endgültige Status unserer App. Im nächsten Video werden wir über den Einsatz sprechen. Aber bevor wir dieses Video beenden, lassen Sie uns es zusammenfassen und alles festlegen. Ich öffne das Terminal, ich übernehme alles. Ich werde die Änderungen spezifizieren, die wir vorgenommen haben, also haben wir die Schriftart und den Titel hinzugefügt. Der TIC TAC-Spieletitel wurde hinzugefügt TIC TAC-Spieletitel und die Roboto-Schriftart hinzugefügt. Ich schiebe alles noch einmal auf GitHub. Wie immer, wir sehen uns im nächsten. 54. 15 Bereitstellung zum Überschwemmen: Hallöchen. In diesem Schritt haben wir unsere wertvolle App fertiggestellt. Es sieht wunderschön aus. Es hat alle Funktionen. Jetzt ist es an der Zeit, dass wir diese Anwendung mit der Außenwelt teilen. Wir wollen es im Internet veröffentlichen , damit wir den echten Link haben, die echte URL, die wir unseren Freunden geben können. Wie wir das machen können. Es gibt viele verschiedene Dienste , die unsere statischen Dateien kostenlos oder nicht kostenlos hosten können. Wir werden kostenlose Dienste nutzen. Aber die Frage ist, wie genau passiert das? Wann werden wir das im Paket Json definierte Build-Skript ausführen , erstellt vite unsere Anwendung und erstellt statische Dateien, HTML, CSS, JavaScript und Bilder, falls wir welche haben. Dann können wir diesen Ordner nehmen und ihn einem Hosting-Anbieter geben. Dieser Hosting-Anbieter stellt diese Dateien irgendwo auf seinen Servern bereit und stellt sie über eine automatisch generierte URL öffentlich zur Verfügung. Einer der Dienste , mit denen wir unsere Anwendung kostenlos hosten können , um unser HTML, CSS und JavaScript kostenlos zu hosten JavaScript kostenlos Er wird immer kostenlos sein und ist sehr einfach. Der Dienst heißt Surge. Sie können darauf zugreifen, indem Sie zu surge.sh gehen. Das Coole an Surge ist seine Einfachheit, Sie benötigen kein zusätzliches Setup. Was Sie tun müssen, Sie müssen nur das globale Surge-Paket installieren und dann mit dem Befehl Surge die App einfach so bereitstellen. Lass uns weitermachen und das tun. NPM installiert Global Surge. Ich werde es in mein Terminal einfügen. Es wird das globale Surge-Paket installieren. Es heißt, eine Sicherheitslücke mit kritischem Schweregrad. Nun, darüber musst du dir keine Sorgen machen. Wann immer Sie Sicherheitslücken sehen, kann dies ziemlich häufig vorkommen, insbesondere bei globalen Paketen. Nun, das ist das Problem des Pakets. Was können wir dagegen tun und was sind die Sicherheitslücken? Sicherheitslücken im Code , den wir aus diesem Paket herunterladen und er könnte bösartig sein. Aber du musst es nicht ernst nehmen. In der NPM-Welt wird das Paket meistens einmal am Tag, vielleicht zweimal am Tag aktualisiert . Aber Sie können nicht immer mit den Änderungen, mit den Updates Schritt halten. Sie werden mindestens einmal eine kritische Sicherheitslücke sehen. Ihre Optionen sind zunächst, nichts zu tun und auf die neueste Version zu aktualisieren und hoffen, dass der Paketautor die Sicherheitsanfälligkeit behoben hat. Die zweite Option besteht darin, dieses Paket nicht zu verwenden. In unserem Fall können wir nicht wirklich viel tun , deshalb machen wir mit. Jetzt haben wir das globale Suchpaket installiert und es heißt , dass wir den Suchbefehl ausführen müssen. Wenn ich das mache, werde ich aufgefordert, mich entweder anzumelden oder ein Konto zu erstellen. Ich gebe einfach meine E-Mail-Adresse und dann mein Passwort ein. Ich habe bereits ein Konto, also wird es mich anmelden. In Ihrem Fall wird Ihnen jedoch ein neues Konto erstellt. Jetzt fordert es mich auf , das Projekt zu starten, aber ich brauche momentan nichts. Also werde ich einfach Control C ausführen , um die Veröffentlichung meiner App zu stoppen. Zuerst müssen wir es bauen. Ich werde das npm run build-Skript und Vite wird den neuesten Build unserer App erstellen. Großartig. Jetzt ist es da. Es sieht verkleinert, verklammert und so ähnlich aus. Jetzt wollen wir den Ordner Dist nehmen und ihn für die Suche bereitstellen. Also verwenden wir den Suchbefehl und geben dann den Pfad zu dem Ordner an , den wir bereitstellen möchten , relativ zu unserer aktuellen Navigation. Seit unserer aktuellen Navigation Tictactoe-vite und unser Ordner befindet sich in diesem Ordner im selben Verzeichnis. Wir müssen nicht verrückt danach werden. Wir müssen nur den Ordnernamen angeben , den wir bereitstellen möchten. In unserem Fall ist dies ein Ordner namens Dist. Wenn ich das mache, starte ich einfach Search Dist. Es fragt mich nach der Domain. wenn Sie es auf Surge bereitstellen, wird es immer in einer Subdomain bereitgestellt. Es wird immer etwas Dot Surge Dot Sh sein. Sie können den Teil von surge.sh nicht ändern, aber Sie können eine eindeutige Subdomain auswählen, die derzeit nicht belegt ist. Standardmäßig generiert Surge automatisch eine Subdomain , die verfügbar ist, aber Sie können sie ändern. Lass uns vielleicht gehen und es tictacgame.surge.sh nennen. Ich wähle diesen Namen. In Ihrem Fall müssen Sie sich jedoch Ihre eigene Subdomain einfallen lassen , denn wenn Sie versuchen , eine Subdomain bereitzustellen , die bereits von einem anderen Surge-Benutzer genutzt wird, wird Ihnen die Erlaubnis verweigert oder so. Es wird Ihnen mitteilen, dass Ihre Anfrage abgebrochen wird. Stellen Sie also sicher, dass Sie etwas Einzigartiges auswählen und bleiben Sie dabei. Ich wähle tictacgame.surge.sh. Ich bereite es vor und jetzt ist es auf tictacgame.surge.sh veröffentlicht. Jetzt kann ich diesen Link nehmen und dorthin gehen. Wie Sie jetzt sehen können, ist meine App live. Es hat einen HTTPS-Link. Das bedeutet, dass das SSL-Zertifikat vorhanden ist. Es wird von Surge verwaltet. Darüber müssen wir uns keine Sorgen machen. Alles funktioniert. Sie können diesen Link jetzt verwenden und mit Ihren Freunden teilen. Schau dir das an. Wie cool ist das? Großartig. Nun, zum späteren Nachschlagen, möchten wir vielleicht den Bereitstellungsprozess vereinfachen. Was ist, wenn ich etwas ändern und dann erneut auf genau dieselbe Domain bereitstellen möchte ? In diesem Fall muss ich also meine neuen Änderungen vornehmen und neue Änderungen an der App vornehmen. Dann werde ich npm run build erneut ausführen, um neuen aktualisierten dist-Ordner zu erstellen, und dann muss ich surge dist ausführen und dieselbe Domain eingeben. Ich möchte es jedoch so einfach wie möglich machen. Warum erstellen wir also nicht ein weiteres Skript im Paket Json und nennen es deploy. Lassen Sie uns fortfahren und ein neues Deploy-Skript erstellen. Das wird zwei Dinge bewirken. Als Erstes wird der Befehl build ausgeführt, npm run build, und direkt danach können wir mit dem logischen AND-Operator den Befehl verketten, der nach npm run build ausgeführt wird. Also wollen wir Surge Dist und die Domain , die wir bisher haben, ausführen . Surge, der Name des Ordners , den wir bereitstellen möchten, dist und dann die Domain. Ja, ich kann es als Argument an den Surge-Befehl übergeben und es wird funktionieren. Surge wird verstehen , dass wir auf diesen Domainnamen zugreifen wollen . Wir können also HTTPS entfernen und nur diesen Domainnamen behalten. Wenn ich nun versuche, etwas zu ändern, vielleicht in der App, lassen Sie uns schnell überprüfen, ob es funktioniert. Also lasst uns Tic zu etwas anderem ändern, und jetzt führe ich npm run deploy aus. Sie werden sehen, dass es den Build-Befehl aufnimmt und direkt danach den Surge-Befehl. Es wurde bereitgestellt, heißt es, auf titacgame.surge.sh veröffentlicht. Wenn ich mich erfrische. sehen Sie neue Änderungen. Cool, oder? In Ordnung. Lassen Sie uns alles wieder hierher zurücksetzen und erneut einsetzen. Auch hier wurde ein neuer Build produziert. Auch hier wurde es bereitgestellt und erneut in dieser Subdomain veröffentlicht. Fantastisch. Das war's. Jetzt haben Sie unsere App online. Du kannst weitermachen und es mit der Welt teilen. Lassen Sie uns unser von uns eingeführtes Deploy-Skript übernehmen, git commit hat das Deploy-Skript hinzugefügt. Also herzlichen Glückwunsch, wir haben dieses ziemlich coole Spiel hier mit nicht so viel Aufwand entwickelt. Wir haben es im Surge Service veröffentlicht. Jetzt ist es im Internet verfügbar und es wird immer kostenlos sein. Es wird für immer kostenlos gehostet und jetzt können wir uns damit rühmen. Im nächsten und letzten Video über Tic-Tac-Toe werden wir zusammenfassen, was wir in diesen Videos genau gelernt haben, welche Konzepte wir verstehen was wir jetzt mit unserem Wissen anfangen können. Wir sehen uns dort. Herzlichen Glückwunsch zum Einsatz. 55. 16 Zusammenfassung: Hallo nochmal. In diesem Video werden wir kurz zusammenfassen was genau wir bisher im Tic-Tac-Toe-Spiel gelernt haben . Lass uns gehen. Wenn wir uns unsere Struktur ansehen, können wir bereits erkennen, dass wir wissen, wie man Vid benutzt. Wir kennen Frontend-Tools , mit denen unser Projekt erstellt werden kann. Wenn wir uns das JSON-Paket ansehen, können wir feststellen, dass wir auch etwas über das Hosting gelernt haben und wie wir die Anwendung kostenlos hosten können. Sie können in Google alle Hosting-Dienste auswählen , mit denen Sie statische Dateien, HTML, CSS und JavaScript hosten können, und sehen, wie Sie diese anwenden können falls Sie eine Alternative zur Suche benötigen. Wir kennen uns jetzt mit Hosting-Diensten aus. Wenn wir in den Quellordner und Haupt-JSX schauen, können wir feststellen, dass wir React 18 verwendet haben. Dies ist die API von React 18-Headern und unterscheidet sich von React 70. Wir haben hier gelernt, wie man die neueste React-Version verwendet. Wenn wir in App JSX schauen, können wir hier eine andere Logik sehen. Wir wissen bereits, was ein Staat ist, wie wir den Status verwalten können, wie wir den Status aktualisieren können und warum er benötigt wird. Wir wissen auch, welcher Wert aus diesem Zustand abgeleitet wird und warum wir nicht wirklich einen weiteren Staat erstellen müssen , um diese Berechnungen zu verwalten, wie Gewinner oder vielleicht wie ein Spielbrett. Wir wissen auch von State Update oder Function, dass sie auf verschiedene Arten aufgerufen werden können, entweder mit dem Callback, wann immer wir einen neuen Status anhand des aktuellen Zustandswerts setzen müssen , oder einfach mit einem normalen Aufruf ohne Callback, nur mit dem Wert. Wir kennen uns jetzt mit JSX-Markup aus. Wir wissen, wie man Klassennamen anwendet. Wir kennen Inline-Styles mit nur dem Style-Objekt, sodass wir CSS mit JavaScript schreiben können . Wir wissen, wie wir dynamische Stile anwenden können, indem einfach Zeichenkettenvorlagen und ein bisschen JavaScript verwenden. Wir wissen, wie man Requisiten weitergibt. Die Eingabeaufforderungen sind im Grunde die Attribute von Komponenten, mit denen Sie Daten an die Komponente übergeben können. Wir haben etwas über bedingtes Rendern gelernt. Wir wissen, dass wir JSX-Markup unter bestimmten Bedingungen rendern können , und das können wir auf verschiedene Arten erreichen. Wir können das in der Zeile machen, indem den AND-Operator direkt in JSX verwenden, oder vielleicht können wir eine Hilfsfunktion erstellen und die Logik hineinschreiben. Mal sehen, was wir noch hier haben. Wenn wir in Square schauen, haben wir es bereits besprochen. Wenn wir in die Geschichte schauen, haben wir sie nicht durchgesprochen. Wir wissen jetzt auch , dass wir ein Array verwenden und jedes Array-Element dem JSX-Markup zuordnen können. Falls wir Listen anzeigen müssen, verwenden wir die Dotmap-Methode. Die Dotmap-Methode ordnet jedes Array-Element dem JSX-Markup zu , wenn wir es in JSX verwenden. Wann immer wir das tun, denken wir daran, dass wir die Schlüsselrequisite immer an das Wrapping-Element übergeben müssen , da React jedes zugeordnete Element in JSX identifizieren muss . Ich glaube, das ist es. Wir haben bereits so viele Konzepte über React gelernt. Vertrauen Sie mir, all diese Konzepte, die Sie erlebt haben, bilden die Grundlage, die Sie benötigen, um mit React alles zu erstellen. Alles, was Sie hier sehen, ist in jeder anderen React-Anwendung vorhanden. Wenn Sie sich damit flexibel fühlen und das nutzen können , ist das großartig. Das bedeutet, dass Sie in Zukunft keine Probleme haben werden , jegliche Art von Anwendung zu erstellen. Herzlichen Glückwunsch. In diesem guten Sinne werden wir das Tic-Tac-Toe-Projekt beenden. Wir sehen uns beim nächsten Mal. 56. 17 Extra: Hallo ihr alle. Eigentlich habe ich vergessen, ein kleines subtiles Detail zu unserer App hinzuzufügen. Es geht um Stile. Es geht um diese Kreise , die wir im Hintergrund sehen. Wir sehen sie jetzt nicht, weil wir sie nicht hinzugefügt haben, aber ich habe vergessen, das zu tun. In Style CSS gibt es die Klasse BG Balls, die sich um die Hintergrundkreise kümmert. Wir müssen nur irgendwo im App-Markup ein leeres Element erstellen . Sagen wir ein leeres Div. Wir geben ihm den Klassennamen BG Balls. Wenn wir die Seite aktualisieren, sehen wir die Kreise im Hintergrund, sie sind responsiv und sehen ziemlich gut aus. Das tut mir leid. Vergessen Sie nicht, die App erneut bereitzustellen und diese Änderung wegzulassen. Ich mache einfach weiter und füge hinzugefügte Hintergrundkreise hinzu. Dann führe NPM Deploy aus. Die Deploy-Skripte, die wir in [unhörbar] definieren. In Ordnung, wir sehen uns. 57. 01 Box Office App Übersicht: Hallo, willkommen bei Box Office. In diesem Video möchte ich euch kurz das Projekt vorstellen, was das sein wird. Moment schauen Sie sich Box Office an. Dies wird eine Such-App für Filme und Schauspieler sein. Sie können nach Filmen oder Schauspielern suchen, und die Daten, nach denen Sie suchen werden aus der API abgerufen. In der Eingabe gebe ich zum Beispiel etwas wie Mädchen ein, und wenn ich die Eingabetaste drücke oder auf die Suchtaste drücke, sehe ich die Ergebnisse. All diese Ergebnisse werden vom externen API-Server abgerufen, der öffentlich verfügbar ist. Wir werden in der Lage sein, Shows zu spielen. Wenn wir auf eine Show klicken, sehen wir diese coole Animation. Um dem Benutzer mitzuteilen, dass diese Sendung jetzt mit den Sternen markiert ist, können wir auf Lesen Sie mehr klicken In diesem Fall wird eine neue Seite in einem neuen Tab geöffnet. Hier können wir alle Informationen sehen , die wir von der API abgerufen haben; Details, Staffeln, Besetzung, alles über die Show. Hier gehen wir zurück zu Ihrem Home-Here-Button für den Fall, dass wir zurückkehren müssen. Lassen Sie uns diesen Tab schließen. Jetzt, da wir hier die Hauptrollen gespielt haben, werden sie woanders verfügbar sein. Sie werden auf der Registerkarte Start verfügbar sein. Wenn wir hier navigieren, alle Sendungen, die wir zuvor ausgewählt haben , jetzt hier auf dieser Seite angezeigt. Selbst wenn ich den Browser schließe, den Tab schließe oder die Seite aktualisiere, unsere Sendungen immer noch da. Sie werden nicht in einer Datenbank gespeichert, sondern im Speicher des Browsers, insbesondere im lokalen Speicher. Gehen wir zurück zur Startseite und Sie können sehen, dass die Eingabe immer noch da ist. Das Gleiche passiert mit der Eingabe, genau wie die Sendungen, die wir Sternen markiert haben, irgendwo im Browser gespeichert werden, genauso wie wir es mit der Eingabe hier tun. Wenn ich die Seite aktualisiere, ist die Eingabe immer noch da. Außerdem haben wir hier diese Radiobox, Radiobuttons, wenn wir zu Schauspielern wechseln und dann nach einem Namen suchen , zum Beispiel James. Anstelle von Shows werden wir jetzt die Schauspieler sehen. Auch hier dieselbe API, aber im Gegensatz zu Serien haben Schauspieler keine eigene Seite, da wir nicht zu viele Informationen von der API erhalten. Das ist ausreichend, nur Karten für Menschen, für Schauspieler, und diese Anwendung ist auch eine progressive Web-App. Das bedeutet, dass unsere Anwendung jetzt installiert werden kann, als wäre sie eine native Anwendung, unabhängig davon, ob wir uns auf einem Desktop- oder Mobilgerät befinden. Zum Beispiel habe ich hier in der rechten oberen Ecke diese Installationsschaltfläche, und wenn ich darauf klicke, werde ich aufgefordert, diese Website zu installieren , als wäre es eine Anwendung. Wenn ich direkt danach auf Installieren klicke , werde ich, sagen wir, umgeleitet oder in einem neuen Fenster geöffnet , das eigenständig läuft , und das ist meine Anwendung. Gleich danach, wenn ich hier auf meinen Desktop zurückgehe, sehe ich das, ich kann es jetzt. Das ist meine Abkürzung für die Anwendung. Wenn ich es schließe und wenn ich es erneut öffne, wird es in einem separaten Tab geöffnet und verhält sich genauso. Ziemlich cool. Ich würde sagen, das ist es, das ist unsere Anwendung, das wird viel Spaß machen. Wir sehen uns dort. 58. 02 Das Projekt mit Create React App erstellen: Hallo, da. Wie fühlst du dich nach Tic-Tac-Toe? Bereit fortzufahren? Dieses Mal werden wir an Box Office arbeiten, einer Web-App, mit der wir nach verschiedenen Filmen und Schauspielern suchen können . Lass uns gehen. Für Box Office werden wir die Create React App verwenden. Es ist ein sehr beliebtes React-Boilerplate, mit dem wir Projektdateien erstellen können. In Tic-Tac-Toe haben wir ein Tool namens Vite verwendet. Dieses Mal werden wir die Create React App verwenden. Create React App ist wie ein heiliger Gral aller Vorlagen für React-Anwendungen. Der Grund dafür ist , dass die Create React App vom React-Team betreut wird. Es ist das, was wir eine offizielle React-Vorlage nennen können. Sie haben eine Frage, warum haben wir uns für Create React App entschieden , als wir Vite in Tic-Tac-Toe verwendet haben? Die Antwort darauf ist sehr einfach. Nur weil es keinen wirklichen Grund für diese Entscheidung gibt. Was auch immer Sie wählen, es wird Ihnen gut gehen. Für unseren Handel möchten wir jedoch so viele Optionen wie möglich ausloten und herausfinden was wir tun können und was wir erreichen können , indem wir verschiedene Vorlagen verwenden. Sie werden alle so ziemlich gleich sein. Sie können unterschiedlich sein, je nachdem , wie viel Sie mit der Anpassung vornehmen können. Aber insgesamt sind sie sich ziemlich ähnlich. Im Moment bin ich auf der offiziellen Create React App-Vorlagenwebsite. Was wir tun können, finden Sie unter Get Started. Von hier aus haben wir bereits den Schnellstartbereich, in wir diesen Befehl einfach kopieren können. Aber unsere Box Office App wird eine sogenannte progressive Web-App sein. Wir werden über Progressive Web App sprechen. Was ist das? Warum ist es cool und warum brauchen wir es oder vielleicht brauchen wir es nicht? Wir werden uns später an der Kinokasse mit all dem befassen, aber wir müssen eine bestimmte Maßnahme ergreifen bevor wir die Anwendung zusammenstellen. Später können wir es benutzen. Wenn wir nach unten scrollen und zu Templates gehen, können wir sehen, dass wir den Befehl Create React App mit dem Template-Flag ausführen können . Wenn wir zu Advanced Usage gehen oder wenn wir zur Entwicklung übergehen, lassen Sie mich sehen, wo das ist, Ihre App zu erstellen, eine progressive Web-App zu erstellen. Wenn wir hier zu diesem Abschnitt gehen , erhalten wir diesen Befehl, den wir mit der angegebenen Vorlage ausführen können , dass dies eine progressive Web-App sein wird. Genau das werden wir kopieren und verwenden, um neue Projektdateien zu erstellen. Also was ich tun werde, ich gehe zu dem Ordner in dem ich mein Projekt sehen möchte. Dies wird der Wrap-Ordner sein, den ich im vorherigen Video hatte. Der Ansatz ist derselbe. Sie müssen diesen Befehl in dem Ordner ausführen , in dem Sie Ihren Projektordner sehen möchten . Ich öffne Git Bash, du öffnest dein Terminal. Es kann alles sein. Wir werden keine Interaktivitätsprobleme haben wenn wir Windows mit Git Bash verwenden. Ich gehe zu Diskette D und dann zum App-Ordner. Hier werde ich diesen Befehl anstelle meiner App hier einfügen. Ich werde die Box Office-Vorlage und die Create React App-Vorlage PWA wählen . Wenn ich die Eingabetaste drücke, wird der Befehl gestartet. Es dauert ein paar Minuten, bis alle erforderlichen Dateien erstellt sind. Es erstellt nicht nur Dateien, installiert auch alle Abhängigkeiten aus dem Paket Jason, sodass dieser Befehl eine Weile dauern kann. Sie uns während des Installationsvorgangs Lassen Sie uns während des Installationsvorgangs über den Unterschied zwischen Vite und Create React App sprechen . In Tic-Tac-Toe haben wir Vite verwendet. Vite ist im Grunde eine Konfiguration, die auf dem Modul-Bundler-Roll-up mit der Create React App aufbaut. Es ist fast dasselbe. Create React App ist eine Konfiguration die auf dem Modul-Bundler Webpack aufbaut. Während Vite für jede Frontend-Bibliothek und für jedes Frontend-Projekt verwendet werden kann , zielt die Create React App nur auf React ab. Vite verwendet Roll-up. Create React App verwendet Webpack, und beide sind Konfigurationen, die auf diesen Modulbudlern basieren. Es gibt keinen großen Unterschied, was zu wählen ist. Die Antwort ist, dass es sehr subjektiv ist, was man wählt. Ich persönlich bevorzuge Vite, aber die Create React App hat ihre eigenen Vorteile, zum Beispiel haben sie diese sofort einsatzbereite progressive Web-App-Unterstützung, was großartig ist und perfekt zu unseren Projektanforderungen passt. Lass mich zurück zum Terminal gehen. Ich kann sehen, dass alles installiert wurde. Ich kann die Erfolgsmeldung und die Willkommensnachricht sehen. Wenn ich meinen Ordner hier öffne, habe ich Box Office und darin meine Projektdateien. Jetzt öffne ich VS Code und in VS Code öffne ich das Ordnerlabor. Das wird Box Office sein. Hier haben wir ein paar Dinge, die sich geringfügig von dem unterscheiden, was wir zuvor in Tic-Tac-Toe hatten. Darüber werden wir gleich sprechen. Bevor wir fortfahren, öffnen wir den Gast, den Sie mit Ihnen geteilt haben. Von hier aus konfigurieren wir Prettier und ESLint. Das Setup wird so ziemlich das gleiche sein wie in Tic-Tac-Toe, aber etwas anders. Lassen Sie uns zunächst die ESLint-Konfiguration kopieren. Ich werde eslintrc erstellen. Kopiere alles hier, das gleiche werde ich für Prettier tun. Was haben wir in ESLint hier? Genau das gleiche Setup wie in Tic-Tac-Toe, aber wir haben hier auch das Plugin, React Hooks und nur ein paar Regeln, die hier definiert sind. Dann müssen wir Abhängigkeiten installieren. Genau wie zuvor müssen wir ESLint-Konfiguration Prettier installieren. Das Prettier-Plugin, das wir erweitern, das wir installieren müssen, um ESLint-Plug-in React sowie das React Hooks-Plugin zu installieren. Ich kopiere einfach diese Plug-ins hierher. Der Installationsbefehl lautet eslint-config-prettier, eslint-plugin-react und eslint-plugin-react-hooks. Außerdem muss ich die Tools selbst installieren. Ich muss Prettier und ESLint installieren. Großartig. Warten wir nun auf die Installation. Ich habe bereits sechs Sicherheitslücken mit hohem Schweregrad. Nun, was ich als Nächstes tun werde. Als Nächstes werden wir überprüfen, was genau wir im Paket Jason haben. Fangen wir mit den Skripten an. Wie ich Ihnen schon sagte, ist Create React App eine Konfiguration, die auf dem Webpack zugrunde liegenden Modul-Bundler aufbaut. Diese versteckte Konfiguration wird uns über das React-Skriptpaket angezeigt, das über NPM verteilt wird. So wie wir Beat über NPM verteilt haben, haben wir React-Skripte. Aus diesem Grund haben wir in unseren Skripten React-Skripts zum Starten, Erstellen, Testen und Auswerfen. Was sind diese Skripte? In Tic-Tac-Toe haben wir das Dev-Skript, das den lokalen Entwicklungsserver für uns ausführt. Hier heißt es Start. Nun, normalerweise heißt es Start, aber es macht genau das Gleiche. Es startet den lokalen Entwicklungsserver. Dann haben wir wieder das Build-Skript, um ein Produktions-Build-Testskript zu erstellen, das Tests ausführt. Wir werden das in einer Sekunde anfassen und auswerfen. Eject können wir uns Konfiguration von React-Skripten abmelden und die Konfiguration selbst so anpassen , wie wir es benötigen. Dann haben wir viele Abhängigkeiten im Zusammenhang mit der Workbox. Was ist das? Dies alles hängt mit der Erstellung einer progressiven Web-App zusammen. werden wir später sprechen, wir werden nichts davon berühren. Web Vitalwerte, wir werden uns gleich damit befassen. React Scripts ist das Paket mit der Konfiguration. React-Abhängigkeit und Testbibliothek, darauf werden wir gleich eingehen , ebenso wie unsere Dev-Abhängigkeiten, die wir gerade installiert haben. Fantastisch, wenn wir nun in den öffentlichen Ordner schauen, ist der Zweck dieses Ordners genau der gleiche wie im Feed. Alle Dateien, die wir hier platzieren, werden in unserer Anwendung dem URL-Segment zugeordnet. Hier haben wir Index-HTML im öffentlichen Ordner. Wenn wir es im Feed im Stammordner hatten, haben wir es hier öffentlich. Dies ist, sagen wir, der erste große Unterschied zwischen Feed und Create React-App. Hier haben wir ein paar Dinge, die anders sind. Zuerst haben wir diese öffentliche URL, eine globale Variable, diese öffentliche URL wird vom Webpack gesendet. Wenn unsere App kompiliert wird, verarbeitet Webpack Index-HTML und ersetzt diese öffentliche URL den Stammpfad unserer App. In unserem Fall wird es in etwa so übersetzt. Einfach ein Favicon und das war's. Jetzt haben wir auch das Root-Element , in dem die Anwendung gemountet wird. So ziemlich das, was wir in Tic-Tac-Toe hatten. Dann haben wir die Manifest-Datei. Die Manifestdatei bearbeitet etwas, das mit der Erstellung der Progressive Web App zu tun hat. Es steuert im Grunde die Verknüpfung, mit der unsere Anwendung geöffnet wird . Wir werden das behandeln, sobald wir zur Progressive Web App zurückkehren, wir denken jetzt nicht darüber nach. Nun, was haben wir im Quellordner? Im Quellordner haben wir eine sehr einfache Einrichtung. Lassen Sie uns eigentlich das Start-Skript ausführen , um den Entwicklungsserver zu starten. Mal sehen, was wir hier haben. Wenn ich hierher zurückgehe, dauert es einige Zeit, bis ich die App öffne. Während es noch geöffnet wird, schauen wir uns an, was wir im Index haben, den es geöffnet hat. Schauen wir uns an, wie die App aussieht und kehren wir zu den Dateien zurück. Sie können sehen, dass es ein paar Minuten dauert und wir haben hier bereits ein sofortiges Problem. React ist in App.js definiert, wird aber nie verwendet, da Sie, wie ich Ihnen schon sagte, in React 17 und früheren Versionen immer React aus React importieren mussten, immer React aus React importieren mussten wenn Sie JSX in Dateien verwenden. Ab React 18 ist dies nicht erforderlich. Wir verwenden hier die spezifische Plugin-Option jsx-runtime, die uns sagt, dass wir sie nicht benötigen. Deshalb entfernen wir es. In React 18 ist dies nicht erforderlich. Nun, das ist unsere Anwendung, so sieht es im Moment aus, nichts allzu Besonderes, ziemlich einfaches Setup. Sehen wir uns die Akten an. Beginnen wir mit Index.js, unserem Einstiegspunkt, und hier haben wir ein paar Dinge , die wir noch nie zuvor gesehen haben. Zuallererst haben wir das Dokument Reactdom.createRoute. Ruft das Element anhand der ID root Dies ist das Element, das wir aus dem Index-HTML abgerufen haben. Die IDs müssen übereinstimmen. Hier wird die Anwendung gemountet. Auch hier haben wir den strikten Modus , der unsere App ziemlich einfach eingerichtet macht, aber wir haben auch eine Service Worker-Registrierung und wir haben Web-Vitalwerte gemeldet. Was sind das? Registrierung von Servicemitarbeitern und GS für Servicemitarbeiter. Dies sind die Dateien , die unsere Web-App zu einer progressiven Web-App machen werden . Wir wollen jetzt nicht wirklich an sie denken. Das werden wir später verwenden. Wir behalten sie einfach und ignorieren vorerst einfach, was wir hier über die Registrierung von Service Worker haben. Nochmals, darüber werden wir später sprechen. Aber wir haben hier auch Berichte über Web Vitals. Wenn wir hineinschauen, Web Vitals, ist das, was wir importieren. Hier ist es nur eine einfache Funktion, die etwas importiert, das als Web Vitals bezeichnet wird, und danach ruft sie hier eine Reihe von Funktionen auf. Was ist ein Web Vitals, das hierher importiert wird? Das ist das Paket, das wir hier haben Web Vitals. Wenn wir zur NPM-Registry zurückkehren, innerhalb der NPM-Registrierung nach diesem Paket suchen, können wir innerhalb der NPM-Registrierung nach diesem Paket suchen, in dem wichtig ist, und sehen, was es genau tut. Kurz gesagt, Web Vitals ist ein Paket, es ist im Grunde nur eine Reihe von Funktionen, die Sie in Report Web Vitals finden. Diese Funktionen ermöglichen es uns, die Leistung unserer Anwendung zu messen. Welche Art von Aufführung? Die Leistung basiert auf verschiedenen Metriken, die wir sammeln können , wenn unsere Seite geladen wird. Sie können hier auf der offiziellen NPM-Seite des Pakets ausführlich über sie lesen . Dies ist sehr nützlich, wenn Sie maximale Optimierung und maximale Geschwindigkeit in Ihrer App erreichen möchten . Wie es funktioniert, ist das innerhalb des Index, ja, wir nennen diesen Bericht Web Vitals und hier als Callback , der hier bei der Leistungseingabe hier nochmal definiert wird. Der Callback, den wir hier weitergeben, wird für jede Metrik aufgerufen. Wenn wir bestehen, stornieren Sie einfach hier. Das bedeutet, dass alle unsere Leistungskennzahlen gestrichen werden. Lass mich es tatsächlich speichern und lass uns sehen, was genau ich brauche. Wenn ich zur App zurückkehre, gehe ich zu Inspect. Wenn ich in die Konsole schaue, sehe ich hier verschiedene Metriken. Konsole wurde als Objekte mit den verschiedenen Werten protokolliert. Genau das macht das Web Vitals-Paket. Es misst die Leistung und gibt Ihnen Kennzahlen. Nichts weiter als das. Wir brauchen es nicht wirklich. Vielleicht, aber wir werden es später benutzen, aber nicht jetzt. Also können wir es hier als einfache Funktion belassen. Schauen wir uns das Innere von App.js an. Eigentlich wäre eine gute Frage hier, warum haben wir alle Dateien Erweiterung with.js anstelle von JSX? Denn in Tic-Tac-Toe verwenden wir.jsx überall. Nun, Vite hat verlangt, dass wir die Erweiterung.jsx verwenden, und Vite funktioniert so, dass es alle Dateien mit der Erweiterung JSX aufnimmt und versteht , dass dies React ist. Da Create React App hier nur auf React-Apps ausgerichtet ist, ist dies keine Voraussetzung, da klar ist, dass alles React sein wird. In Vite war das jedoch anders, da Vite auch für andere Bibliotheken verwendet werden kann. Wir werden unseren Dateien auch die Erweiterung with.js nennen. Wir werden sie im kommenden Video umbenennen. Im Moment werden wir von hier nichts löschen. In App.js haben wir eine Logo-Datei hier importiert. Ich möchte hier nur eine kurze Notiz machen, weil wir unsere statischen Assets wie Bilder, Schriften, etwas, das statisch ist und keine Verarbeitung erfordert, keine Verarbeitung erfordert, öffentlich zugänglich machen und dann vom Quellcode aus referenzieren können. Aber hier wird es importiert. SVG-Datei ist ein Bild. Es wurde importiert, als wäre es ein Skript oder ein Modul. Dann wird alles, was hier wichtig ist, als Quelle übergeben. Wenn wir uns HTML ansehen, tut uns leid, hier haben wir ein Bild , das auf die URL verweist. Sie können sehen, dass es automatisch generiert wurde oder dass etwas mit dieser URL gemacht wurde. Genau. Unter der Haube, was Webpack getan hat, also dass das Paket React die Konfiguration skript, es verstanden, dass wir ein Bild importieren wollen. Dann hat es das Bild verarbeitet und automatisch die URL dafür generiert. Im Grunde wurde es also vom Bundler verarbeitet. Sie haben vielleicht eine Frage warum. Warum müssen wir es getrennt halten? Warum importieren wir manche Dateien, manche Bilder so aus Quelle und andere halten wir öffentlich? , es steckt eigentlich kein besonderer Grund Ich vermute, es steckt eigentlich kein besonderer Grund dahinter. Der Unterschied besteht darin , dass diese Dateien vom Bundler verarbeitet werden. Diese, die sich in einem öffentlichen Ordner befinden, werden vom Bundler nicht verarbeitet. Wir hätten diese logo.svg in Public verschieben können. Dann würden wir in App.js einfach auf logo.svg verweisen, oder? Wenn ich es speichere, aktualisiere ich, alles bleibt beim Alten und Sie können sehen logo.svg auf der Anwendungsroute bereitgestellt wird , weil wir es im öffentlichen Ordner haben und die URL-Segmente zugeordnet sind, wie Sie sich erinnern. Es wird in der Quelle platziert, dann wird es einfach so importiert und dann die Quelle angegeben. Auf diese Weise können Sie Bilder laden. Es heißt, das kann nicht gelöst werden. Das liegt wahrscheinlich daran, dass ich meine App neu starten muss , damit sie das wieder aufnehmen kann. Lassen Sie uns das für alle Fälle tun, um sicherzugehen. Aber ich denke, das ist alles, was wir tun mussten. Was wir hier tun können, um das zusammenzufassen, was wir gerade erstellt haben, müssen wir auch in Git dieses Projekt, das wir gerade erstellt haben, auf GitHub hochladen und einen weiteren Commit hinzufügen , weil wir neue Abhängigkeiten installiert haben. Ich starte die App. Sie können sehen, dass es einwandfrei funktioniert hat und die URL erfolgreich war. Wie dem auch sei, Sie können hier sehen, dass Git tatsächlich schon drin ist. Als ich die Vorlage erstellt habe und die npx Create React App ausgeführt habe, wurde Git automatisch in diesem Ordner initialisiert. Wenn ich git log eintippe, habe ich hier bereits einen ersten Commit. Das Kommando hat sich darum gekümmert. Da wir jedoch unsere eigenen Änderungen eingeführt haben, werden wir sie übernehmen. Mal sehen, was wir hier haben? Wir haben App.js, index.js. Ich werde einfach alle Änderungen entfernen, die wir hier vorgenommen haben, weil wir sie wirklich nicht benötigen. Wir werden im nächsten Video alles machen. Wir interessieren uns nur für unsere ESLint-Konfiguration, die wir hinzugefügt haben, und für die Prettier-Konfiguration, für die wir package lock und package.json hinzugefügt haben, weil wir die Dev-Abhängigkeiten installiert haben. Großartig. Alles ist auf der Bühne. Ich übernehme einfach alles und nenne es installiert und konfiguriert Prettier und ESLint. Fantastisch. Jetzt ist es an der Zeit , dass wir dieses Projekt auf GitHub hochladen. Lass uns gehen. meinem GitHub-Konto werde ich in der oberen rechten Ecke ein neues Repository erstellen . Mein Repository-Name wird Box Office App sein. Ich werde es privat machen. Ich möchte keine Read Me hinzufügen. Ich habe bereits Gitignore. Wenn wir wie zuvor in Gitignore nachschauen, haben wir sowohl Knotenmodule als auch den Build-Ordner ignoriert. Wenn wir in Tic-Tac-Toe den Build im Festplattenordner generiert haben , generiert Create React App den Build im Build-Ordner. Lassen Sie uns eigentlich das Repository erstellen und dann den Befehl build ausführen. Dann werden wir alles hochladen. Ich klicke auf Create Repository. Folgen Sie dann erneut genau dem gleichen Verfahren. Ich kopiere git remote add origin in meine Repository-URL. Ich platziere es in meinem Terminal, ich führe diesen Befehl aus. Dann mache ich git remote minus v, um zu überprüfen, ob Alias-Ursprung auf mein GitHub-Repository verweist. Fantastisch. Also werde ich Git Push Origin Master machen. Und wenn ich jetzt mein GitHub-Repository aktualisiere, ist es da. Fantastisch. Lassen Sie uns versuchen das Build-Skript am Ende auszuführen , um zu sehen, ob es tatsächlich funktioniert. Npm run build wie in package.json definiert. Wo sind unsere Skripte? Hier, und mal sehen, heißt es , einen optimierten Produktions-Build erstellen. Nun, wir haben React ist definiert, aber nie verwendet. Das ist genau das, was wir tatsächlich hatten. Das ist ziemlich nervig, dass keine ungenutzten Variablen einen Fehler erzeugen. Weil Sie sehen können, dass der Build unterbrochen wird , weil ESLint für keine ungenutzten Variablen einen Fehler erzeugt. Lassen Sie uns weitermachen und speziell für diese Regel, wenn ich mich nicht irre, haben wir in Tic-Tac-Toe genau dasselbe für keine ungenutzten Variablen gemacht. Wir werden es Ihnen sagen, bitte geben Sie uns eine Warnung statt eines Fehlers. Eine Warnung, es ist nur eine Warnung. Es ist nur eine Nachricht, um dich zu warnen. Es macht den Build nicht kaputt oder so. Sie können jetzt sehen, dass es gelb geworden ist und mein Build erfolgreich abgeschlossen wurde. Ich werde es einfach so lassen wie es ist, ich werde App.js nicht ändern. Lassen Sie mich die Änderungen entfernen, die ich vorgenommen habe. Hier können Sie sehen, wie der Build-Ordner erscheint und wenn wir in das Terminal schauen, haben wir die Ausgabe, dass das Projekt erstellt wurde, vorausgesetzt, es wird auf der Route gehostet , dann andere Befehle, und wenn wir in Build nachschauen, können wir sehen, dass dies unser Produktions-Build ist. Wir haben nur statische Dateien. Wir haben HTML-, CSS-, JavaScript-, Bilder- und JSON-Dateien und sogar TXT. Wir haben eine Lizenz für einen Servicemitarbeiter. Jetzt nehmen wir den Build-Ordner und laden ihn hoch, um ihn zu hosten. Nochmals, das werden wir ganz am Ende tun. Du kannst sehen, wie es funktioniert. Es sieht perfekt aus, nicht wahr? Fügen wir nun diese ESLint-Änderung zu Git hinzu. Also werde ich es übernehmen und benennen, keine ungenutzten Variablen in eine Warnung umgewandelt und dann alles auf GitHub hochladen. Großartig. Im nächsten Video werden wir all diese Dateien im Quellcode bereinigen. Danach beginnen wir mit der Entwicklung. Wir sehen uns dort. 59. 03 Reinigung von redunanten Dateien: Hallo zusammen. Im letzten Video haben wir mit der Create React-App-Vorlage ein neues Projekt erstellt. In diesem Video werden wir nur eine kleine Bereinigung durchführen, bei der diese unnötigen Dateien, die die wir nicht verwenden werden, aus dem Quellcode entfernt werden. Richtig, wir werden mit der Entwicklung beginnen. Lass uns gehen. Zuallererst habe ich im letzten Video nicht wirklich etwas über Setup-Tests und die Testbibliothekspakete, die wir hier haben, behandelt Setup-Tests und . So können wir React-Anwendungen tatsächlich testen. Wir können programmatische Tests mit einer sogenannten React-Testbibliothek schreiben. Das werden wir hier an der Kinokasse nicht tun. Deshalb entfernen wir es einfach weil es unbenutzt bleibt. Als Erstes werde ich „App.test.js“ entfernen. Ich werde „Setup.Tests.js“ aus „package.json“ entfernen. Ich werde all diese Abhängigkeiten einfach so entfernen. Mal sehen, und das war's. Jetzt haben wir die Testbibliothek aus dem Projekt entfernt , da wir sie hier nicht behandeln werden. Als nächstes haben wir „logo.svg“. Wir brauchen es nicht wirklich. Wir haben "index.css „, wir können es tatsächlich behalten. Wir haben "App.css ", wir brauchen es nicht wirklich, weil "index.css" globale Styles für den Körper enthält Lassen wir es einfach dort und berühren wir es nicht. Dann haben wir „reportWebvitals.js“. wir wirklich interessiert sind, benötigen wir es möglicherweise, um die Leistung zu messen Wenn wir wirklich interessiert sind, benötigen wir es möglicherweise, um die Leistung zu messen, sodass wir es für alle Fälle behalten können. "Service-worker.js" ist etwas, das wir später anhängen können , wenn wir uns mit progressiver Web-App befassen werden. Übrigens, wenn Sie in den Service-Worker hineinschauen, können wir bereits sehen, dass wir hier etwas haben, das rot markiert ist. Auch hier sind es unsere schönen ESLint-Regeln. Was wir dagegen tun können, wir können ESLint einfach nur in diesen beiden Dateien deaktivieren, in "service-worker.js" und in „serviceWorkerRegistration.js“. Auch hier werden wir später über diese Dateien sprechen. Wir möchten nur sicherstellen , dass diese Dateien keine Fehler oder Warnungen von ESLint erzeugen. Wir werden eslint-disable einfach so mit einem Schrägstrich in Asterix verwenden , um ESLint nur für diese Datei zu deaktivieren. Ich werde diese Zeile kopieren und sie ganz oben in "serviceWorkerRegistration.js" einfügen. Jetzt haben wir hier keine ESLint-Warnungen oder Fehler. Fantastisch. Als Nächstes werden wir "index.js" und "App.js " umbenennen , sodass sie die Erweiterung.jsx haben, nur um Dateien mit JSX-Markup und Dateien ohne JSX-Markup, nur normale JS-Dateien, zu unterscheiden und Dateien ohne JSX-Markup, nur normale JS-Dateien, zu . Dies ist besonders wichtig für "service-worker.js" und "erviceWorkerRegistration.js“. Weil es in diesen Dateien überhaupt nicht um React geht. Dies sind Dateien, die sich nur mit dem Frontend befassen. Sie können nicht speziell in React verwendet werden. Wir benennen "index.js" um, um das.jsx-Markup zu haben. Genau das Gleiche werden wir für "App.js" tun. In App.jsx müssen wir React nicht aus React importieren, da wir auch hier React 18 verwenden. Und React 18 erfordert nicht, dass Sie React in den Geltungsbereich von jsx importieren. Wir haben "logo.svg" entfernt, also entfernen wir den Verweis auf eine nicht existierende Datei. Wir haben "app.css" entfernt, wir entfernen erneut den Verweis auf eine bestehende Datei. In der App-Komponente können wir vorerst einfach Hallo behalten, ohne dass hier ein Klassenname angegeben wird. Ziemlich einfach. Auch hier ziemlich einfach. "Index.css" wird beibehalten, deshalb haben wir importiert. Mal sehen, was hier noch alles passiert. Was auch immer wir am Ende in der Öffentlichkeit haben, wir werden es durch unsere eigenen Symbole ersetzen, durch unsere eigenen Bilder. Wir löschen sie vorerst nicht, und ich denke, das ist so ziemlich alles. Das einzige, was wir tun müssen, npm install auszuführen, um die Änderungen widerzuspiegeln, die wir an „package.json“ vorgenommen haben. Da wir diese Abhängigkeiten der Testbibliothek hier entfernt haben, wurden sie aus „package.json“ entfernt, aber sie werden nicht aus „node_modules“ deinstalliert. Wenn ich npm install ausführe, werden einfach die nicht vorhandenen Abhängigkeiten und „package.json“ aus dem Ordner „node_modules“ entfernt die nicht vorhandenen Abhängigkeiten und . Sie können sehen, „ 71 Pakete wurden entfernt“. Auch hier habe ich sechs hohe Sicherheitslücken. Bitte erschrecke mich damit nicht. Lassen Sie uns vorerst festlegen, git add. Es ist bereits in der Phase und „git commit“ wird entfernt oder der Quellordner aus der ersten Create React-App bereinigt . Einrichtung. Fantastisch. Wir geben alles, um alles zu meistern , und was das Gute daran ist, dass wir uns im nächsten Video sehen. 60. 04 React Router v6 Einführung: Hey, in diesem Video werden wir endlich mit der Codierung fortfahren und endlich anfangen, etwas zu bauen. Lass uns gehen. Wenn Sie sich an Tic-Tac-Toe erinnern, hatten wir in unserer Bewerbung nur eine Seite. Wir hatten keine Navigation zwischen den Seiten, und die Sache ist, dass in React keine in die Bibliothek integrierte Navigation vorhanden ist. Das heißt, wenn wir eine gewisse Navigation zwischen den Seiten erreichen möchten , müssen wir dies selbst tun. Nun, dafür gibt es ein Paket, das die Navigation für uns verwaltet. In Wirklichkeit gibt es mehrere Pakete, die das Routing innerhalb der App ermöglichen können . Diese Navigation zwischen Seiten wird als Routing zwischen Seiten bezeichnet. Es gibt verschiedene Pakete, die das können, sie haben mehr oder weniger die gleiche Schnittstelle. Der, den wir verwenden werden , ist React Router. Wenn ich die offizielle Dokumentation hier öffne, kann ich wählen, dass ich neu bin. Ich kann jedoch zustimmen, dass ihre neueste Dokumentation nicht sehr klar ist. Ich habe nichts gesehen, was ich ausführen muss, um React Router zu installieren , und auch dieses Tutorial ist sehr lang und deckt alles ab, aber was ist, wenn ich nur einen schnellen Start machen möchte? Um mit dem React Router zu beginnen, müssen wir zuerst dieses Paket installieren und dazu müssen wir npm install react-router-dom ausführen. Wir machen das, danach erscheint es im Paket json. Jetzt werde ich den Entwicklungsserver erneut ausführen und schauen wir uns die Dokumentation an. Wenn wir hier das Setup durchführen, wir tatsächlich aufgefordert, eine neue React-App mit Vite zu booten. Wir werden diesen Schritt überspringen. Danach sehen wir „Einen Router hinzufügen “ und hier müssen wir so etwas erstellen. Aber ich persönlich finde es etwas verwirrend, dieser Dokumentation zu folgen, weil ich React Router aus den vergangenen Versionen kenne Derzeit befindet es sich in Version 6 und jede Hauptversion, wie 5, 4, 3 , ändert immer ihre API, ihre Schnittstelle, weil sie jetzt völlig anders ist als zuvor. Um es einfach zu machen, gehen wir links zu den Hauptkonzepten und hier gehen wir zu dem Abschnitt Rendern, falls ich mich nicht irre. Hier finden Sie ein sehr gutes Beispiel , aus dem hervorgeht, was genau React Router macht und was wir tun werden? Anstatt der ganzen langen Dokumentation zu folgen, nehmen wir nur das, was wir brauchen. Wir nehmen dieses Beispiel und wir werden verstehen, was genau React Router uns bieten kann. Wir können einen ziemlich einfachen Create-Root-Aufruf sehen , den wir bereits in index.jsx haben , und wir sehen, dass wir diesen Sortierbaum benötigen. Zuallererst benötigen wir einen Browser-Router. Wir werden das importieren und das alles werden wir wahrscheinlich in der App machen. Wir können den Browser-Router tatsächlich importieren und in index.jsx verwenden Lassen Sie uns dies jedoch in der App tun. Wir müssen es zuerst von irgendwoher all diese Komponenten holen , sie sind alle von React-Router-Dom importiert, und irgendwo in dieser langen Dokumentation gibt es sie. Sie können sie tatsächlich dort finden. Wir brauchen einen Browser-Router und wir brauchen Routen, und wir brauchen eine Route. Also, wir werden etwas von React-Router-Dom importieren , also müssen wir uns den Browser-Router schnappen und wir müssen Routen abrufen, nicht Router, und wir müssen uns die Route schnappen. Diese drei Komponenten. Was ich jetzt tun werde, ich kopiere einfach das Markup und füge es einfach so in die App ein. Aber hier, jetzt haben wir nicht all diese Komponenten , die hier definiert sind, das ist in Ordnung. Was ist eigentlich hier los? Durch die Verwendung dieser baumartigen Struktur können wir Routen in unserer React-Anwendung definieren. Stellen Sie sich Routen als Seiten vor, also jede Route wird durch eine Seite dargestellt. Route ist im Grunde nur ein URL-Segment. Wenn Sie, sagen wir für Pfadteams, immer dann, wenn die URL beispielsweise Slash Teams ist , können wir diese Teamkomponente mithilfe der Syntax anzeigen. Aber das werden wir nicht tun. Moment müssen wir nur mindestens etwas anzeigen. Lassen Sie uns das kommentieren, diese Routenkomponenten, und indem wir sie uns ansehen, lassen Sie uns sehen was wir selbst mitbringen können. Wir werden einfach weitermachen und die Route unter Pfad, Route und Index erstellen . Ein Element wird etwas sein. Was müssen wir hier anzeigen? Hier müssen wir die Komponente rendern , die unsere Seite darstellen soll. Ich schlage vor, dass in Source dann ein neuer Ordner erstellt und ihn Pages genannt wird. Hier erstellen wir Komponenten, die unsere Seiten repräsentieren. Ich werde hier eine neue Datei erstellen, nennen wir sie Home.jsx. Von hier aus erstelle ich solche Home-Komponente und exportiere sie dann standardmäßig so. Ab jetzt wird es ein einfaches Div mit der Aufschrift Homepage sein. Also, für den Pfadindex nur für Route, werden wir die Home-Komponente rendern und übrigens, Sie können sehen, sobald ich home eingebe und wenn mein Cursor am Ende steht, habe ich diesen IntelliSense hier aus der Drop-down-Liste. Wenn ich „Tab“ drücke, wird es für mich automatisch importiert, ziemlich cool, nicht wahr? Jetzt behalte ich es so und wenn ich zu meiner App zurückkehre, schaue ich mir an, was ich habe. Ich habe hier eine Homepage und wenn ich zu einer anderen URL gehe, habe ich eine leere Seite. Wenn ich mir die Markierung ansehe, öffne ich den Körper, ich habe eine Route. Aber unterwegs habe ich nichts. Das liegt daran, dass ich hier keine Route, keine Seite definiert habe. React Router funktioniert so, dass er das URL-Segment hier abgleicht, den Pfadnamen mit dem Pfad, den Sie hier beim Rendern angeben, das entsprechende Element. Versuchen wir nun, eine weitere Seite zu erstellen. Nennen wir es Kontakt und hier rendern wir einfach. Nur um ein Beispiel zu geben, erstelle ich div und sage Kontakt. Wenn ich jetzt zu Kontakt gehe, sehe ich das Markup, das, was ich hier als Element übergeben habe , einfach so. Jetzt wissen wir, wie React Router funktioniert. Den Rest, den Sie hier im Beispiel sehen, werden wir in den nächsten Videos behandeln, da es hier um das Layout geht, sodass wir ein Layout haben können, das von mehreren Seiten gemeinsam genutzt werden kann . Dann kommt diese Route ohne Pfad oder ohne Index ins Spiel. Wir werden auch diese Spalte hier behandeln, die die Darstellung einer dynamischen Seite sein wird , aber auch hier werden wir sie später behandeln. Das ist nicht der richtige Zeitpunkt. Was wir jetzt tun werden, wir werden vielleicht einfach unsere ersten Seiten erstellen. Was ich Ihnen hier sagen kann, ist, dass wir in Box Office die Homepage haben und dann werden wir die Starter-Seite haben. zukünftige Referenz fügen wir, da wir bereits zwei Seiten erstellt haben, da wir bereits zwei Seiten erstellt haben, eine weitere Seitenkomponente hinzu, die wir Start-Grundlagen nennen werden, und ich werde einfach alles kopieren, was ich darin habe. Ich werde es in Starred umbenennen. Dann importiere ich innerhalb der App-Komponente erneut die mit einem Stern versehene Komponente, die unsere Seite darstellt. Anstelle von Kontakt werde ich einen Stern und statt Kontakt den mit einem Stern markierten Pfad anzeigen, nur um zu überprüfen, ob ich meine mit Sternen markierte Seite habe, wenn ich zu „Mit Sternen“ gehe . Großartig. Was ist dann mit diesen leeren Seiten, wenn wir eine undefinierte Route einschlagen? Es ist nicht 404, aber es ist eine Seite, die nicht gefunden wurde. React Router hat dafür eine Erklärung , wie man damit umgeht. Wenn wir hier zum FAQ-Bereich gehen, können wir sehen, wie ich in React Router 6 eine No-Match-404-Route hinzufüge . Du kannst das einfach benutzen. Wir werden es vielleicht am Ende oder oben platzieren Wenn ich mich nicht irre, kann es überall platziert werden. Anstatt dass momentan kein Treffer wichtig ist oder wir ihn vielleicht nicht ändern werden , werden wir einfach nicht gefunden anzeigen . Lass es uns versuchen. Wir gehen zur App und wann immer wir eine Route wählen, die wir nicht definiert haben, erhalten wir nicht gefunden. Aber wenn wir zur Homepage gehen, haben wir eine Homepage, wenn wir zu Starred gehen, haben wir einen Stern. Fantastisch. Nun, wie wir zwischen diesen Seiten navigieren können, weil wir Anker-Tags haben, aber wir können Anker-Tags nicht wirklich verwenden, wenn wir clientseitige Routing-Bibliothek wie React Router verwenden. Dafür müssen wir eine bestimmte Komponente verwenden. Gehen wir nach Hause und jetzt brauchen wir hier die sogenannte Link-Komponente, die wir erneut aus der Dom-Link-Komponente von React Router importieren . Ich werde einfach eine solche Link-Komponente anzeigen, es ist im Grunde nur ein Wrapper für das Ankertag, aber es ist spezifisch für React Router sodass React Router verstehen kann, dass Sie von einer Route zu einer anderen Route wechseln möchten, und dann nennen wir es Go to Started anderen Route wechseln möchten, und dann Page. diese Link-Komponente müssen wir prop called übergeben, um dann die Route anzugeben, zu der wir gehen möchten , wenn wir auf diesen Link klicken. Da unsere markierte Komponente unter Pfad mit Sternchen definiert ist, wechseln wir, wenn wir auf Gehe zur Sternseite klicken, zur markierten Route. Jetzt gehen wir zurück zur Startseite. Wenn wir uns das Markup ansehen, können Sie sehen, dass es sich unter der Haube tatsächlich um einen Ankertag handelt , der zur markierten Route führt. Wenn wir darauf klicken, befinden wir uns jetzt auf der mit den Sternen markierten Seite. Cool, nicht wahr? Das war's. Nun, das sind eigentlich die Grundlagen von React Router. Wie Sie sehen, besteht der Zweck darin, Ihnen dieses Navigationserlebnis in der React-App zu bieten. Denn auch hier hat React keine integrierte Lösung dafür Deshalb müssen wir unsere eigene Lösung verwenden oder eine Bibliothek installieren, die uns Routing-Funktionen bietet. Ich denke, das ist alles für die Einführung in React Router. Im nächsten Video werden wir mit der Erstellung von Layouts beginnen und mit unserer App fortfahren. Am Ende wollte ich nur eine Anmerkung zu React Router hinzufügen und warum nennen wir sie eigentlich Routen, warum nennen wir sie nicht Seiten? Die Sache ist, dass wir eine sogenannte Single-Page-Anwendung erstellen. Eine Single-Page-Anwendung ist hier im Grunde nur eine einzelne Index-HTML-Datei , weshalb sie als Single-Page-App bezeichnet wird. Wann immer wir zwischen Routen navigieren oder sie Seiten nennen, passiert tatsächlich, dass React Router JavaScript verwendet , um HTML-Markup zu ersetzen und dann entsprechende Komponenten anzuzeigen Wir nennen es Navigation, aber im Grunde genommen nimmt es vorhandenes HTML, entfernt es und fügt neues HTML ein, und dann ersetzt es die URL durch was auch immer wir als Route angeben. Alles hier wird von JavaScript verwaltet. Wir haben immer noch dieselbe Seite, es ändert sich nicht, dass sich HTML hier nicht ändert, das Skelett, die Vorlage, diese Indexierung ändert sich nicht, aber JavaScript ahmt tatsächlich dieses Navigationserlebnis nach, sodass es für den Endbenutzer, der die Anwendung aussieht, als würden wir auf Seiten navigieren. Nun, wir können sagen, dass wir es tatsächlich sind. Technisch gesehen ist das nur das Entfernen von HTML und Einfügen von neuem HTML auf der Seite und das Ändern des URL-Segments, das war's. In herkömmlichen Apps wird die Seite aktualisiert, wenn Sie auf eine andere Seite klicken , und in diesem Fall haben Sie eine echte, sagen wir Seite-zu-Seite-Navigation. Hier bei der etwas so genannten clientseitigen Navigation bedeutet clientseitige Navigation, dass wir tatsächlich mithilfe von JavaScript durch Seiten navigieren. Lassen Sie uns nun die Änderungen, die wir vorgenommen haben, übernehmen. In der App werde ich sie vielleicht einfach behalten. Bewahren wir es zum späteren Nachschlagen auf. Wir werden jsx addieren, wir werden home hinzufügen, wir werden alles zur Bühne hinzufügen, wir haben React Router installiert und schließlich werden wir alles übernehmen und Edit, React Router dom zur App sagen oder vielleicht React Router dom installiert haben. Perfekt. Wir sehen uns im nächsten. 61. 05 Layouts und Navigation zwischen Seiten: Hallo nochmal. In diesem Video werden wir über Layouts sprechen, wie wir sie verwalten können und was die Layouts überhaupt sind. Im letzten Video haben wir den React-Router installiert und sagen wir konfiguriert. Dies ist die Routing-Lösung , die wir für unsere App verwenden werden. Jetzt werden wir sehen, wie wir Layouts tatsächlich anwenden können , da wir eine Sternseite und eine Indexseite haben und sagen wir, sie haben ein gemeinsames Layout. Auf beiden Seiten wollen wir die Navigation sehen. Was wir tatsächlich tun können, wir können zu einer Home-Komponente gehen und den Link hier platzieren. Dann gehen wir zur markierten Komponente und setzen den Link hier ein, aber das ist eine Menge Wiederholung. Wir wollen nur ein gemeinsames Markup haben , das wir an einer Stelle platzieren und es wird überall angezeigt. dieses Beispiel ansehen Wenn wir uns dieses Beispiel ansehen und zur Dokumentation zurückkehren, wenn wir zu Main Concepts, Rendering gehen, ist dies die Stelle, an der wir das Markup aus dem letzten Video übernommen haben . Wir können etwas namens Layout Routes sehen. Wenn Sie es hier lesen, heißt es im Grunde, dass dieses Routenelement hier, das andere Routen umschließt, nur eine Komponente ist , die den zugrunde liegenden Routen ein gewisses Layout verleihen kann. Es stellt nicht die Seite selbst dar. Pager werden nur durch Routen dargestellt, die hier die Pfadeigenschaft definieren. Um das Layout zu erreichen, können wir diesem Ansatz folgen. Wenn wir das Layout zwischen der Homepage und der markierten Seite teilen müssen , können wir sie wie hier in die Route einbauen. Also lass uns weitermachen. Wir werden eine Routenkomponente erstellen. Wir werden die Homepage und die Seite mit den Sternen auf diese Weise einwickeln . Wir können das Element als einzelne Requisite ohne Pfadrequisite angeben . Hier ist unser Layout, das wir gerne für diese Seiten sehen würden. Wie werden wir das schaffen? In der Sortierung würden wir einen neuen Ordner erstellen und ihn Komponenten nennen. Hier platzieren wir eine neue Komponente, die wir MainPageLayout oder MainLayout nennen. Hier werde ich das Hauptlayout erstellen. Dann exportiere es von hier, exportiere Standard, MainLayout. Fantastisch. Jetzt importieren wir dieses Layout aus den Komponenten MainLayout. Dann verwenden wir anstelle des Seitenlayouts das Hauptseitenlayout. Aber wie genau funktioniert es? Denn wenn ich mein Hauptlayout öffne, ist es komplett leer. Da ist nichts drin. Was wird also gerendert? Lass es uns versuchen und sehen. Wenn wir jetzt zur App zurückkehren , ist unsere App leer. Nun, was passiert? Die Sache ist, wenn Sie sich erinnern, dass wir in React etwas namens Children Prop haben. Wenn wir eine Komponente definieren und sagen wir so etwas wie MainLayout und innerhalb übergeben wir etwas, was auch immer wir innerhalb dieser Komponente zwischen öffnender und schließender Klammer übergeben , es wird als untergeordnetes Requisit verfügbar , das wir innerhalb des JSX-Markups innerhalb dieser Komponente verwenden können. Mit dem React-Router sieht es jedoch nicht so aus. Wir geben keine Kinder weiter, weil wir es als selbstschließende Komponente weitergeben. Also, wie funktioniert es? Wenn wir hier in PageLayout nachschauen, müssen wir nach etwas suchen, das Outlet heißt. Hier auf der rechten Seite befindet sich der Abschnitt Outlet. In diesen Komponenten, die Layouts darstellen, wird Outlet verwendet . Sie repräsentieren im Grunde die Kinder, zumindest das Konzept ist dem von Kindern sehr ähnlich. Ich akzeptiere diese Reihe von Routen. Dieses Element hat das Hauptlayout. Aber da wir hier keinen Zugriff auf Kinder haben, müssen wir diese MainLayout-Komponente trotzdem irgendwie wissen lassen , dass wir rendern wollen, was auch immer drin ist. Dafür hat der React-Router diese Komponente namens Outlet. Outlet ist im Grunde wie Kinder, aber für alle Routen, die innerhalb dieser Routenkomponente passiert werden . Nun, es ist verwirrend. Lass es mich dir einfach zeigen. Wir importieren etwas von Reaction for Dom und dieses Etwas wird sich als Outlet herausstellen. Anstatt Kinder zu schreiben, ist Outlet der Ersatz. Wir benutzen keine Kinder, wir benutzen nur Outlet. Einfach so. Hier oben in unserem Outlet werden wir sagen, dass es sich um geteiltes Markup handelt. Ich speichere es. Ich gehe zurück und Sie können sehen, dass das, was hier gerendert wird, dies ist geteiltes Markup und dann ist dies eine mit Sternen versehene Seite. Im Grunde steht Outlet hier für alles, was wir innerhalb dieses Layouts passieren wie es durch die Routenkomponenten definiert ist. Wenn wir jetzt nach Hause gehen, werden wir genau das gleiche Bild sehen. Wir haben das ist geteiltes Markup. Jetzt werden wir fortfahren und eine Navigation hinzufügen , die auf allen Seiten geteilt wird. Innerhalb der Komponenten werde ich eine neue Komponente erstellen, die ich Navs nennen werde. Vorerst wird es wieder wie immer div sein, was etwas aussagt und dann standardmäßig Navs exportieren. Großartig. Dann befindet sich in main statt dessen Shared Markup, wir werden die Navs-Komponente anzeigen. Auch hier können Sie sehen, dass ich angefangen habe zu tippen, mein Cursor ist am Ende. Ich habe das Drop-down-Menü mit den Informationen und wenn ich „Tab“ drücke , wird es jetzt automatisch importiert. Seien Sie damit jedoch vorsichtig. Dies ist eine sehr wichtige Funktion, ich würde sagen, da sie die anderen Dateien problemlos importieren kann , nicht genau das, was Sie erwarten. Seien Sie vorsichtig damit und überprüfen Sie immer Ihre Eingaben. Wir sind hier unter Navs. In Navs möchten wir die Navigation anzeigen. Wir werden uns den Code holen , den wir bereits auf der Homepage haben. , dass wir die Link-Komponente Sie erinnern sich, dass wir die Link-Komponente verwenden, um zwischen den Seiten zu navigieren, wenn wir clientseitige Bibliothek React-Router-dom verwenden. Ich werde den Import-Link von React-Router-Dom kopieren. Ich werde es in Navs platzieren. Hier müssen wir die Navigation anzeigen . Wie werden wir das machen? Zunächst müssen wir unsere Schaltflächen definieren, auf die wir klicken und zwischen den Seiten wechseln werden. Lassen Sie uns fortfahren und unsere Anordnung von Schaltflächen definieren, eine Reihe von Elementen, die unsere Links sein werden. Dann werden wir diese Links genau so dem JSX-Markup zuordnen, wie wir es mit der Geschichte in Tic-Tac-Toe getan haben. Hier außerhalb von Navs werde ich eine Komponente erstellen, werde ich eine Komponente erstellen weil wir eine Komponente kennen, nur eine Variable namens Links. Es wird eine Reihe von Objekten sein und jedes Objekt wird die folgende Form haben. Es wird Text haben, und das muss es auch. Das wird etwas sein , das wir an die Link-Komponente übergeben werden , und Text ist der angezeigte Text. Der Text wird zu Hause sein. Es geht zur Route, zur Homepage. Dann fügen wir hier ein weiteres Objekt hinzu. Wir werden es Starred nennen. Es wird uns zur markierten Route führen. Jetzt müssen wir dieses Array nehmen und es als JSX-Markup markieren. Also hier, in Navs, können wir anstelle von div ein UL-Element anzeigen, oder vielleicht innerhalb von div werden wir UL anzeigen, lassen wir es so belassen. Innerhalb dieser UL werden wir nun unsere Links kartieren. Also werde ich hier geschweifte Klammern öffnen. Ich werde es Links.Map sagen. Jetzt nehmen wir den Gegenstand. Nennen wir das Objekt, das wir zuordnen, als Objekt. Wir werden es dem Element li zuordnen. In diesem li-Element, werden wir sagen, zeigen Sie bitte item.text an und als Schlüssel, weil Sie sich daran erinnern, dass wir, wenn wir Elemente immer dem JSX-Markup zuordnen , dem Wrapping-Element eindeutigen Schlüssel übergeben müssen, der das Element innerhalb des JSX-Markups identifiziert, das zugeordnet wird . In unserem Fall ist das URL-Segment , das wir hier verwenden, also für jedes Element einzigartig, oder es kann Text sein. Aber lassen Sie uns zum Schlüssel übergehen. Item to wird unser Element identifizieren. Wir müssen es auch in einen Link verwandeln. Wir verwenden dafür die Link-Komponente, die wir aus React-Router-dom importieren. Anstelle des Elementtextes werden wir also den Artikeltext verknüpfen. Für den Queue Prop Inside Link Opponent geben wir item.to weiter. Es wird so aussehen. Jetzt kehren wir zur App zurück und was wir sehen, sehen wir Navigation. Wenn wir auf Starred klicken, gehen wir zur Starred Seite. Wenn wir auf Home klicken, gehen wir zu Home. Cool, nicht wahr? Herzlichen Glückwunsch, jetzt haben wir die Navigationskomponente, die ziemlich cool funktioniert, und wir haben Layouts verwendet, um das zu verwalten. Lassen Sie uns jetzt die Homepage aufräumen und den Link hier entfernen und einfach Home sagen. Jetzt sieht es so aus. Fantastisch, nicht wahr? Vielleicht lassen Sie uns hier weitermachen und einen Titel hinzufügen. Lassen Sie uns hier eine neue Komponente erstellen und sie Title oder, sagen wir, AppTitle nennen. Lassen Sie uns von hier aus einen anderen Ansatz verfolgen, da wir immer eine Funktion erstellt und diese dann standardmäßig exportiert haben . Stattdessen können wir einfach Exportstandard sagen und dann die Funktion und was sie sagt, sehen wir uns an, dass der Komponentendefinition der Anzeigename fehlt , natürlich. Also, was es will, dass wir tun, es will, dass wir so etwas tun. Funktion AppTitle. Weil es möchte, dass wir eine Funktion exportieren, die tatsächlich einen Namen hat, nicht nur eine solche anonyme Funktion, sondern mit dem Namen. Das ist in Ordnung. Das wird den Code etwas deklarativer machen. Manchmal hilft es, Fehler aufzuspüren , die von verschiedenen Funktionen herrühren können. In unserem Fall wird dies nicht der Fall sein. Aber lassen Sie uns trotzdem mehr über die JavaScript-Syntax erfahren. Nennen wir es so. Hier können wir also anstelle von Navs und Outlet den H1-Titel anzeigen. Titel wird also die Requisite sein , die wir erhalten werden. Da wir begonnen haben, uns eingehender mit der JavaScript-Syntax zu befassen, wenden wir die Destrukturierung erneut eingehender mit der JavaScript-Syntax zu befassen, an einer anderen Stelle an, anstatt sie zu destrukturieren . Also erhalten wir das Requisiten-Objekt. Hier, in der nächsten Zeile, werden wir die Destrukturierung anwenden, anstatt das direkt in die Argumente einzubetten. Wir werden uns also sowohl den Titel als auch den Untertitel schnappen. Untertitel befindet sich innerhalb des Absatzes, des Untertitels, und lassen Sie uns diese AppTitleComponent im Hauptlayout direkt unter den Navs verwenden . AppTitle, wieder IntelliSense und Tab und Boom, es wird importiert. Mal sehen, wie es aussieht. Ich sehe nichts oder habe ich etwas verpasst? Lass mich sehen. Nein, habe ich nicht. Eigentlich habe ich es getan. Wenn ich mir das Markup ansehe, kann ich sehen, dass ich mein Markup habe, aber es ist leer. Nun, was passiert dort? Weil, naja, Sie haben es vielleicht bemerkt, aber ich habe den AppTitle ausgeführt, ohne dass irgendwelche Requisiten übergeben wurden. AppTitle rendert jedoch Titel und Untertitel. Weil wir sie nicht bestanden haben, sind sie leer. Das bedeutet, dass sie undefiniert sind. Der Titel ist undefiniert, der Untertitel ist undefiniert, weil wir sie erneut nicht bestanden haben. In diesem Fall müssen wir sie entweder weitergeben, hallo und etwas anderes. Bumm, jetzt ist es hier, es wurde angezeigt, alles funktioniert. Aber hier ist eine Alternative. Nehmen wir an, wir haben Situationen in denen wir aus irgendeinem Grund überhaupt keine Requisiten weitergeben . Vielleicht haben wir diese Komponente, die an mehreren Stellen wiederverwendet wurde , oft, was auch immer, und nicht immer, wenn wir Requisiten weitergeben. Aus diesem Grund können wir hier in Components genau dasselbe tun, da Komponenten nur Funktionen sind und wir wissen, dass wir Standardargumente auf Funktionen anwenden und wir wissen, dass wir Standardargumente können. Aus dem Requisitenobjekt wird also immer ein Requisitenobjekt definiert, es ist zumindest leer. Von diesem Objekt lenken wir Ihren Titel ab, Untertitel, die für dieses Objekt nicht definiert sind , weil wir keine Requisiten übergeben haben. Aber wir können Standardwerte für sie anwenden. Wenn wir standardmäßig keinen Titel übergeben, es Box Office und Untertitel, Filmsuche, oder nennen wir es vielleicht, suchen wir einen Film oder einen Schauspieler? Nur eine Frage, so etwas. Unsere endgültige Struktur wird so aussehen. Wenn wir hineinschauen, können Sie sehen, nun, sie werden angewendet. Wenn ich zum Hauptlayout zurückkehre, nun, Sie können sehen, dass ich nichts übergebe, aber ich habe immer noch meine Standardwerte. Wenn ich es ändern oder überschreiben möchte, würde ich sie einfach sofort weitergeben und sie werden funktionieren. Da wir sie jedoch standardmäßig hier in AppTitle definieren , werden wir hier nichts an Requisiten weitergeben. Lass es uns tatsächlich auf Navs legen. Also sieht es so aus. Fantastisch. Also ich denke , das war's für das Video. Wir haben tatsächlich viel getan und viele neue Konzepte behandelt. Wir haben Layouts behandelt, wie wir Layouts verwalten können , die auf mehreren Seiten geteilt werden können. Wenn wir hineinschauen, verwenden wir diese Outlet-Komponente, die den Ersatz für Kinder darstellt, aber für die Routendefinition , die wir hier haben. Dann haben wir auch behandelt, wie wir mithilfe der Link-Komponente eine Navigation erstellen und sie in einem gemeinsamen Markup anzeigen können mithilfe der Link-Komponente , ebenso wie Titel und Standardargumente, Standardwerte für die Argumente oder für die Requisiten. Bisher sieht es gut aus. Lassen Sie uns alles festlegen und dieses Video mit einer guten Note beenden. Also werde ich die App beenden. Ich werde alles mit einer Nachricht begehen. Ich nenne es „Navigation und geteiltes Layout für Start - und Startseiten hinzugefügt “. Unglaublich. Wir sehen uns im nächsten. 62. 06 Eingänge: Hallo nochmal. Im letzten Video haben wir Layouts und Navigation in unserer Anwendung verwaltet. Es sieht ziemlich cool aus. Jetzt können wir zwischen verschiedenen Seiten navigieren. Wir wissen, wie man Routen erstellt. Unser nächster Schritt hier ist das Tags-Feld , das wir auf der Homepage haben , in das wir etwas eingeben, dann klicken wir auf die Schaltfläche. Dann nehmen wir den Text aus der Textbox und senden ihn an ein Backend, das uns Daten zurückgibt. Bevor wir das alles implementieren können, müssen wir jedoch verstehen, wie wir Eingaben in React verwalten können. In diesem Video werden wir genau das tun. Gehen wir also zur Home-Komponente und erstellen wir hier eine einfache Texteingabe. Nichts Schickes. Wenn wir zu Home gehen, haben wir jetzt dieses leere Element hier, ein leeres Textfeld. Dagegen können wir nicht viel tun. Was ist, wenn ich einen Mehrwert daraus ziehen möchte? Wie kann ich das machen? Denn, nun, in Zukunft werden wir hier eine Schaltfläche hinzufügen und wenn wir auf diese Schaltfläche klicken, müssen wir den Wert dieser Eingabe irgendwie umschließen. Von Tic-Tac-Toe wissen Sie, dass wir den Status immer dann verwenden müssen , wenn wir einen Wert haben, der sich im Laufe des Lebenszyklus der Komponente ändert . Immer wenn wir etwas in die Eingabe eingeben, ändert sich dieser Wert. Aus diesem Grund werden wir React verwenden, State Hook verwenden. Also lass uns weitermachen. Von React werden wir wie zuvor neu zurückkehren. Also rufen wir usstate hook und müssen darin den Standardwert übergeben , der anfänglich der Wert für unseren Status ist, wenn die Komponente gemountet wird . Da es ein Eingabeelement sein wird und das Eingabeelement immer eine Zeichenfolge ist und wenn wir nichts darin haben, geben Sie nur leere Textbücher ein, es ist immer noch eine Zeichenfolge, aber leer. Deshalb werden wir hier eine leere Zeichenfolge übergeben. Der Grund dafür ist, dass, wenn wir für usstate nichts angeben, wir es einfach so nennen. Standardmäßig Anfangszustandswert undefiniert. Wie Sie sich erinnern, gibt usstate ein Array mit genau zwei Elementen zurück , wobei das erste Element der Zustand selbst ist. Also nennen wir diesen Zustand Eingabewert. Die Status-Aktualisierungsfunktion wird als Eingabewert gesetzt. Nun, wie können wir tatsächlich auf diese Updates warten , indem wir etwas in das Textfeld eingeben? Wenn Sie sich erinnern, haben wir Ereignisse für jedes HTML-Element verfügbar. Sie beginnen also mit dem Präfix on. Wenn wir uns also mit Eingaben befassen, müssen wir das onChange-Ereignis verwenden. Für dieses OnChange-Ereignis übergebe ich also einen Event-Handler und lassen Sie uns sehen, was wir haben und wann dieses Ereignis ausgelöst wird. Ich werde hier eine Funktion erstellen , nenne sie onInputChange. Wenn Sie sich erinnern, erhalten alle Event-Handler immer das Ereignisobjekt als erstes Argument. Ich werde einfach das Ereignisobjekt auf der Konsole protokollieren und dann onInputChange als OnChange-Ereignishandler übergeben. Wenn ich nun in die Eingabe tippe, kann ich sehen, dass jedes Mal etwas in der Konsole protokolliert wird , und wenn ich dieses Objekt erweitere, habe ich hier die Zieleigenschaft , an der wir interessiert sind. Ereignisziel stellt also das Ziel dieses Ereignisses dar. In unserem Fall wird dies das Eingabeelement selbst sein . Wenn ich es hier erweitere, habe ich eine Werteigenschaft, die den Wert darstellt, den das Eingabeelement zu einem bestimmten Zeitpunkt hat. Deshalb können wir weitermachen und das Ereignisziel auf der Konsole protokollieren. Lassen Sie uns zunächst das Ereignisziel betrachten, um noch einmal zu sehen , dass das Ereignisziel bei jeder Eingabe unser HTML-Eingabeelement darstellt. diesem Eingabe-HTML-Element haben wir diese Werteigenschaft, die jeweils den Eingabewert darstellt. Immer wenn ich tippe, sehen Sie, dass wir jetzt auf den Wert zugreifen können , den wir in der Textbox haben. Ziemlich cool. Jetzt können wir den eingegebenen Wert setzen, den Zustand der Daten in diesen Datenzustand übertragen. Wir können den Zielwert des Ereignisses übergeben, um den Status festzulegen. Jetzt aktualisieren wir bei jeder Eingabe den Status mit dem Zielwert des Ereignisses. Großartig. Nun, wie wir tatsächlich sehen können , dass dieser Eingabewert das ist was wir in Lehrbüchern schreiben. Wie Sie sich erinnern, können wir es einfach hier ablegen, Konsole protokollieren und überprüfen, da das Status-Update die Komponente veranlasst, erneut einzutreten, und wenn Komponenten gemietet werden, wird Komponente veranlasst, erneut einzutreten und wenn Komponenten gemietet werden, darin enthaltene JavaScript erneut ausgeführt und bei jedem erneuten Eingeben sehen wir das Konsolenprotokoll. Lass es uns versuchen. Immer wenn ich jetzt tippe, kann ich tatsächlich home.jsx6 in Zeile 6 sehen. Ja, ich habe dieses Konsolenprotokoll, was bedeutet, dass die Komponente erneut eingegeben wird, unser Status wird entsprechend der Eingabe aktualisiert. Mit diesem Ansatz haben wir ein Problem. Was Sie hier sehen, wird als unidirektionale Datenbindung bezeichnet. In Bibliotheks-Frameworks wird es also immer dieses Konzept der einseitigen Datenbindung oder der bidirektionalen Datenbindung geben. Was bedeutet das? Mit diesem Ansatz haben wir also die unidirektionale Datenbindung eingeführt, wir warten auf Änderungen in der Textbox und aktualisieren den Status. Wenn wir jedoch den Status aktualisieren, aktualisieren wir den Wert der Eingabe nicht. Versuchen wir zu sehen, was ich meine. Wenn wir diesen Eingabewert also irgendwo auf der Seite anzeigen möchten, können wir einfach die Interpolation verwenden. Einfach so. Wir wissen bereits, was zu tun ist. Wir haben hier einen Eingabewert. Lass uns einfach sehen, ob es funktioniert. Immer wenn ich tippe, wird es in J6 interpoliert und angezeigt. Ziemlich cool. Wie können wir überprüfen, ob es sich um eine einseitige Datenbindung handelt? Ich werde hier eine Schaltfläche mit der Schaltfläche „Typ“ erstellen und diese nach dem Zufallsprinzip aktualisieren. Zum Entklicken sage ich, setzen Sie den Eingabewert bitte auf so etwas wie meinen Namen. Mal sehen, was wir haben. ich also tippe, wird mein Status aktualisiert, aber wenn ich auf „Auf Zufallsprinzip aktualisieren “ klicke, der Text in der Eingabe jedoch nicht aktualisiert. Also, was passiert hier genau? Die Sache ist, bis wir eine unidirektionale Datenbindung haben, binden wir die Änderungen , die wir innerhalb von Lehrbüchern vornehmen, an den Zustand, aber wir haben den Zustand nicht an das Textfeld gebunden, an die Eingabe. Um das zu beheben, müssen wir ein Wertattribut an das Eingabeelement übergeben , sodass jeder Wert innerhalb des Zustands, den wir haben , zugeordnet wird an den Wert von Textbox gebunden wird. Für das Wertattribut übergebe ich also den Eingabewert. Mal sehen, ob ich hier etwas eintippe und dann auf „Auf Zufall aktualisieren“ klicke, jetzt wurde der Text nicht nur hier aktualisiert, sondern er wurde auch innerhalb des Eingabeelements aktualisiert. Denn jetzt haben wir eine bidirektionale Datenbindung. Wenn wir den Status aktualisieren, wird das Textfeld aktualisiert, und wenn wir das Textfeld aktualisieren, wird der Status aktualisiert. Es ist bidirektional, funktioniert in zwei Richtungen, anders als wir es zuvor getan haben. Wenn wir den Wandel vorantreiben und hier nur Werte beibehalten , wird es genauso sein. Es wird eine einseitige Datenbindung sein. Wir haben hier diesen Fehler, der besagt, dass Sie eine Value-Prop ohne einen onChange-Handler angegeben haben. Sogar React sagt dir, dass hier etwas nicht stimmt. Wie Sie sehen, kann unidirektionale Datenbindung sehr schwierig sein. Sie müssen sich also immer daran erinnern , was am besten zu Ihnen passt. Ich würde sagen, dass Sie in den meisten Fällen möglicherweise nicht einmal bemerken, dass eine unidirektionale Datenbindung Ihre Probleme mit sich bringen kann , und in den meisten Fällen wird dies auch nicht der Fall sein. bidirektionale Datenbindung ist jedoch wichtig, und Sie müssen den Unterschied verstehen und wissen, wie Sie ihn nutzen können. Bisher haben wir in diesem Video gelernt, wie man den Status mit Eingaben verwaltet. Wie wir sie für Änderungen innerhalb des Eingabeelements und des Aktualisierungsstatus verwenden können . Wir haben auch gelernt, was einseitige Datenbindung ist, was bidirektionale Datenbindung ist und was der Unterschied zwischen ihnen und warum eine einseitige Datenbindung schwierig sein kann. Es ist immer besser, die bidirektionale Datenbindung zu verwenden , wenn Sie sich nicht sicher sind. Ich denke, das ist es. Jetzt weißt du im nächsten Video alles, was wir brauchen. Wir werden hier einen Button erstellen. Wir nehmen alles, was wir in das Textfeld schreiben , und senden es an die API. Mal sehen, wie es ausgeht. Wir sehen uns dort. 63. 07 Formular Einreichung: Hallo, da. Wie Sie sich erinnern, haben wir im letzten Video über Eingaben gesprochen, wie wir Eingaben verwalten können, wie wir Eingabewerte an Zustände binden können und über den Unterschied zwischen bidirektionaler und unidirektionaler Datenbindung. In diesem Video senden wir Daten, die wir in ein Textfeld schreiben, an eine API und wir erhalten die Ergebnisse der API zurück, sodass wir dem Benutzer etwas in unserer Anwendung anzeigen können . Im letzten Video haben wir das alles in Home.jsx gemacht. Eigentlich können wir es behalten, wir platzieren einfach diese Schaltfläche hier, direkt unter der Eingabe, damit wir Text eingeben können. Wir haben bereits InputValue und wir haben onInputChange. Vielleicht können wir es so etwas wie searchString nennen, weil es im Grunde unsere Suchzeichenfolge für Suchergebnisse sein wird . Wir können den Status in searchString, searchs-t-R umbenennen searchString, searchs-t-R und searchs-T-R setzen. Wir müssen es nicht ausgeben, Wert wird searchString sein und onChange wird onSearchString oder onSearchInputChange sein , und wir werden searchString aktualisieren. Dann werden wir diese OnClick-Schaltfläche vollständig entfernen. Wir werden diese beiden in ein Formular packen und dann das onSubmit-Attribut des Formulars nutzen. Eigentlich formen sie in React, sie funktionieren etwas anders. In Single-Page-Apps arbeiten Sie mit Formularen etwas anders als in herkömmlichen Apps. Wenn Sie in herkömmlichen Apps auf „Senden“ klicken und ein Formular haben, müssen Sie hier eine Aktion definieren , die Sie auf eine andere Seite bringt. Wenn Sie auf „Senden“ klicken, wird der Benutzer weitergeleitet und die Daten werden an eine andere Seite gesendet. In Single-Page-Apps und modernen Web-Apps wird es nicht so verwaltet. Wie wird es dann verwaltet? In das Formular geben wir die onSubmit-Methode ein, und diese onSubmit-Methode wird die Funktion sein , die wir onSearch aufrufen. Auch hier haben wir das Event-Objekt, da es sich um einen Event-Handler für das Submit-Ereignis handelt. Lassen Sie uns versuchen und vorerst nichts tun, was für onSubmit onSearch gilt. Auch hier gilt: Da es sich um ein Formular nicht um einen Button handelt, müssen wir angeben, dass dieser Button vom Typ Senden sein soll, damit wir das Formular müssen wir angeben, dass abschicken können. Wenn wir darauf klicken, wird das Formular tatsächlich gesendet, und anstatt es nach dem Zufallsprinzip zu aktualisieren, wird gesucht. So etwas. Versuchen wir also zu sehen, ob ich hier etwas tippe und wenn ich „Enter“ drücke oder wenn ich auf „Suchen“ klicke, lass mich „Enter“ drücken. Siehst du, dass die App aktualisiert wurde? Sie können sehen, dass die Seite aktualisiert wurde. Jetzt habe ich dieses Fragezeichen oben. Das liegt daran, dass wir das Formular nicht richtig bearbeitet haben, weil es der Meinung ist, dass das Formular weil es der Meinung ist, dass das Formular, die Aktion, von einer anderen Seite bearbeitet werden muss. Es versucht, auf eine andere Seite umzuleiten, um Daten zu übermitteln. Genau wie bei einem Tool in modernen Web-Apps wird das Formular jedoch nicht so behandelt. Damit onSubmit die Seitenaktualisierung verhindert, müssen wir die Aktion verhindern, die das Submit-Ereignis ausführt. Dafür nennen wir Event-Prevent Default. Durch den Aufruf dieser Methode verhindern wir das Standardverhalten dieses Ereignisses. Wenn ich die Seite aktualisiere, lasse mich das Fragezeichen oben entfernen. Jetzt tippe ich etwas, ich klicke auf „Enter“. Du siehst, dass nichts passiert. In unserem Fall müssen wir, anstatt dass nichts passiert, tatsächlich Daten an die API senden. Was wird die API sein? Wie werden wir das schaffen? Wo fangen wir an? Wenn wir hier raten und zu Ressourcen scrollen, finden Sie die TVMaze API hier. Öffnen wir diesen Link. Die TVMaze API ist eine öffentliche API, die uns Informationen über verschiedene Filme und Schauspieler geben kann . Es ist völlig kostenlos und hat ein unbegrenztes Kontingent, und es ist öffentlich. Sie können einfach diese URL öffnen und der Dokumentation folgen. Es ist ziemlich gut dokumentiert mit guten Beispielen und guten Erklärungen für die Endpunkte, die es hat. Was uns interessiert, ist eigentlich der allererste Absatz hier, dem „Suche anzeigen“ steht. Es hat diese URL und hier ist ein Beispiel. Versuchen wir, das in einem neuen Tab zu öffnen. Wie Sie sehen können, haben wir hier Daten. Wir greifen einfach darauf zu und wir bekommen Daten zurück. Wenn Sie sich die URL ansehen, wir hier den Parameter q, query string an, und wenn ich ihn in etwas anderes ändere, geben wir hier den Parameter q, query string an, und wenn ich ihn in etwas anderes ändere, erhalte ich je nach Suchzeichenfolge unterschiedliche Ergebnisse. Dieser Q-Parameter ist im Grunde die Suchzeichenfolge. Sie können darüber in der Beschreibung der Funktionsweise dieses Endpunkts nachlesen . Wir werden diesen Endpunkt in unserer App verwenden. Gehen wir zurück und legen es hier ab. Ich werde es einfach kommentieren. Jetzt haben Sie vielleicht eine Frage. Wie senden wir eine Anfrage an diese API? Nun, wir können im Browser darauf zugreifen, aber wie können wir das in der App machen? Nun, im Browser haben wir eine Web-API namens Fetch. Abruffunktion ist in der Browserumgebung global verfügbar, sodass wir sie in JavaScript verwenden können. Fetch sendet eine Anfrage an die angegebene URL. Wir können diese URL nehmen, wir können Fetch aufrufen. Auch hier handelt es sich um eine Funktion , die Anfragen sendet und global im Browser-JavaScript verfügbar ist. Wir rufen diese Fetch-Funktion hier auf und übergeben die URL darin. Ich klicke auf „Enter“ und wie Sie sehen können, wird uns ein Versprechen zurückgegeben, ein Versprechensobjekt. Das bedeutet, dass wir angefangen haben, mit asynchronem JavaScript zu arbeiten. Hier fängt es an, interessant zu werden. Um einen Nutzen aus dem Versprechen zu ziehen, müssen wir dieses Versprechen abwarten oder es lösen. Im Moment verwenden wir hier die Syntax.then. Diese Fetch-Funktion löst das Antwortobjekt auf. Das Versprechen, das von Fetch zurückgegeben wurde, führt zu dem Antwortobjekt, das die Antwort auf diese Anfrage darstellt . Nennen wir es so. Ich nenne es Antwort und versuchen wir es mit der Antwort console.log. Dies ist das Antwortobjekt, das wir haben. Es stellt den Status der Antwort, die verwendete URL, die Header und einige verschiedene Dinge hier dar. Aber auch für dieses Antwortobjekt ist die Methode.JSON als Antwort auf JSON verfügbar. Es ist auch eine Methode , die ein Versprechen zurückgibt. Das Versprechen wird an den Antworttext weitergeleitet. Was Sie hier im Browser sehen, ist der Antworttext. Es ist im Grunde das, was vom Server zurückgegeben wird, die Antwort, also erhalten wir sie im JSON-Format. Deshalb nennen wir die JSON-Methode. Auch hier gibt es ein Versprechen zurück, das an den Körper weitergegeben wird. Was werden wir tun? Wir werden hier von Anfang an multiple dense verketten Dann rufen wir die Methode.JSON für das Antwortobjekt auf. Dann geben wir das Versprechen von.then callback zurück, das heißt beim nächsten. Dann wird es gelöst. Als nächstes drin. Dann haben wir unsere Payload oder unseren Antworttext. Nennen wir es body und console.log body. Nun, diese Zeichenfolge gab uns dieses Array von 10 Elementen. Wenn wir es erweitern, können Sie sehen, dass dies die Daten sind, die wir hier im Browserfenster haben. Cool. Aber jetzt verwalten wir das programmgesteuert mit der Fetch-API. Genau das Gleiche können wir nicht nur hier, sondern in unserem Code tun , denn was wir hier schreiben, wird clientseitiges Browser-JavaScript sein und wir haben hier direkt im Browser damit gespielt hier direkt im Browser aber es spielt immer noch keine Rolle. Dies war nur, um Ihnen einen Überblick zu geben , wie das sein wird. Aber wir werden es hier in unserem Code machen. In onSearch werden wir diese Fetch-API tvmaze.com/search/shows nennen . Anstatt die Syntax der.then zu verwenden, können wir jetzt async-await verwenden, um sie lesbarer zu machen. Um Await verwenden zu können, wenn Sie sehen, dass ich mit dem Mauszeiger darauf fahre, heißt es, Wait-Ausdrücke nur innerhalb von Sync-Funktionen erlaubt sind was bedeutet, dass wir diese Funktion als Sync markieren müssen, und jetzt verschwindet die Nachricht. Wir warten auf Fetch, dann bekommen wir eine Antwort. Dann haben wir body von await response.json. Wenn ich hier eine Antwort eingebe und „Punkt“ drücke, können Sie sehen, dass ich jetzt IntelliSense habe, was mir die JSON-Methode gibt. Wenn ich es anrufe, können Sie sehen, dass das Fenster geöffnet wird, was bedeutet, dass es versprochen ist. Jetzt haben wir eine Leiche. Wenn wir versuchen, den Logtext hier zu löschen und zu unserer Anwendung zurückkehren, wo ist er? Hier. Eigentlich ist es egal. Wenn ich hier etwas eintippe, kann ich hier Daten sehen, die von Home.jsx Zeile 16 stammen, aus unserem Konsolenprotokoll hier, was bedeutet, dass wir die Suche nur programmgesteuert durchgeführt haben. Wir senden eine Anfrage. Wenn wir hier den Netzwerk-Tab öffnen und wenn ich auf „Suchen“ klicke, können Sie sehen, dass wir eine Anfrage an die URL senden , die wir in Fetch angegeben haben, und wenn wir eine Vorschau anzeigen, erhalten wir die Daten. Fantastisch. Lassen Sie uns diese Anfrage nun dynamisch machen, da wir die Suchzeichenfolge hier haben, aber wir senden die ganze Zeit Sprache. Wir haben hier searchString angegeben, damit wir es an den Fetch übergeben können statische Zeichenfolge durch Backticks ersetzen. Anstelle von Jungs können wir hier unseren SearchString interpolieren. Lassen Sie uns nun versuchen, den Konsolenprotokolltext zu erstellen. Nochmals, ich erfrische mich. Ich tippe Mädchen. Ich klicke auf „Suchen“. Wenn ich in den Netzwerk-Tab schaue, kann ich sehen, dass ich Suchsendungen sende, die Mädchen abfragen. Wenn ich etwas anderes tippe, können Sie sehen, dass es etwas anderes sein wird. Wenn ich Kauderwelsch tippe, wird es Kauderwelsch sein. Unsere Anfrage ist dynamisch. Wie cool ist das? Jetzt wissen Sie, wie wir Daten abrufen können. Sie können sehen, dass jetzt alles zu einem einzigen Stück dieser wenigen Linien verbunden ist . Großartig. Wir verwenden die TVMaze API. Du kannst es durchlesen. Es ist ganz einfach mit guten Beispielen, einfach schnell das Kästchen überfliegen. Im nächsten Video werden wir diese Funktion wiederverwendbar machen und versuchen Ergebnisse anzuzeigen, die wir hier von der API erhalten. Diesen Text werden wir versuchen, ihn in unserem JSX-Markup anzuzeigen. Lassen Sie mich die Änderungen, die wir vorgenommen haben, bestätigen. Ich klicke auf das Pluszeichen. Ich werde die App beenden und sagen, lass mich sehen, welche Änderungen ich vorgenommen habe? Nehmen wir an, suchen Sie nach Filmen oder suchen Sie mit einem Klick auf die Schaltfläche nach Sendungen. Nehmen wir an, ein Textfeld oder eine Suche hinzugefügt. Suchen Sie mit einem Klick auf die Schaltfläche nach Sendungen. So etwas. Dann lade es auf GitHub und bis zum nächsten . Wir sehen uns dort. 64. 08 Rendering von Daten von der TV Maze API: Hallo nochmal. In diesem Video werden wir endlich die Ergebnisse zeigen , die wir von der API erhalten. Im letzten Video haben wir erfahren, wie wir Daten anhand dessen, was wir in das Eingabeelement eingeben, abfragen können . Dieses Mal werden wir versuchen, die Daten anzuzeigen, die wir von der TVMaze API erhalten , mit der wir Daten abfragen. Lass uns gehen. Wenn wir zu unserem Code zurückkehren, haben wir die folgende Logik, um Daten abzurufen. Wir werden jedoch dieselbe Logik auch auf anderen Seiten verwenden . Warum erstellen wir nicht einen sehr einfachen Wrapper für diese Funktionen, damit sie einfacher in anderen Dateien wiederverwendet werden können? Was ich intern machen werde, ich werde einen neuen Ordner erstellen , den ich so etwas wie API oder vielleicht Utils nenne oder du kannst ihn nennen, wie du willst. Es geht nur darum, es vom Rest der Logik vom Rest der Datei zu trennen der Logik vom Rest der , und es wird einfacher sein, es zu finden. Hier werde ich eine Datei namens tvmaze.js erstellen, und was werde ich in dieser Datei tun? Ich werde eine wiederverwendbare Funktion erstellen, die wir ApiGet nennen werden. Dieses APIGet erhält nur den Pfadnamen der URL, also genau wie Sie es in der Dokumentation sehen. Wir werden nur dieses URL-Segment an die Funktion übergeben, und die Funktion erledigt den Rest. Anstatt dies zu tun, rufen wir einfach ApiGet auf und geben dann Suchshows und Query-Strings weiter , etwa so. Wir können jedoch noch weiter gehen und dafür einen weiteren Wrapper erstellen. Anstatt diese Funktion so zu verwenden, können wir einfach die Funktion search for shows aufrufen und dann einfach die Suchzeichenfolge übergeben, und das war's und der Rest, die ganze Logik hier, wird intern verwaltet. Ziemlich cool. Lassen Sie uns das umsetzen. Zunächst müssen wir dieses APIGet erstellen , damit wir es so verwenden können. Dieses APIGet wird eine Funktion sein , die als Versprechen zurückgegeben wird, was der Antworttext sein wird, genau wie hier. Irgendwann wird es so aussehen. Lass uns weitermachen und das tun. Wir übergeben den QueryString hier. Das erste Argument, das diese Funktion erhält , wird QueryString sein. Diese Funktion verwendet fetch diese beiden Zeilen. Ich werde sie von hier kopieren. Da wir hier das Schlüsselwort wait verwenden, beabsichtigen wir, async-await zu verwenden, also markiere ich diese Funktion als async und gebe aus dieser Funktion den Hauptteil zurück. Wir bekommen diese URL jedoch hier fest codiert. Wir können es nach draußen verschieben, um es irgendwie oben zu deklarieren, damit wir wissen, was die BASE_URL hier ist. Hier oben erstelle ich einfach eine Variable namens BASE_URL und es wird diese https://api.tvmaze.com ohne Schrägstrich sein . Dann werde ich es einfach in den Abrufaufruf BASE_URL interpretieren . Anstatt Schrägstrich-Suchshows und dann Suchzeichenfolge zu verwenden , wende ich einfach QueryString an, den wir als Argument übergeben, was diese Zeichenfolge mit dem führenden Schrägstrich sein wird. Stattdessen verwende ich einfach QueryString. Irgendwann wird unsere URL so aussehen. Es wird BASE_URL und der QueryString benötigt , den wir aus den Argumenten übergeben. Schließlich wird diese Art von URL gebildet. Jetzt machen wir weiter. Wir waren uns einig, dass wir weiter als ApiGet gekommen sind und zusätzlich zu ApiGet eine weitere Funktion erstellen , die wir searchForShows nennen, damit wir keine Slash-Suchshows mit Schrägstrichen weitergeben. Wenn Sie das verwalten möchten, wird es an einem einzigen Ort verwaltet , in einer einzigen Datei hier in tvmaze.js. Von hier aus werde ich exportieren, weil wir es später in der Home-Funktion namens export const searchForShows verwenden werden. Auch hier erhält diese Funktion nur den QueryString, genau das, was wir in die Eingabe eingeben. Es wird eine Abfrage sein. Nennen wir es einfach Query. Diese Funktion rufen wir ApiGet auf und sie übergibt search, shows, und die Abfrage wird eine Abfrage sein, die wir übergeben. Dies nennen wir ApiGet und was auch immer ApiGet zurückgibt, wird von searchForShows zurückgegeben. Ich verwende hier die kurze Syntax für Pfeilfunktionen. Diese Syntax ohne explizite Verwendung des Funktionstextes mit geschweiften Klammern gibt das zurück, was ApiGet zurückgibt. Dies entspricht dem Schreiben von Return ApiGet. Um es zu verkürzen, verwenden wir es so. Ich speichere es und jetzt kann ich diese searchForShows in meinem home.jsx verwenden . Ich importiere von, wir gehen eins für die höhere Ebene zurück. Wir schnappen uns api/tvmaze und wir schnappen uns SearchForShows. Jetzt können wir all das entfernen und searchForShows mit dem QueryString aufrufen , der unser searchString sein wird. So. Wenn wir die Ergebnisse sehen, nennen wir es ApiData und log ApiData und kehren zur App zurück. Was auch immer wir hier eingeben, schauen wir uns die Registerkarte Netzwerk an. Wir geben Mädchen ein, wir drücken „Enter“. Sie können sehen, dass die Anfrage korrekt gestellt wird, Anforderungs-URL ist korrekt. Es hat alles perfekt funktioniert. Wenn wir in die Konsole schauen, können wir sehen, dass in der home.jsx-Zeile 15, genau dort, wo wir unser Konsolenprotokoll haben, dieses erhalten wir. Das sind unsere API-Daten. Was können wir jetzt tun? Wir können einen anderen Zustand erstellen und alle Daten, die wir hier erhalten, wir können sie innerhalb des Zustands platzieren, denn auch hier handelt es diesen API-Daten, die wir erhalten , um Daten, die sich im Laufe des Lebenszyklus der Komponente ändern die sich im Laufe des Lebenszyklus der Komponente , weil wir nach diesen Daten suchen. Es kann leer sein, es kann nicht geladen werden, etwas könnte damit zusammenbrechen. Ich werde weitermachen und hier werde ich einen neuen Status erstellen , den wir showsResult nennen werden, oder nennen wir ihn einfach apiData und setApiData, und er wird hier state verwendet. Standardmäßig ist es ein leeres Array, oder vielleicht ist es standardmäßig null. Hier, was ich tun werde, diese variable Länge 15, nenne ich sie als Ergebnis oder Antwort. Ja, nennen wir es einfach result und ich rufe setApiData auf, und setApiData wird das Ergebnis sein. Welches Array wir auch hier erhalten, wir platzieren es in unserem APIData-Status. Dann wissen wir schon, was mit den Arrays zu tun ist. Du erinnerst dich daran. Wir können jedes Element JSX Barker zuordnen und es dann anzeigen. Was wir direkt unter dem Formular tun werden. Lass uns hier ein Div erstellen. Was wir tun werden, wir werden hier eine Funktion erstellen. Anstatt die Dotmap-Methode einzubinden oder lassen Sie uns zuerst diese Dotmap-Methode einbetten. Beim Mapping gibt es eine Sache zu beachten . Wir werden ApiData Map aufrufen. Wir haben Daten hier und im Moment werden wir sie einem einfachen Div zuordnen. Schauen wir uns an, welche Art von Daten wir hier haben. Welche Form haben Daten? Wir haben eine Reihe von Objekten. Wenn wir dieses Datenobjekt untersuchen , das dieses von mir hervorgehobene Objekt darstellt, hat es eine Score-Taste und dann die Show-Taste. In der Show haben wir einen Namen, wir haben eine ID-URL. Lassen Sie uns vorerst nur den Namen anzeigen. Wir müssen auf data.show zugreifen. Ich interpoliere data.show.name. Du musst immer daran denken , dass du die Schlüsselrequisite weitergeben musst. Der Schlüssel muss etwas Einzigartiges sein , da wir es mit API-Daten zu tun haben. API-Daten, wenn sie von beckoned stammen, haben normalerweise eine ID, und die ID steht eindeutig für das Element. ID ist das perfekte Gehäuse für die Schlüsselrequisite. Die Daten zeigen eine ID zur eindeutigen Identifizierung des zugeordneten Elements. Lass es uns versuchen. Wir gehen zur App und was haben wir hier? Wir haben bereits den Fehler, der besagt, dass die Eigenschaften von Null beim Lesen der Karte nicht gelesen werden können. Wenn ich die Seite aktualisiere, wird mir immer dieser Fehler angezeigt. Was passiert? Die Sache ist, unser Anfangszustand hier ist Null. Das bedeutet, dass beim Rendern der Komponente die Status-API-Daten Null sein werden. Da wir auf keine Schaltfläche geklickt haben, haben wir keine Ergebnisse erhalten. Der Staat ist Null. Wenn wir versuchen, Null zuzuordnen, erhalten wir diesen Fehler, weil unser Code im Grunde so aussieht, null.map. Nun, das ist falsch. Deshalb sehen wir diesen Fehler. Es heißt, Eigenschaften von Null können nicht gelesen werden, Karte wird gelesen. Was bedeutet, dass es versucht, null.map auszuführen. Wie können wir das überwinden? Wir können es auf verschiedene Arten schaffen. Der einfachste Weg, damit umzugehen, besteht darin, den Anfangszustand von Null in ein leeres Array zu ändern . Lassen Sie mich zurück zu den API-Daten kommen. Wenn wir es in ein leeres Array ändern, wir nichts sehen, wenn wir keine Daten haben , da das Array leer ist , da das Array leer ist. Denn naja, letztlich wird nichts kartografiert werden. Wenn wir zum Beispiel nach Jungs suchen und wenn wir unsere Ergebnisse von der API erhalten, wird jedes API-Element dem entsprechenden Div mit dem Namen der Sendung zugeordnet . Was ich Ihnen jedoch alternativ zeigen möchte, anstatt ein leeres Array als Standardstatus zu verwenden, können wir immer noch Null verwenden, aber wir können unsere Logik etwas anders handhaben. Gehen wir weiter und erstellen wir eine Hilfsfunktion, die wir renderApiData nennen. Anstatt die Methode.map hier direkt einzubinden, die, wie Sie sich erinnern, aufrufen wird , haben wir das bereits getan, renderApiData und wir werden eine Renderlogik bedingt innerhalb dieser Funktion verwalten . Hier erstelle ich RenderApiData. Anstatt dies zu verwenden, werde ich sagen, dass unser Anfangszustand Null ist, denken Sie daran. Wenn wir versuchen, Null anzuzeigen, erhalten wir eine Fehlermeldung, da wir Nullen nicht zuordnen können. Wir können einfach überprüfen, ob API-Daten null sind oder ob unsere API-Daten falsch sind, wir geben Null zurück. Andernfalls wissen wir, dass es definitiv ein Array sein wird , sobald es gesetzt ist. Oder vielleicht können wir die Logik umkehren, damit sie besser lesbar und besser ist. Wir können es erkennen. Wenn wir API-Daten haben und Daten wahr sind, sind sie nicht Null. Es ist zum Beispiel so etwas wie ein Array. In diesem Fall haben wir die Methode.map aufgerufen, um apiData, map, data und dann die Logik, die wir haben, zurückzugeben map, data und dann die Logik, . Andernfalls gilt standardmäßig, dass, wenn diese Bedingung fehlschlägt und unsere API-Daten falsch sind, sie hier, diese Bedingung durchfallen. Dann geben wir standardmäßig nichts zurück. Denken Sie daran, dass Nullergebnisse in Nichts innerhalb des JSX-Markups gerendert werden. Wenn wir zur App zurückkehren, können Sie sehen, dass nichts angezeigt wird. liegt daran, dass unsere API-Daten anfänglich auf Null gesetzt sind. Deshalb rendern wir Null. Aber sobald ich nach der API suche, habe ich meine Daten hier. Fantastisch. Immer wenn ich die Abfrage ändere, wird sie aktualisiert. Schau dir das an, wie sieht es aus? Eine weitere Sache, die ich hier hinzufügen möchte , ist die Datenverarbeitung. Ich weiß, wir haben schon viel besprochen und es ist viel. Aber was ist mit Fehlern? Würde, wenn unsere Anfrage, die wir hier gesendet haben, wenn wir in das Netzwerk schauen, wenn die Anfrage, die wir hier gesendet haben, aus irgendeinem Grund fehlschlägt, wird ein Fehler ausgelöst. Was passiert in diesem Fall? Wir können diesen Fehler tatsächlich bei der Suche nach Shows oder in API-Daten emulieren . Anstatt also nur die API-Suche durchzuführen, können wir einfach einen Fehler auslösen, bis etwas Schlimmes passiert ist. Genau das passiert, wenn diese Anfrage aus irgendeinem Grund fehlschlägt, etwas Schlimmes passiert ist. Lass es uns versuchen und sehen. Wir haben unerreichbaren Code, der wiederum von eslint stammt. Eslint, du hast mir viel gerettet. Im Moment werden wir das nur kommentieren. Ich suche nach irgendwas, so etwas wie Hallo. Wenn ich klicke, passiert nichts. Aber Sie können hier in der Konsole sehen, wir haben einen Versprechungsfehler nicht erwischt , etwas Schlimmes ist passiert. In diesem Fall müssen wir uns immer daran erinnern, wenn wir uns mit asynchronem JavaScript befassen, wenn wir uns mit APIs befassen, müssen wir immer Fehler auffangen und behandeln, egal was passiert, auch wenn Sie sich über diese API sicher sind, wie großartig sie ist und Ihnen jeden Fehler einfallen können. Nun, du musst deine Denkweise ändern. Irgendwann wird etwas zu einem Fehler führen, also müssen Sie sicherstellen, dass Sie damit umgehen. In diesem Fall können wir innerhalb dieser Awart-Suche nach Sendungen das Ganze einschließen und versuchen, den Catch-Block zu finden, um etwaige Fehler abzufangen. Ich werde diese beiden Zeilen innerhalb des Versuchs verschieben. Wenn etwas im try-Block fehlschlägt, wird der Fehler im Catch-Block ausgespuckt. Wir können einen anderen Staat erstellen, und welchen Fehler wir auch immer hier erhalten, wir können ihn innerhalb des Staates platzieren. Hier oben erstelle ich den ApiDataError und den Status SetApiDataError. In der Standardeinstellung ist es ebenfalls Null. Ich werde weitermachen und innerhalb des Catch-Blocks einfach setApiDataError für jeden Fehler aufrufen , den wir hier haben. Wenn wir nun versuchen, den Protokollfehler zu stornieren , ist der Status standardmäßig Null. Aber wann immer wir einen Fehler haben, können wir sehen, dass wir das andere Objekt in unserem Staat haben. Wir können es in renderApiData verwenden und im Falle eines Fehlers jede Fehlermeldung anzeigen. Wir können feststellen, ob wir ApiDataError haben. In diesem Fall zeigen Sie bitte div an, was besagt, dass ein Fehler aufgetreten ist, und wir können ApiDataError.Message interpolieren , da unser ApiDataError das Fehlerobjekt sein wird. Lass es uns versuchen. Wenn Sie sich erinnern , dass im API Gateway etwas Schlimmes passiert ist. Wir sagen, es spielt keine Rolle. Wir klicken auf Suchen und sehen jetzt, dass ein Fehler aufgetreten ist, etwas Schlimmes ist passiert. Cool. Wir müssen uns jedoch auch daran erinnern, dass wir diesen Status aktualisieren müssen , falls wir einmal auf Suchen klicken dieser Fehler aufgetreten ist. Dann klicken wir das nächste Mal auf Suchen und dann wird die nächste Anfrage bearbeitet. Unsere API-Daten in unserem Bundesstaat hängen jedoch. Es hat immer noch seinen vorherigen Status, daher wird es angezeigt. Wir müssen sicherstellen, dass wir es vor jeder Anfrage, die wir senden, bereinigen . Wir rufen setApiDataError auf, um den Anfangszustand zu erfahren. So verwalten wir den gesamten Ablauf unserer Anfrage. Jetzt können wir einen neuen Fehler entfernen und die Logik gemeinsam verwenden. Lassen Sie uns alles noch einmal in Aktion sehen. Ich suche Mädchen, ich habe Mädchen, ich habe Jungen und ich habe alles, was ich hier tippe. Alles funktioniert wie erwartet. Falls die API einen Fehler auslöst, wird dieser hier behandelt. Wie können wir das testen? Wir können tatsächlich einfach etwas Kauderwelsch in Euro eingeben und sehen, was uns die API bietet. Ich habe Mädchen getippt. Ich klicke auf Suchen. Sie können auf der Registerkarte Netzwerk sehen, dass es jetzt rot ist. Es heißt 404, was bedeutet, dass wir etwas falsch gemacht haben. Dieser Endpunkt existiert offensichtlich nicht. Unsere API zur VMA-API hat einen Fehler zurückgegeben. In unserem Fall wurde ein Fehler zurückgegeben. Es wurde gerade eine 404-Statusmeldung zurückgegeben. Fetch verstand, dass es sich um einen Fehler handelte, aber es gab keine Fehlermeldung. Es heißt, dass der Abruf standardmäßig fehlgeschlagen ist. Wenn wir jetzt versuchen, es wieder zu ändern. Wenn wir nach Jungs suchen. Jetzt wurde alles angezeigt. Wie cool ist das? Ich finde es sieht toll aus. Wir haben alle möglichen Situationen behandelt, die schief gehen könnten. Jetzt haben wir eine ziemlich robuste Logik, nicht nur um Daten zu erstellen, sondern auch um Fehler zu behandeln, und wir zeigen die Daten an, die von der API stammen, so etwas. Ich denke, wir haben hier tatsächlich viel besprochen. Wir haben über verschiedene Staaten gesprochen, wir haben über das Abrufen von Daten gesprochen, wir haben über das Erkennen von Fehlern gesprochen, wir haben über die Anzeige von Daten gesprochen. Das ist eine Menge. Lass es uns zusammenfassen. Git hinzufügen, git commit. Nennen wir es: Daten von der TVMAZE-API abrufen und anzeigen . Erstellen Sie eine wiederverwendbare Funktion zum Abrufen von Daten. Zur wiederverwendbaren Funktion beziehe ich mich auf die Suche nach Sendungen. Fantastisch. Lassen Sie uns verpflichten und daran setzen, alles zu meistern. Wir sehen uns im nächsten. 65. 09 Fix Prettier funktioniert nicht: Hallöchen. Dieses Video wird schnell gehen, da mir gerade ein kleines Problem bei der Projekteinrichtung aufgefallen ist. Das Problem ist diese schöne Datei. Also habe ich den Dateinamen falsch geschrieben und aus diesem Grund hat der Konflikt, den wir hier angegeben haben, nicht funktioniert. Sie haben jedoch vielleicht bemerkt, als ich Dateien gespeichert habe, sie nicht mehr formativ waren. Dies liegt daran, dass wir die Prettier-Erweiterung installiert haben . Wenn diese Erweiterung die in Ihrem Projekt platzierte Konfiguration nicht finden kann, wird standardmäßig Wenn diese Erweiterung die in Ihrem Projekt platzierte Konfiguration nicht finden kann, wird standardmäßig die in Ihrem Projekt platzierte Konfiguration nicht finden kann, auf die Konfiguration zurückgegriffen, die irgendwo intern in dieser Erweiterung definiert ist. Deshalb hat es immer noch funktioniert. Sie nutzte diesen Konflikt jedoch nicht aus. Um das zu beheben, lassen Sie mich diese Datei in prettierrc umbenennen. Jetzt kann es also tatsächlich abgeholt werden. Wenn ich, sagen wir, zur App-Komponente gehe und sie speichere, sehen Sie jetzt, dass ich tatsächlich einfache Anführungszeichen habe, wie sie in hübscheren Konflikten definiert sind . Um das kleine Problem zu beheben, muss ich jedoch jede Datei in der Quelle durchgehen. Es könnte mühsam sein und wir haben nicht viele Dateien, also können wir es manuell machen, aber hier ist ein Tipp. Wir können eine hübschere Common-Line-Schnittstelle verwenden und ein kleines Skript schreiben , das den internen Quellcode einer alten Datei bildet . Wenn ich zu Prettier Documentation gehe, klicke ich auf Docs und im Abschnitt Usage kann im Abschnitt Usage nach CLI suchen . Den Ausschnitt finde ich hier. In der Praxis könnte das ungefähr so aussehen. Ich kann das einfach kopieren. Gehe zum Paket JSON, definiere hier ein neues Skript, das ich Format nennen werde, wo ich einen hübscheren Dash Dash Write Dot schreiben werde. Dot formatiert alle Dateien im aktuellen Verzeichnis, aber das möchte ich nicht tun. Deshalb ändere ich es auf source dot blast streaks, asterix, dot, dann curly brackets, JS, JSX. Keine Panik, das ist ein sogenanntes Glob-Pattern oder eine Glob-Syntax. Es wird verwendet, um Dateien abzugleichen, und Prettier kann dieses Muster oder diese Syntax als Argument akzeptieren. Es sucht also nach allen Dateien im Quellcode und in alten Unterordnern und sucht nur nach Dateien mit der Erweiterung Dot JS und Punkt JS6. Ich werde es speichern. Ich werde das NPM-Run-Format machen. Mal sehen, was wir haben. Jetzt können wir die Ausgabe sehen. sind also alle Dateien, die mit dem Format Script by Feature formatiert wurden . Das hübschere hier, auf das ich mich beziehe, wird von den Node-Modulen übernommen da wir es als Dev-Abhängigkeit installiert haben. Also schreiben wir Prettier hier in NPM-Skripten und es wird das installierte Prettier von Node-Modulen aufgelöst , so einfach ist das. Jetzt, wo wir alles repariert haben, lassen Sie uns alles festhalten und sagen, hübschere Konfigurationsfehler behoben, das Formatskript zum Paket JSON hinzufügen. Fantastisch. Wir sehen uns im nächsten. 66. 10 Radio: Hallöchen. In diesem Video werden wir mit der Entwicklung der Homepage fortfahren, und dieses Mal fügen wir Radiobuttons in unser Formular ein, mit denen wir nach den Ergebnissen suchen, und wir werden wählen können , ob wir nach Serien oder nach Schauspielern suchen möchten. Lass uns gehen. Ich gehe zurück zur Home-Komponente, innerhalb der Home-Komponente, direkt unter der Texteingabe Ich erstelle hier eine weitere Eingabe, da es sich um ein Optionsfeld handelt. Ich platziere es innerhalb des Label-Elements, sodass es sich um Ich platziere es innerhalb des Label-Elements, eine Typeingabe handelt. Radio-Label wird shows sein, Name wird searchOption sein, der Wert dieses Optionsfeldes wird shows sein. Dann erstelle ich einen weiteren Eingang, weiteren Radiobutton, diesmal für Schauspieler. Schauspieler, Typ Radio, Name bleibt gleich, da diese beiden Radiobuttons den gleichen Status haben, Wert wird Schauspieler sein. Ich gehe zurück zu meinem Markup und sehe , dass die Kontrollkästchen da sind, Entschuldigung, Optionsfelder. Damit wir den Wert, die Auswahl unserer Checkboxen, irgendwie in die API-Anfrage aufnehmen können, benötigen wir nun Auswahl unserer Checkboxen, irgendwie in die API-Anfrage aufnehmen können, einen anderen Status für diese Radiobuttons. Oben erstelle ich einen weiteren Status , den ich searchOption nenne, etwa so, setze searchOption standardmäßig, es wird angezeigt. Unser SearchOption-Status kann entweder Serien oder Schauspieler sein, entweder zeigt Zeichenfolge oder Schauspielerstring. Auf dieser Grundlage senden wir eine entsprechende Anfrage an die TVMaze API. Jetzt müssen wir den Status, den wir gerade erstellt haben , mit den Optionsfeldern verknüpfen , die wir zuvor geschrieben haben. Es ist so ziemlich dasselbe wie bei der Eingabe vom Typ Text, wir werden eine bidirektionale Datenbindung durchführen, wir haben bereits einen Wert, jetzt müssen wir auf das Änderungsereignis für diese Eingaben warten. Die Logik ist genau dieselbe, ich werde hier den on Change Event Handler vorstellen , den ich bei Radio Change nennen werde, und es wird für beide Elemente hier oben rechts daneben gleich sein . onSearchInputChange, ich werde über Radio Change schreiben, es empfängt auch das Ereignisobjekt, und jetzt kann ich, um den SearchOption-Status festzulegen, um den SearchOption-Status festzulegen, auf das Wertattribut verweisen, das wir an jedes entsprechende Optionsfeld übergeben haben . Optionsfelder werden durch Werte dargestellt sodass wir tatsächlich auf event.target zugreifen können, wodurch das Eingabe-HTML-Element angezeigt wird. Sie haben ein Wertattribut und es gibt uns den entsprechenden Wert, den wir jedem der Funkgeräte zugeordnet haben . setSearchOption wird event.target.value sein, im Grunde dasselbe wie bei onSearchInputChange. Nun, das ist eine unidirektionale Datenbindung, wie Sie sich erinnern, aber achten Sie auf Änderungen innerhalb des Radios, aber wir haben den SearchInput-Status nicht wieder mit dem Eingabeelement verknüpft, also haben wir hier bereits ein Wertattribut, aber der Radiobutton-Status wird nicht durch das Wertattribut dargestellt, sondern durch das check-Attribut, und unser Radiobutton shows aktiviert, wenn unsere searchOption gleich ist, damit wir es einfach so schreiben können. Die Suche nach Shows entspricht Shows. Dieser Ausdruck ist wahr, wenn die Suche nach Sendungen als Zeichenfolge erfolgt. Genau die gleiche Logik, die wir für den Input der Schauspieler anwenden werden. Es wird nur überprüft, wenn Suche nach Serien den Schauspielern entspricht. Großartig. Schauen wir uns das jetzt an. Lassen Sie uns SearchOption in der Konsole protokollieren, und entschuldigen Sie mich, es heißt immer noch, dass ich hier nach Sendungen gesucht habe. Entschuldigung, ich wollte searchOption verwenden Wenn state gleich shows ist, wird diese Eingabe überprüft. Das Gleiche gilt für Schauspieler. Großartig. Versuchen wir nun, SearchOption auf der Konsole zu protokollieren um sicherzustellen, dass wir alles richtig gemacht haben. Standardmäßig wird angezeigt, dass dies der Anfangszustand ist. Wenn ich Schauspieler auswähle, es Schauspieler, wenn ich wieder Serien auswähle, es immer noch Serien, was bedeutet, dass alles einwandfrei funktioniert. Jetzt müssen wir diesen searchOption-Status irgendwie in unsere Anfrage einfügen und die entsprechende Logik irgendwo im On-Search-Handler platzieren die entsprechende Logik irgendwo im On-Search-Handler . Moment werden wir es sehr einfach ausdrücken, aber im nächsten Video wir diese Komponente leicht umgestalten werden wir diese Komponente leicht umgestalten und sie viel, viel besser aussehen lassen. Aber was wird überhaupt die Logik sein? Wenn wir zur TVMaze API-Dokumentation zurückkehren, haben wir diesen Endpunkt hier verwendet, um nach den Sendungen zu suchen. Wenn wir in das Inhaltsverzeichnis schauen, gibt es hier einen weiteren Link , der uns zum Bereich für die Personensuche führt, und es ist fast dasselbe wie bei Shows. Sie können sehen, das Template ist im Grunde fast dasselbe, aber dieses Mal suchen wir nach Leuten statt nach Shows, also wie wir das in unserem Code erreichen können. Wenn wir zu TVmaze.js zurückkehren, haben wir hier bereits diese wiederverwendbare Funktion namens search for shows. Wir können diese Funktion kopieren und sie in searchForPeople umbenennen Anstatt /search/shows an API get zu übergeben, übergeben wir /search/people, und alle Argumente bleiben gleich, da wir hier auch eine Abfragezeichenfolge haben. Fantastisch. Wir gehen zurück zu homejsx, diesmal importieren wir SearchForPeople. Die Logik im Suchhandler wird sehr einfach sein. Wenn searchOption equals shows ist, führen Sie bitte diese Logik aus , die wir bereits haben, andernfalls führen Sie bitte dieselbe Logik aus, rufen Sie aber searchForPeople auf. Sie können sehen, dass wir hier eine kleine Wiederholung haben, aber das werden wir im nächsten Video anpassen. Denken Sie vorerst nicht zu viel darüber nach. Mal sehen, wie es aussieht. Wir kehren zu unserer App zurück, zeigt standardmäßig ausgewählte Sendungen, wir suchen nach etwas und Sie können sehen, dass alles wie erwartet funktioniert. Wenn wir Schauspieler auswählen und dann auf „Suchen“ klicken, haben wir einen leeren Bildschirm. Was ist passiert? Wenn wir in den Netzwerk-Tab schauen, können wir immer noch sehen, dass die Anfrage mit dem richtigen Endpunkt /search/people durchgegangen ist, aber wenn wir in die Konsole schauen, haben wir diesen Header, der besagt, dass die Eigenschaften eines undefinierten Lesenamens nicht gelesen werden können . Was ist passiert? Wenn wir uns den Antworttext ansehen , den wir von der API erhalten haben, ist dies das Objekt, das wir haben, aber innerhalb des Codes schreiben wir tatsächlich, wenn wir einen API-Datenstatus haben, werden wir data.show.id oder data.show.name rendern , aber in unserem Actors-Ergebnis haben wir das nicht. Wir haben nicht data.show, wir haben data.person. Wir greifen im Grunde auf die falschen Daten zu. Konsole hier, erzählt uns davon. Eigenschaften eines undefinierten Lesenamens können nicht gelesen werden, da data.show in diesem Antwortobjekt undefiniert ist . Dann versuchen wir, auf undefined.name zuzugreifen, und das sehen wir, können die Eigenschaften eines undefinierten Lesenamens nicht lesen. Das ist unser Problem. Die Lösung dafür wird darin bestehen, dass wir irgendwo hier schreiben müssen, wenn wir nach Schauspielern suchen oder wenn wir, sagen wir, Schauspielerergebnisse haben , Schauspieler anzeigen, aber wenn wir Ergebnisse von Sendungen haben, zeigen Sie bitte Serien an, und wir können nicht dieselbe Logik wie hier anwenden. Wir können uns nicht auf unseren Staat verlassen, wir müssen uns auf die Datenform verlassen, die wir haben. Hier in der Logik können wir einfach tun, ob, wo ist es? Wir haben ein Array, wir werden fragen, ob das erste Element der API-Daten die Eigenschaft show hat In diesem Fall können wir feststellen, dass wir mit den Shows arbeiten, wir haben Show-Daten von der API. Andernfalls, wenn wir keine Shows haben unser erstes Element in diesem Array nicht die Eigenschaft show hat, können wir erkennen, dass wir mit den Leuten hier arbeiten, mit diesem Personenobjekt. Wir werden etwas anderes sagen, bitte starte ApiData.map und Daten werden diesmal nicht angezeigt, sondern data.person. Datenperson, mal sehen, ID auch und Datenperson, sagen wir Name, so ziemlich das Gleiche wie bei Sendungen. Lass es uns jetzt versuchen. Es sieht ein bisschen chaotisch aus , keine Sorge, wir werden das alles etwas später beheben . Mal sehen, ob alles funktioniert. Ich suche nach Serien, ich erhalte Ergebnisse von der API, sie werden gerendert, perfekt. Ich wechsle zu Schauspielern und suche nach etwas wie Andrew und du kannst jetzt sehen, dass wir keinen Adder haben, die Konsole ist klar, Konsole ist klar, wir erhalten eine Antwort im Netzwerk-Tab und wir haben Daten gerendert, sodass wir sehen können, dass es funktioniert hat. Fantastisch, nicht wahr? Großartig. Ich kann sagen, dass wir das erreicht haben, was wir vorerst wollten Lassen Sie uns unsere Änderungen übernehmen und im nächsten Video werden wir diese Komponente leicht umgestalten und die Logik, die wir mit dem Formularelement haben , hier in einer separaten Komponente zusammenfassen. Aber lassen Sie uns vorerst einfach alles festlegen und dieses Commit so benennen, lassen Sie mich sehen, Suche nach Schauspielern hinzugefügt. Großartig. Lass uns zu GitHub wechseln und wir sehen uns im nächsten. 67. 11 Verschieben von search zu seiner eigenen Komponente: Hallo nochmal. In diesem Video werden wir weiter mit unserer Logik arbeiten, die wir im vorherigen Video vorgestellt haben. Wir haben eine Option hinzugefügt, um entweder Shows oder Schauspieler auszuwählen , und dann senden wir basierend auf dieser Auswahl eine entsprechende Anfrage an die TV Maze API. Sie können sehen, dass, nachdem wir diese Logik hinzugefügt hatten, unsere Home-Komponente mit vielen verschiedenen Logiken etwas aufgebläht wurde . Wir können es tatsächlich vereinfachen und genau das werden wir jetzt tun. Warum verschieben wir nicht die ganze Logik, die sich auf das Formularelement bezieht, all diese Zustände, warum verschieben wir sie nicht eine separate Komponente und platzieren die Logik dort, und dann werden wir durch Sonden nur das verfügbar machen, was wir brauchen. Lass uns versuchen, das zu tun. Im Komponentenordner erstelle ich eine neue Komponente, etwa searchformjsx. Von hier aus exportiere ich die Suchformularkomponente. Aber jetzt wird es nur noch ein leeres Div mit etwas Exportstandardsuchformular sein. Lassen Sie uns nun eine wichtige Komponente ausprobieren und sehen, wie diese Komponente ungefähr verhalten soll , damit wir die Logik entsprechend schreiben können. Ich werde das Suchformular aus dem Komponenten-Suchformular importieren . Anstatt all dem, was ein Suchformular schreiben wird. Was brauchen wir? Wir möchten die Suche irgendwo hier in dieser Komponente durchführen , da dies die Komponente ist in der wir tatsächlich Daten rendern. Wenn wir alles innerhalb des Suchformulars verwalten wollten, könnten wir von außen nicht auf diese Logik zugreifen. Wir werden die Zustandslogik mit Eingaben innerhalb der Komponente verwalten Eingaben innerhalb der Komponente aber die Suche wird hier tatsächlich stattfinden. Die Suchlogik wird in Home-JSX geschrieben. Wir müssen irgendwie einen Weg finden, eine Sonde freizulassen, die es uns ermöglicht , hier in JSX zu Hause nach Sendungen zu suchen. Wir können diese Suchfunktion einfach an das Suchformular und das Insight-Suchformular weitergeben Suchfunktion einfach an das Suchformular und das Insight-Suchformular , wenn wir auf Senden klicken, wodurch die Funktion aufgerufen wird, die hier zu Hause definiert ist. Wir werden es so etwas wie on search nennen und wir werden unsere Concert-Funktion weitergeben , die wir bereits haben, aber wir werden die Logik leicht modifizieren. Anstatt das alles zu schreiben, werden wir nur eine einzige Zeile haben. Lassen Sie uns nun das Markup mit dem Formularelement, das wir haben, kopieren mit dem Formularelement, das wir haben, und es wie folgt in ein Suchformular einfügen. Jetzt müssen wir die Logik, die wir in Heim-JSX haben, in ihren Zustand versetzen, z. B. bei Änderung der Sucheingabe und beim Funkwechsel. Wir werden das alles in das Suchformular verschieben. Hier auch diese Zustände, Suchoption und Suchzeichenfolge. Lassen Sie uns diese beiden kopieren. Stellen wir sie hier oben drauf. Wir müssen den Use State jetzt importieren. Ich werde das auch kopieren. Das einzige, was wir von hier aus verpasst haben , ist der On-Search-Handler. Lassen Sie uns weitermachen und es hier definieren. Anstatt das bei der Suche aufzurufen, werden wir es beim Absenden aufrufen Der Grund dafür ist der folgende. Wir können das an den Suchhandler hier direkt als Probe übergeben und dann direkt als Submit-Handler angeben aber wir werden das Event-Objekt verfügbar machen, was bedeutet, dass wir die Logik schreiben müssen , um das Submit-Ereignis zu verhindern. Die externe Komponente, die Home.jsx ist, muss davon jedoch nicht wirklich wissen. Warum muss ich wirklich eine gewisse Standardlogik, ein gewisses Standardverhalten verhindern? Wir können einen Teil dieser Logik von der Suche direkt in die Suchformularkomponente verschieben . Hier erstelle ich eine Submit-Funktion und übergebe sie als Submit-Attribut. Auch hier haben wir das Event-Objekt in dieser Funktion. Wir verhindern die standardmäßige Absendeaktion, indem wir event prevent default aufrufen , und direkt danach müssen wir diese Logik ausführen. Aber diese Logik wird hier definiert. Wir können die Such-Requisite erwarten, die eine Funktion sein wird, und wir werden sie einfach hier aufrufen, einfach so. Lass es uns versuchen. Anstatt event prevent default zu schreiben, brauchen wir es hier nicht, da es bereits in der Suchformularkomponente erledigt ist. Ich werde es entfernen. Im Moment rufen wir die eigene Suche ohne Argumente auf, was bedeutet, dass ich hier nichts erhalte. Nur eine Funktion ohne Argumente. Wir haben jedoch den Zugriff auf die Suchoption verloren und wir haben den Zugriff auf die Suchzeichenfolge verloren. Um das zu beheben, können wir jedes Mal, wenn wir die Suchfunktion aufrufen , die wir in Home definiert haben, Argumente hier übergeben, weil wir ihn hier im Suchformular haben. Warum rufen wir nicht die Suchzeichenfolge und die Suchoption im Internet auf ? Aber um es benutzerfreundlicher zu machen, wir die API, die Suchformularkomponente bereitstellen, um sie hier benutzerfreundlich zu gestalten können wir die API, die wir über die Suchformularkomponente bereitstellen, um sie hier benutzerfreundlich zu gestalten, ein Objekt sein, so etwas wie Optionen. Abfrage, sei es nur Q die Suchzeichenfolge und die Suchoption, lassen wir es so wie es ist. Irgendwann werden wir ein Objekt namens Optionen mit der Eigenschaft Q und der Suchoptionseigenschaft haben. Wir werden dieses Objekt an die Suchfunktion übergeben . Hier erhalten wir das Optionsobjekt und können hier direkt die Destrukturierung durchführen. Wir werden Q Property und Search Option Property umstrukturieren . Wir schnappen uns Q, wir schnappen uns die Suchoption anstelle der Suchzeichenfolge. Jetzt werden wir Q verwenden. Lass es uns versuchen und sehen. Wenn ich die Seite aktualisiere, passiert nichts , weil ich den Entwicklungsserver nicht ausgeführt habe. Lassen Sie mich das sehr schnell machen. Warten wir eine Sekunde. Es ist hier. Lass mich auffrischen. Lass uns sehen. Unsere Funktionalität sollte nicht wirklich geändert werden , da wir hier nur einen kleineren Faktor berücksichtigen. Wir erwarten, dass sich alles genauso verhält wie zuvor. Mädchen, wir haben Mädchen, funktioniert perfekt, Schauspieler. Sagen wir, Garry, wir haben Garry. Sie können sehen, dass die Funktionalität gleich bleibt, aber jetzt wurde unsere Logik in einer Heim-JSX drastisch vereinfacht. Wir haben hier im Grunde fast nichts außer der Logik, die sich auf die Suche selbst bezieht. Die Logik, die sich um die Form aller Eingaben kümmert , wurde in das Suchformular eingekapselt. Jetzt haben wir die Bedenken getrennt. Macht Sinn. Ich glaube, das tut es. Das war's für heute. Warte, das ist es eigentlich nicht. Dagegen müssen wir noch etwas tun, weil Sie sehen, wir haben hier immer noch die kleine Wiederholung. Wir können es tatsächlich so belassen und denken nicht wirklich viel darüber nach. ist nichts auszusetzen, aber wir können es einfacher machen. Wir können sagen, zuerst eine Variable namens result erstellen. So werden wir dann die festgelegten API-Daten hierher verschieben und einfach so etwas tun. Oder vielleicht können wir es sogar einfacher machen indem wir die Logik mit ternären Operatoren verknüpfen, Suchoption wird angezeigt, bitte warten Sie auf die Suche nach Sendungen, andernfalls warten Sie auf Leute. Aber ich denke, diese Aussage wird reichen. Fantastisch. Nun, das ist alles. Lassen Sie uns alles verpflichten , was wir gerade gemacht haben. Wie können wir das benennen? können wir ganz einfach benennen. Wir nennen es einfach faktorierte oder sagen wir oszillierte Suchformularlogik und Suchformularkomponente. Perfekt. Wir sehen uns im nächsten. 68. 12 Karten für Shows und Schauspieler anzeigen: Hallo. In diesem Video werden wir die Entwicklung fortsetzen und mit der Anzeige von Daten aus der TV Maze API fortfahren . Derzeit ist unsere Logik zur Anzeige von Daten sehr einfach. Wir ordnen einfach den API-Datenstatus und zeigen dann entweder das Akronym oder den Anzeigenamen an. Lass es uns dieses Mal Wirklichkeit werden lassen. Anstatt das zu schreiben, können wir diese ganze Logik wiederum in einer separaten Komponente oszillieren, speziell für Schauspieler, und in anderen Komponenten, speziell für Serien. Lass uns das machen. Im Komponenten-Ordner werde ich hier zwei weitere Ordner erstellen, einen für Schauspieler und einen weiteren für Shows. In diesen Ordnern werden wir bestimmte Komponenten platzieren, die sich nur auf Serien oder Schauspieler beziehen. Im Ordner shows erstelle ich eine neue Komponente, die ich ShowGridJsX nennen werde. Dies wird jetzt als einfaches, div-exportiertes Standard-ShowGrid sein , und als zukünftige Referenz werde ich diese Logik kopieren und sie werde ich diese Logik kopieren und sie auch in ActorsGrid einfügen. Aber dieses Mal werde ich es in ActorsGrid umbenennen. Gehen wir jetzt zurück nach Hause. Anstatt dies zu tun, können wir jetzt, anstatt Elemente hier direkt zuzuordnen, anstatt Elemente hier direkt zuzuordnen, entweder ShowGrid oder ActorGrid anzeigen. Wenn wir Shows haben, zeigen wir ShowGrid an. Sie können den Intellisense erneut sehen. In der Drop-down-Liste drücke ich die Tabulatortaste und habe überprüft, ob er korrekt importiert wurde. Nun, das war es, also kann ich weitermachen. Das Gleiche werde ich für Schauspieler tun, anstatt hier Elemente abzubilden, werde ich ActorsGrid anzeigen. Das Intellisense, Bum, importiert. Ich habe die Eingabe überprüft. Sieht toll aus. Es ist jetzt viel einfacher, nicht wahr? Damit wir Daten innerhalb dieser Komponenten anzeigen können, müssen wir Daten weitergeben, damit sie sie irgendwie von innen aus manipulieren können. Für ShowGrid werden wir die Ausstellungsrequisiten weitergeben, und es werden API-Daten sein. Für Actors Grid werden es wiederum Akteure sein , API-Daten. Im Moment sind wir mit der Home-Komponente fertig. Die gesamte Logik wird in der entsprechenden Grid-Komponente platziert . Fangen wir zuerst mit den Shows an. Wir gehen zu ShowGrid, hier erhalten wir die Requisite der Show , die wir hier von homejsx weitergeben. Großartig. Jetzt werden wir in Show Grid die Daten zuordnen. Wir werden showsgrid.map schreiben. Hier haben wir unser Datenobjekt. Lassen Sie uns zunächst kurz daran erinnern, was haben wir? Wir haben die Daten show.name, wenn ich mich nicht irre, und für den Schlüssel gebe ich Daten weiter, zeige die ID. Lassen Sie uns das einfach schnell überprüfen. Kommen wir zurück zur App. Ich tippe etwas und erhalte eine Fehlermeldung, die besagt, dass Eigenschaften von undefined nicht behandelt werden können. Ich glaube, ich verstehe es jetzt. Das Problem ist, dass wir den Fall behandelt haben, in dem Stufe gleich Null ist. Aber wir haben den Fall , in dem die Stufe ein leeres Array ist, nicht wirklich behandelt . Weil du gesehen hast, habe ich jetzt Kauderwelsch eingegeben, aber wenn ich etwas Sinnvolles eingebe und wir tatsächlich Ergebnisse von der API haben, haben wir ein Array. Aber wenn ich etwas Kauderwelsch eingebe, wird es ein leeres Array sein. Wenn wir in den Netzwerk-Tab schauen, können Sie anhand der API in Ihrer Vorschau sehen, dass wir ein leeres Array haben und das hier nicht behandeln. Aber in der Logik, die wir schreiben, überprüfen Sie bitte das erste Element innerhalb des Arrays. Aber da das erste Element nicht existiert, ist es undefiniert, wir haben im Grunde undefined.show . Das müssen wir in Ordnung bringen. Wir müssen den Fall berücksichtigen, wenn wir ein leeres Array haben. Hier fügen wir eine weitere If-Bedingung hinzu, wenn apiData.length gleich Null ist. Sie können hier sehen, was ich gemacht habe, ich habe dieses Fragezeichen hier hinzugefügt. Dies wird als optionale Verkettung bezeichnet , denn wenn die API-Daten Null sind und ich null.length eingebe, erhalte ich eine Fehlermeldung. Um diesen Fehler zu verhindern und sicherzustellen, dass die JavaScript-Zugriffslänge nur dann erfolgt, wenn die API-Daten wahr sind, können wir dieses Fragezeichen hier hinzufügen. Wenn API-Daten falsch sind, sind sie Null, es wird kein Fehler ausgegeben, der besagt, dass die Eigenschaftslänge von Null nicht gelesen werden kann. Aber wenn es wahr ist, wird es weitermachen und es wird die Eigenschaft length verwenden. Wenn apiData.length gleich Null unser Array leer ist, werden wir keine Ergebnisse anzeigen. Versuchen wir zu sehen, dass wir, wenn ich Kauderwelsch eingebe, ein leeres Array von der API erhalten und diesmal keine Ergebnistexte haben. mich sieht es gut aus. Lassen Sie uns etwas eingeben , das Sinn macht. Wir haben Mädchen, die Logik, die die ältesten Sendungen zeigt, ist in ShowGrid geschrieben. Sieht vollkommen in Ordnung aus. Lassen Sie uns nun fortfahren und die Kartenkomponente für die Show erstellen . Die Kartenkomponente wird unsere Style-Showcard sein, bei der wir alle Daten über die Show sehen , anstatt sie nur in einem einfachen Div anzuzeigen. Im Ordner shows erstelle ich ShowCardJSX. Das wird eine Visitenkarte sein. Auch hier einfach div, und standardmäßig exportieren wir ShowCard. Jetzt werden wir diese Showcard hier in ShowGrid verwenden . Anstatt jedes Element, jedes Show-Objekt, diesem einfachen Div zuzuordnen , werden wir jedes Element der Showcard-Komponente zuordnen. Stattdessen werde ich jedes Element ShowCard zuordnen. Nochmals, Alto-Eingabe, und ich muss Requisiten an die ShowCard-Komponente übergeben. Es ist jedoch alles rot, weil ich wieder die Schlüsselstütze weitergeben muss. Es spielt keine Rolle, ob das Element Ihre eigene benutzerdefinierte Komponente oder nur ein HTML-Element ist, Sie müssen immer den Schlüssel übergeben. Der Schlüssel wird die Datenshow-ID sein. Welche Daten wollen wir nun in ShowCard anzeigen? Fangen wir mit etwas Einfachem an. Also zuerst erhalten wir eine Namensrequisite und wahrscheinlich werden wir ein Bild erhalten oder lassen Sie uns zuerst mit dem Namen beginnen. Innerhalb des Div werden wir das innerhalb des h1-Tags anzeigen . Wir werden den Namen interpolieren. Jetzt müssen wir die Namensrequisite hier weitergeben. Wenn ich die Komponente show card zuordne, übergebe ich name, equals data, show.name, etwa so. Lass es uns versuchen und sehen. In der Tat können Sie jetzt sehen, dass alles groß und fett ist. Das ist unser H1-Tag. Dann geben wir das Bild weiter, wenn wir unsere API-Daten überprüfen. Lass es uns versuchen und sehen. Wir haben ein Showbild. Ein Bild ist ein Objekt mit mittleren und originalen Schlüsseln. Versuchen wir zu sehen, ob sich diese Daten irgendwie ändern. Bild, wir haben immer noch welche, aber ich kann Ihnen sagen, dass das Bild hier möglicherweise Null ist, da nicht alle Sendungen, die wir von dieser API erhalten, Bilder enthalten. Sie haben möglicherweise keine Daten. In diesem Fall ist das Bild Null. Wie können wir etwas anzeigen? Für diese Situationen schlage ich vor, zu tun. Falls wir kein Bild von der API erhalten, würden wir dem Benutzer das Platzhalterbild zeigen, so etwas wie Bild nicht gefunden. Dafür können wir zu dem Gast zurückkehren , den Sie mit Ihnen geteilt haben. Hier finden Sie den Platzhalter für Shows, Schauspieler ohne Titelbild. Sie können auf dieses Bild klicken, dann mit der rechten Maustaste darauf klicken, das Bild speichern unter und lassen Sie es uns in unser Projekt einfügen. Ich lege es in öffentlichen Ordner und nenne es als nicht gefunden image.png. Großartig. Wenn ich in die Öffentlichkeit schaue, ist es jetzt hier erschienen und wir können tatsächlich auf dieses PNG-Bild in unserem Quellcode verweisen . Schauen wir uns einfach schnell an, wie es aussieht. Bildquelle wird kein gebundenes Bild sein , da sich unsere Datei öffentlich befindet und über die App-Route bereitgestellt wird. Wir speichern es, wir kehren zur App zurück und wann immer wir nach Sendungen suchen, haben wir das, perfekt. Das ist das Bild, das wir haben. In Show Grid übergeben wir jetzt image prop, aber wir geben an, ob data.show.image in diesem Fall wahr ist, nimm dieses image.medium, data.show.medium, andernfalls zeige bitte nicht gefunden. Wie haben wir es benannt? image.png nicht gefunden. Großartig. Jetzt können wir uns in der Showcard die Bild-Requisite schnappen und sie irgendwo hier oben ausstellen. Wir werden das Bild in ein Div packen. Dann wird die Quelle das Bild sein, das wir weitergeben, und das wird der Name der Show sein. Lass uns schnell sehen , was wir haben. Wir haben hier etwas falsch gemacht. Mal sehen, wir haben keine Quelle. Warum ist das so? Es muss data.show.image.medium sein. Jetzt siehst du, hat ziemlich gut funktioniert. Lassen Sie uns versuchen, nach Schauspielern zu suchen, und Sie können sehen, jetzt haben wir all diese Titelbilder. Nett. Lassen Sie uns fortfahren und die App-Daten eingeben. Was müssen wir noch zeigen? Wir möchten vielleicht nur eine Zusammenfassung und in jeder Karte zeigen , aber wir werden auch einen Button für die Zukunft haben , um diese Show zu starten. Wenn wir auf diese Schaltfläche klicken, wird sie gestartet, und wenn wir auf die Karte klicken , gelangen wir zur Show-Seite. Das werden wir in Zukunft schaffen. In der Visitenkarte benötigen wir einen Ausweis. Wir werden auch eine Zusammenfassung benötigen. Mal sehen, wie wir hier alles anzeigen können. Wir werden hier ein Div erstellen. Ein Div wird vorerst wahrscheinlich nur ein Link sein, den wir aus dem [unhörbar] importieren. In dem Link werden wir sagen, lesen Sie mehr. Der Link führt uns vorerst zur Route. Dagegen werden wir vorerst nichts unternehmen. Dann haben wir hier eine Schaltfläche vom Typ Button, die bei mir vorerst ein Stern sein wird. In Zukunft wird sie durch das Symbol ersetzt. Über die Zusammenfassung. Zusammenfassung werden wir irgendwo hier anzeigen und wir werden keine Zusammenfassung anzeigen, da dort die Requisite, die wir erhalten, einfach nicht angezeigt wird, wir werden sie irgendwie transformieren. Der Grund dafür ist, dass wir, wenn wir uns die API-Antwort ansehen, die zusammenfassende Zeichenfolge haben. Aber wie Sie sehen können, handelt es sich um eine HTML-Zeichenfolge. Das bedeutet, dass wir einfach diesen HTML-Code nehmen und verwenden können. Das Problem ist, dass es ziemlich lang ist. Wir wollen es kurz machen. Wir wollen hier nicht Hunderte von Wörtern anzeigen. Ich schlage vor, diese zusammenfassende Zeichenfolge in eine sehr kurze Zeichenfolge umzuwandeln . Wir werden von hier aus alle HTML-Tags entfernen und wahrscheinlich nur, sagen wir, die ersten 10 Wörter nehmen. Wie können wir das machen? Nehmen wir an, wir erhalten diese Zeichenfolge hier. Lassen Sie uns die Logik in der Browser Console hier schreiben. Wir haben diese Zeichenfolge hier. Für diese Zeichenfolge transformieren wir sie zuerst in ein Array, indem Methode.split aufrufen, und wir teilen sie durch Leerzeichen auf. Jetzt haben wir so etwas. Dann nehmen wir nur die ersten 10 Elemente aus diesem Array, .split danach werden wir vom Index Null auf Index 10 aufteilen. Am Ende haben wir ein Array von 10 Elementen. Dann werden wir dieses Array wieder in eine Zeichenfolge umwandeln . Wir werden alle Elemente mit einer leeren Zeichenfolge dazwischen verbinden . Es sieht so aus. Aber wir haben hier immer noch HTML-Tags, also müssen wir sie ersetzen. Ich werde die für alle Zeichenketten verfügbare Methode der.replace ändern . Hier übergebe ich einen sogenannten regulären Ausdruck. Ich werde alle unnötigen Zeichen abgleichen und sie dann durch eine leere Zeichenfolge ersetzen. Im Grunde wird es sie einfach wegnehmen. Denken Sie nicht darüber nach , dass das passt. Der reguläre Ausdruck, den ich schreiben werde, ersetzt einfach alle HTML-Tags in unserer aktuellen Zeichenfolge. Es wird so aussehen. Sie dem einfach nicht viel Aufmerksamkeit. Unser Endergebnis wird so aussehen. Wir haben diese HTML-Zeichenfolge genommen, sie gekürzt und alle HTML-Tags entfernt. Ich kann diese Logik einfach kopieren. Sie haben gerade hier geschrieben, und ich werde so etwas wie eine Zusammenfassung ohne Zusammenfassung machen. Wenn ich mich nicht irre, ist die Zusammenfassung in der Sendung vielleicht auch nicht vorhanden, deshalb werden wir hier nach falschen Werten suchen . Wenn wir eine Zusammenfassung haben, rufen wir die Split-Methode und all diese Logik auf, um unseren HTML-Code in eine einfache Zeichenfolge umzuwandeln, andernfalls geben wir keine Beschreibung. Dann werden wir die Zusammenfassung entfernt anzeigen. ID ist vorerst unbenutzt, aber wir werden sie so belassen. Wir speichern die Datei, gehen erneut zu Show Grid und geben die ID weiter, die data.show.id sein wird und als Namen haben wir sie bereits. Am Ende werden wir eine Zusammenfassung geben. Es wird ziemlich einfach sein, nur data.show.summary. Ich weiß, dass es nach viel klingt, aber glauben Sie mir, dies ist nur eine normale Methode, wenn Sie mit Daten aus der API arbeiten. Sie müssen sich irgendwie überlegen wie Daten angezeigt werden sollen. Das ist hier einfach normal. Ich speichere es, ich gehe zurück, und wenn ich diesmal nach Jungen suche, wo sind meine Jungs? Sie sind hier. Jetzt habe ich die zusammenfassende Zeichenfolge , die wir mit dem Link Lesen transformiert haben, sowie die Schaltfläche „Mich markieren“. Nun, sieht toll aus, nicht wahr? Jetzt verbringen wir hier tatsächlich viel Zeit auf Shows. Lassen Sie uns schnell die Schauspieler zusammenfassen, die wir haben. In Actor Grid können wir diese Logik einfach von hier kopieren. Wir benötigen kein Konsolenprotokoll. Ich kopiere einfach die Logik aus dem Show-Grid füge sie in das Actors Grid ein. Ich werde schnell die Requisiten der Schauspieler erhalten, die ich hier überreiche. Actors.POP-Daten. Ich mache das innerhalb von Show Grid. Ich muss das innerhalb des Actors Grid machen. Ich empfange Schauspieler hier. Ich ordne Schauspieler zu und ordne sie der Schauspielerkarte zu. ActorCard.jsx. Ich werde diese Logik sehr schnell von der Showcard kopieren sie in die Karte des Schauspielers legen. Ich benenne Showcard in Actor Card um, und welche Daten erhalte ich dieses Mal? Zuallererst haben Schauspieler auch Namen. Sie haben auch Bilder und sie haben auch IDs, oder vielleicht auch nicht. Wir benötigen keinen Ausweis, da wir für jede Show eine separate Seite haben werden , aber wir werden nicht für jeden Schauspieler eine eigene Seite haben. Wir brauchen einen Namen, wir werden ein Bild brauchen, wir werden wahrscheinlich etwas wie Geschlecht, ihr Land, vielleicht Geburtstag und Todestag brauchen . Dann verwende ich hier im Actors Grid die Darstellerkarte. Es wurde automatisch importiert, anstatt all diese Requisiten zu übergeben. Lass mich es entfernen. Als Schlüssel übergebe ich einen Datenpunkt, lassen Sie mich das mal sehen. Was haben wir hier? Karte anzeigen ist nicht definiert. Die Zusammenfassung ist nicht definiert. Komm schon. Lass mich nach Schauspielern suchen. Lassen Sie mich die Netzwerkanfrage sehen. Hier habe ich eine Person. Das ist Person, also Daten, Person. Persönlich habe ich Geburtstag, null Land, null Todestag, null Geschlecht, Frauen. Sie können sehen, wir haben bereits viele Nullen. Nun, das ist nicht schlecht. Wir geben den Namen weiter. Es wird einfach data person.name sein. Dann wird es Country sein. Wenn ich nicht betrunken bin, kann Country tatsächlich ein Objekt sein. Es ist ein Objekt mit Namen hier. Ich gebe nur Daten, Person, Land.Name weiter. Land kann jedoch Null sein, also müssen wir das überprüfen. Wenn Daten, Person, Land wahr sind, geben Sie bitte den Namen an. Andernfalls geben Sie es bitte Null. Dann haben wir Geburtstag. Wie du gesehen hast, kann Geburtstag nicht Null sein, aber wir kümmern uns um die Innenseite der Schauspieler-Karte. Wir geben Daten, Person, Geburtstag weiter. Dann haben wir auch den Todestag , der so ziemlich dem Geburtstag entspricht. Dann haben wir auch das Geschlecht. Geschlecht wird Daten, Person, Geschlecht sein. Außerdem glaube ich, wir haben das Bild vergessen. Bild, ich denke, es wird so ziemlich das Gleiche sein wie bei Shows. Ich kopiere es einfach. Ich werde fragen, ob Daten, Person, Bild existieren. Bitte geben Sie Daten, Person, Bild, Medium, sonst nicht gefundenes Bild PNG an. Großartig. Was wird nun das Markup für das Actor Grid sein? Lass mich sehen. Das Bild bleibt ohne Namen gleich. In H1 werden wir weiterhin den Namen anzeigen, aber neben dem Namen werden wir auch das Geschlecht in Klammern anzeigen , falls es eines gibt. Wir können unsere Logik hier einordnen. Sie erinnern sich, dass wir bedingtes Rendern direkt in JSX einbetten können , wenn das Geschlecht da ist . Bitte zeigen Sie die Zeichenfolge an, die aus Klammern und in Klammern besteht, wir werden das Geschlecht interpolieren und dieses Geschlecht kann Null sein. Wenn wir den Operator und verwenden um diese Logik bedingt wiederzugeben, möchten wir immer sicherstellen, dass Geschlecht ein boolescher Wert ist. Deshalb werden wir es entweder in einen solchen booleschen Wert umwandeln, um es zu überprüfen, oder wir können eine doppelte Negation anwenden, wodurch es auch in einen booleschen Wert umgewandelt wird. , neben dem Namen werden wir das Land innerhalb des Absatztags anzeigen Ich glaube, neben dem Namen werden wir das Land innerhalb des Absatztags anzeigen. Wir werden fragen, ob das Land bekannt ist, dann zeigen wir eine Zeichenfolge an, die besagt, dass das Land stammt. Sonst sagen wir es keinem Land, niemandem. Dann haben wir Geburtstag und Todestag. Wir werden hier dieselbe Logik anwenden. Wenn wir Geburtstag haben, ein boolescher Wert. Bitte zeigen Sie das P-Tag mit geboren am Geburtstag an. Wahrscheinlich ist das Gleiche für den Todestag oder für einen Todestag, anstatt nichts zu zeigen, wenn er das tut, können wir immer noch sagen, dass diese Person am Leben ist. Deshalb werden wir hier das P-Tag erstellen und fragen, ob wir bitte den Todestag haben. Display starb an diesem Todestag. Andernfalls bitte lebend anzeigen. Wir brauchen den Div unten nicht wirklich. Unser endgültiges Markup sieht so aus. Wir brauchen die Link-Komponente nicht oben drauf. Nun, das war eine Menge und ich bin jetzt schon müde , all diese ziemlich langweilige Logik der Anzeige von Daten zu schreiben. Aber wir müssen das trotzdem durchmachen. Lass uns nach Shows suchen. Wir haben alles, was angezeigt wird. Jetzt sind wir zu Schauspielern gewechselt. Dieses Mal suchen wir nach Harry, nicht nach Gary, sondern nach Harry. Hier haben wir ein Bild. Sie können sehen, ob das Bild nicht existiert. Es wird angezeigt, dass das Bild nicht gefunden wurde. Dann haben wir den Namen, das Geschlecht in der Klammer. Dann haben wir kein Land, niemand, der lebt oder nicht am Leben ist, als die Person geboren wurde. Alle Daten, die wir von der API haben , werden auf diese Weise angezeigt. Ich denke, das ist es. Lass uns alles verpflichten und lass uns weitermachen. Ich werde alles begehen. Ich weiß, dass du diese eine Warnung gesehen hast, die wir wegen dieser ID haben. Das ist in Ordnung. Lass es uns vorerst dort belassen. Wir werden uns später damit befassen. Wir werden alles tun und wir werden sagen, dass die Daten der Serien und Schauspieler angezeigt werden. Lass uns alles unter Kontrolle bringen und lass uns eine Pause einlegen. Wir sehen uns im nächsten. 69. 13 Seiten mit dynamischen Inhalten: Hallo zusammen. Im letzten Video haben wir Karten für Shows und Schauspieler erstellt. Dieses Mal werden wir über dynamische Seiten sprechen. Wie ihr euch in den Karten für Shows erinnert, haben wir diesen Link zum Lesen mehr. Wenn wir zum Markup zurückkehren, ist dies die Link-Komponente, die wir von React Router dom verwendet haben. Moment löst es sich auf der Homepage im Stammverzeichnis auf. Im Grunde macht es nichts, wenn wir darauf klicken. Was wir nun stattdessen tun wollen Wenn wir auf „Mehr lesen“ klicken, sollten wir zur jeweiligen Show-Seite navigieren. Zunächst müssen wir entscheiden, wie genau unsere Show-Seite dargestellt werden soll. In diesem Fall und in den meisten Fällen werden Seiten durch IDs dargestellt. Wir haben ShowID. Es kann unsere eindeutige Kennung für die Seite Wenn wir also auf eine Seite in der URL klicken, wird irgendwie ShowID angezeigt. Wir können hier zwei Optionen in Betracht ziehen. Erste Option, unsere URL sieht ungefähr wie Slash Show aus, und dann wird die ID der Show als Teil der Abfragezeichenfolge angegeben. So etwas. Zweite Option, die wir in Betracht ziehen können, anstatt die ID als Teil der Abfragezeichenfolge anzugeben, können wir showId tatsächlich in ein URL-Segment umwandeln. Irgendwann wird die Show-Seite eine URL haben, so etwas wie Slash Show, Slash showId, und diese ID wird je nach Show, auf die wir klicken, geändert. Die Frage hier ist, wie dies mit React Router erreicht werden kann. Wenn wir hier zur App-Komponente zurückkehren, habe ich, wie Sie sich erinnern, das Markup, das ich der Dokumentation entnommen habe, zum späteren Nachschlagen auskommentiert das Markup, das ich der Dokumentation entnommen . Hier haben wir diese Routenteams und darin haben wir etwas mit Doppelpunkt, wir haben Doppelpunkt Team-ID. Was auch immer Sie hier sehen, ist etwas, das als dynamischer URL-Parameter oder dynamisches URL-Segment bezeichnet wird, weil es sich ändert. Alle unsere Daten , die wir in unserer Anwendung haben , sind dynamisch, denn was auch immer wir in die Eingabe eingeben, es wird dynamisch sein. Wir können nicht wirklich vorhersagen welche Daten wir von der API erwarten sollten. Wir müssen irgendwie darüber nachdenken, wie wir das Skelett für die dynamischen Daten schreiben können . Ich schlage vor, dass wir die zweite Option in Betracht ziehen , die ich Ihnen gerade zeige, und unsere URL wird wie Slash show, slash showID aussehen. Dieser dynamische showID-URL-Parameter ist das, was Sie hier in diesem Beispiel mit einem Doppelpunkt sehen. Wir geben ihm einen Namen, sagen wir TeamID. Wir geben an, dass dieser benannte Parameter etwas Dynamisches ist, das wir der URL entnehmen können. In unserem Fall, was wir hier tun können, können wir eine weitere Route erstellen und wir werden sie außerhalb des Hauptlayouts erstellen , da wir für die Show-Seite nicht hauptsächlich die Route verwenden werden, die wir zuvor erstellt haben. Diese Route wird den Pfad mit einem Schrägstrich anzeigen, einem Schrägstrich und einem Doppelpunkt anzeigen lassen. Dieses dynamische URL-Segment hier, ich habe ihm den Namen ShowID gegeben. Ich werde einen URL-Parameter haben , der dynamisch sein wird, und er wird den Namen showId haben. Für diese Route möchte ich die Show-Seite anzeigen. Lass uns weitermachen und eine erstellen. Unter Seiten erstelle ich eine weitere Komponente namens show, weitere Datei namens show, und das Markup wird vorerst sehr einfach sein , Seite in der App anzeigen. Ich werde diese Show-Page-Komponente importieren und versuchen wir es. Wenn ich zu Slash Show, Slash etwas navigiere , wirst du sehen, dass ich eine Show-Seite habe. Es funktioniert tatsächlich. React Router konnte diesen Pfad anpassen und mir die Show-Komponente rendern. Wenn ich zu Just Show gehe, habe ich, nicht gefunden, weil nur Show ohne dynamisches URL-Segment nicht zu dieser Routendefinition passt. Deshalb fällt es auf, not found zurück. Aber sobald ich etwas mit Schrägstrich anzeigen gehe, werde ich die Seite anzeigen lassen. Großartig. Nun stellt sich die Frage, wie wir diese ShowID irgendwie von der URL hier abrufen und in unserer Show-Komponente verwenden können. Unsere Strategie wird die folgende sein. Immer wenn wir zur Show-Seite navigieren und showID im URL-Segment in unserer Komponente haben , können wir dieses URL-Segment nehmen, wir können diese showID nehmen und es dann innerhalb der Komponente verwenden , um die TVMaze API abzufragen und Showdaten abzurufen. Dies ist ein sehr verbreiteter Ansatz, wenn Sie mit dynamischen Seiten arbeiten. Sie werden einen dynamischen Teil innerhalb der URL haben, und wann immer Sie zu dieser Seite navigieren, nehmen Sie diesen dynamischen Teil aus der URL und verwenden ihn innerhalb der Komponente, um Daten abzufragen. In unserem Fall wird das ShowID sein. Nun, wie können wir diese ShowID aus der URL entnehmen? Wenn wir zur React Router-Dokumentation zurückkehren , haben wir links ein Menü. Wir können nach unten zum Abschnitt Hooks scrollen und hier werden wir uns den Use Params Hook interessieren. Sie können diese kurze Beschreibung hier lesen , also use params hook gibt ein Objekt zurück, Schlüsselwertpaare der dynamischen Parameter der aktuellen URL, denen der Routenpfad entspricht. Lass uns das versuchen. Sie können sehen, dass es aus React Router dom importiert wurde. Ich werde genau das Gleiche tun. Ich kopiere das einfach sehr schnell. Ich brauche keine Route, also muss ich nur Parameter verwenden und in Show rufe ich einfach use params auf. Ich werde eine neue Variable namens params erstellen. Im Moment werde ich einfach die Log-Parameter stornieren und sehen, was ich habe. Ich gehe hier zum Browser Cancel, und hier können Sie sehen, dass ich ein Objekt habe, bei dem showId dem entspricht, was ich in der URL angegeben habe. Dieser Schlüssel hier entspricht dem Parameternamen, den wir diesem URL-Segment innerhalb der Routendefinition gegeben haben. Wenn wir hier so etwas wie, ich weiß nicht, ganz zufällig eintragen, ich aktualisiere die Seite, Sie können jetzt die wichtigsten Änderungen sehen. Ich habe ihm speziell etwas Sinnvolles wie showID gegeben, damit wir später mit dem use params Hook auf diese dynamische ShowID zugreifen können . Da es ein Objekt sein wird, können wir diese Strukturierung verwenden. Aus diesem Params-Objekt hole ich mir ShowID. Lassen Sie uns versuchen, das hier in unserem JSX zu interpolieren. Seite für showID anzeigen. Lass es uns versuchen und ich habe festgestellt , dass meine App nicht gespeichert ist Lass mich sie speichern. Sie können Seite für Show sehen, was auch immer ich in die URL eingegeben habe. Wenn es Show mit Id1 wäre, hätte ich für Show 1. Einfach so haben wir jetzt eine dynamische Seite erstellt , die unsere Show repräsentieren wird. Da ist noch eine Sache dran. Wir werden die URL im Browser-Suchfeld nicht ständig manuell ändern , oder? Wir müssen den Link ändern , den wir in der Showcard haben. Es bringt uns tatsächlich zu dieser dynamischen Seite. Lass uns versuchen, das zu tun. Inside show wissen wir, dass wir für Attribute, für Requisiten, dynamische Werte mithilfe von JavaScript bereitstellen können. Anstatt einfach eine statische Zeichenkettenwurzel zu übergeben, können wir geschweifte Klammern öffnen. Wir können sagen, bitte geh zu Slash, zeige die Slash-ID und das war's. Lass uns versuchen, das zu sehen. Wenn wir nach „Hallo“ suchen und immer wenn ich den Mauszeiger auf den Link in der linken unteren Ecke bewege, siehst du den URL-Schrägstrich zeigen, fünf oder etwas. Es wird für jede Show immer anders sein. Wenn ich darauf klicke und zur Seite navigiere, lass mich zurückgehen und auf etwas anderes klicken . Du wirst sehen, dass es jetzt anders ist. So können wir mit React Router dom dynamische Seiten in unserer App erstellen , und wir können dynamische Parameter mit dem use params Hook von der URL abrufen dem use params Hook von der URL und sie dann innerhalb der Komponente verwenden, um Daten abzurufen. werden wir im nächsten Video machen. Lassen Sie uns vorerst einfach alles verpflichten, was wir hier getan haben. Lassen Sie uns einen Überblick geben. Insight-App haben wir eine neue dynamische Crowd erstellt, die auf dem showID-Parameter basiert. Wir haben diesen Parameter showId genannt. In der Show-Komponente, die wir erstellt haben und die Komponente repräsentiert unsere Seite, haben wir den showID-Parameter mithilfe des use params-Hook abgerufen. In der kurzen Karte haben wir den Link so geändert, uns tatsächlich zur Show-Seite weiterleitet. Fantastisch. Ich werde alles als dynamische Show-Seite erstellen benennen, und ich denke, das wird in Ordnung sein Verschiebe alles auf GitHub und wir sehen uns auf der nächsten Seite. 70. 14 Einführung in die useEffect Haken: Hallo. Im letzten Video haben wir eine dynamische Showseite erstellt. Jetzt ist es an der Zeit, dass wir einige dynamische Daten auf dieser Seite abrufen. In diesem Video werden wir darüber sprechen, wie dies erreicht werden kann. Damit wir verstehen, wie es funktioniert, müssen wir einen anderen React-Hook namens useEffect kennenlernen . Sie erinnern sich, dass ich zuvor mit einem über den Lebenszyklus von Komponenten gesprochen habe . Der Lebenszyklus einer Komponente ist der Zeitraum vom Einbinden der Komponente bis zum Abmelden von der Seite. Schauen wir uns den Lebenszyklus der Komponenten genauer an. Wir können drei verschiedene Zeitpunkte unterscheiden , zu denen die Komponente montiert wird. Zweitens ist die Komponente bereits montiert und wird jedes Mal neu gerendert, und wird jedes Mal neu gerendert wenn sich der Zustand im Inneren ändert. erneute Rendern und der dritte Zeitpunkt werden entfernt oder nur, wenn die Komponente demontiert wird. Diese drei Zeitpunkte stellen den Lebenszyklus der Komponente dar. Für unsere Strategie zum Abrufen von Daten interessieren wir uns nur für den Zeitpunkt, interessieren wir uns nur für den Zeitpunkt, zu dem die Komponente montiert wird. Weil unsere Logik die folgende sein wird. Sobald wir die dynamische Seite für Show öffnen, holen wir uns die Show-ID von der URL und verwenden dann diese Show-ID, um Daten nur einmal abzurufen , wenn die Komponente gemountet wird. Wir möchten diese Logik zum Abrufen von Daten nicht jedes Mal erneut ausführen Logik zum Abrufen von Daten nicht jedes Mal wenn die Komponente erneut gerendert wird. Dies ist wichtig, um zu verstehen , dass wir Logik nur einmal ausführen müssen. Lassen Sie uns nun versuchen zu sehen, wie uns der UseEffect Hook dabei helfen kann. Lassen Sie mich wahrscheinlich zum Suchformular navigieren. In dieser Komponente werden wir mit diesem UseEffect Hook spielen und verstehen, wie er funktioniert und wie er uns helfen kann. Ich werde diese drei Punkte zum Lebenszyklus von Komponenten hier darlegen . Dann werde ich oben von React useEffect importieren. Versuchen wir nun, diesen Haken zu benutzen. Innerhalb der Komponente rufe ich diesen Hook auf, und dieser Hook erhält zwei Argumente. Das erste Argument ist die Funktion, der Callback, der die von uns gewünschte Logik ausführt , und das zweite Argument ist ein sogenanntes Array von Abhängigkeiten. Wir werden etwas später über eine Reihe von Abhängigkeiten sprechen . Lassen Sie uns vorerst einfach ein leeres Array übergeben. Unser erster Anwendungsfall ist nun die Montage der Komponente. Wir wollen die Logik nur einmal ausführen , wenn die Komponente gemountet wird. Dieser Callback wird übrigens der Effekt des useEffect genannt . Bezeichnen wir diesen Callback als Effekt. Mein Effekt wird sein, dass ich einfach das Konsolenprotokoll ausführe und sage Component Mounts. Nichts Kompliziertes. Kehren wir nun zu unserer App zurück, öffnen wir die Konsole und in der Konsole sehen wir die Komponentenhalterungen , die zweimal gedruckt werden. Es wird zweimal gedruckt, weil wir den strikten React-Modus haben. Wenn Sie sich daran erinnern, dass es bei der Entwicklung bewusst darauf hinausläuft, Komponenten zweimal zu verwenden, um mögliche Fehler zu erkennen. Wir wollen dieses Verhalten nicht, wenn wir mit useEffect arbeiten. Moment werde ich nur den strikten React-Modus entfernen. Kommen wir zurück zu unserer App. Wenn ich die Seite aktualisiere und die Komponente mountet, wird die Suchformularkomponente gemountet, ich sehe mein Konsolenprotokoll hier. Wenn ich versuche, einen dieser Zustände zu aktualisieren, wenn ich etwas in die Eingabe eingebe, wird die Komponente erneut gerendert. Sie werden jedoch feststellen, dass Component Mounts nie wieder ausgeführt werden. Lass es mich versuchen. Ich tippe etwas in die Eingabe, diese Komponente wird neu gerendert. Component Mounts werden jedoch nie wieder funktionieren. Um uns das Beobachten zu erleichtern, füge ich hier das Konsolenprotokoll hinzu und sage, dass die Komponente erneut gerendert wird. Was haben wir hier? Halterungen für Komponenten. Wir sehen ein erneutes Rendern von Komponenten. Das ist in Ordnung, da dies das erste Mal ist , dass die Komponente montiert wird. Dann sehen wir tatsächlich die Nachricht, die wir in useEffect verwenden. Wenn ich diesen Status aktualisiere, nur die Komponente neu gerendert. Wir sehen nie Komponentenhalterungen. So können wir die Logik nur einmal ausführen, wenn die Komponente gemountet wird. Lassen Sie uns nun den dritten Anwendungsfall hier beobachten. Wenn die Komponente demontiert wird. In useEffect innerhalb dieses Effekts, innerhalb des Callbacks, können Sie eine sogenannte Cleanup-Funktion übergeben . Es ist im Grunde die Funktion, die vom Callback zurückgegeben wird. Rückgabefunktion. Diese Funktion hier wird ausgeführt, wenn die Komponente ausgemountet wird. Lass es uns versuchen und sehen. In der Cleanup-Funktion werde ich Komponenten-Unmounts schreiben. Mal sehen. Erstens haben wir genau das gleiche Verhalten wie zuvor. Aber sobald sie die Seite ändern, die Navigation, wenn ich zur Startseite gehe, dieses Komponentensuchformular wird dieses Komponentensuchformular von der Seite entfernt. Mal sehen, was passiert. Ich fange an und du siehst die Komponenten unmounts. Die in der Bereinigungsfunktion definierte Logik wird ausgeführt, kurz bevor die Komponente von der Seite entfernt wird. Auf diese Weise können wir uns in den unmontierten Zeitpunkt einklinken. Bisher haben wir zwei Zeitpunkte festgelegt, wann die Komponente montiert und wann die Komponente demontiert wird. Beim zweiten Anwendungsfall, wenn die Komponente erneut gerendert wird, wird es mit useEffect etwas schwierig. Nehmen wir an, ich möchte eine gewisse Logik ausführen, wenn sich die Suchoption ändert. UseEffect kann eine gewisse Logik ausführen , wenn sich etwas ändert. Dieses zweite Argument, das Abhängigkeitsarray, dient genau diesem Zweck. Es definiert und weist den useEffect an, diese Logik vom Callback aus auszuführen , wenn sich etwas ändert. Innerhalb des Abhängigkeitsarrays listen wir Werte auf, auf die wir warten möchten, und wenn sich dieser Wert ändert, weisen wir useEffect an, bitte führen Sie die Logik erneut aus. Lass es uns versuchen und sehen. Ich werde die Cleanup-Funktion kommentieren, anstatt Komponenten zu mounten, werde ich etwas wie Änderungen der Suchoption mitteilen. Als Abhängigkeitsarray als einen der Werte innerhalb des Abhängigkeitsarrays übergebe ich als einen der Werte innerhalb des Abhängigkeitsarrays die Suchoption. Mal sehen. Ich aktualisiere die Seite, nichts wird gedruckt, weil ich gerade auf der Startseite bin . Sobald ich zur Homepage gehe, sehen wir, dass die Komponenten neu gerendert und die Suchoption geändert wird. Warum sehen wir Änderungen der Suchoption, wenn wir etwas innerhalb der Abhängigkeitsrate angeben? Die Sache ist, dass useEffect immer mindestens einmal ausgeführt wird, egal was passiert. useEffect wird mindestens einmal ausgeführt, egal was passiert. Wenn ich nun versuche, etwas in die Eingabe einzugeben, sehen wir nur das erneute Rendern der Komponenten, wir sehen nie Änderungen der Suchoptionen. Aber sobald ich den Status der Suchoptionen aktualisiere , indem ich die Suchoption set aufrufe, wird useEffect erneut ausgeführt. Mal sehen. Wir sehen Änderungen der Suchoptionen. Wir ändern es erneut, und jedes Mal, wenn der Wert geändert wird , wird der Effekt erneut ausgeführt. So einfach ist das. Hier können Sie beliebig viele Abhängigkeiten auflisten. Wenn sich einer von ihnen ändert, wird der Effekt jedes Mal erneut ausgeführt. Im Grunde achten wir auf Wertänderungen, und wenn diese Wertänderung stattfindet, wiederholt sich der Effekt. Mit dieser Methode können wir uns in die Re-Rendering-Logik der Komponente einklinken und hier unsere eigene Logik ausführen, indem wir wiederum den useEffect-Hook verwenden . Nennen wir es jedoch den Anwendungsfall 2.5, wenn wir die Logik vor dem nächsten erneuten Rendern ausführen möchten. Es mag raffiniert klingen, und bis zu einem gewissen Grad ist es das auch, aber schauen wir uns an, wie es funktioniert. Unsere 2.5 wird vor den nächsten drei Neurendern logisch sein. Die Bereinigungsfunktion hier, ich habe Ihnen bereits gesagt, wenn Sie etwas Logik ausführen möchten , bevor die Komponente summiert wird, können Sie diese Funktion aus dem Effekt zurückgeben und was auch immer Sie hineinlegen , wird ausgeführt, bevor die Komponente demontiert wird. Dies funktioniert jedoch nur, wenn das Abhängigkeitsarray leer ist. Wenn wir Abhängigkeiten innerhalb des Abhängigkeitsarrays haben, wird die Bereinigungsfunktion für jeden Effekt ausgeführt. Wenn der aktuelle Effekt beendet ist, wird die Logik für diesen Effekt ausgeführt , bevor der nächste Effekt ausgeführt wird. Anstelle der Komponentenmengen nehmen wir an, dass sich die Suchoption ändert, und hier im selben Konsolenprotokoll und hier im selben Konsolenprotokoll werden wir auch die Suchoption einfügen. Wir werden den Wert des Staates erkennen können. Lass es uns versuchen. Ich aktualisiere die Seite. Ich sehe Änderungen der Suchoption. Es wird derzeit angezeigt. Sobald sie die Option ändern, schauen wir, was passiert. Wir sehen, wie die Komponenten wie gewohnt neu gerendert werden, wir sehen Änderungen der Suchoptionen. Sagen wir die Suchoption, sagen wir, bevor sich die nächste Suchoption ändert, oder sagen wir vor dem nächsten useEffect-Lauf. Lass es uns noch einmal versuchen. Wir sehen Änderungen der Suchoptionen, Shows. Jetzt ändern wir die Option, und was ich vor dem nächsten Ausführen von useEffect sehe, wird angezeigt. Diese Bereinigungsfunktion wird für jeden Effektlauf ausgeführt. Unser derzeitiger Versuch, diesen Effekt zu erzielen, richtet sich an staatliche Akteure. Da unser aktueller Status aus Akteuren besteht, diesem Moment die letzten Auswirkungen auf. der Effekt das nächste Mal ausgeführt wird, wird die Bereinigungsfunktion für unseren aktuellen Effekt für Schauspieler ausgeführt . Wenn ich es wieder auf Shows ändere, werden wir vor dem nächsten useEffect-Lauf mit Schauspielern sehen und dann werden wir sehen sich die Suchoptionen für Shows ändern. Lass es uns versuchen. Wir sehen vor dem nächsten useEffect-Lauf, eigentlich ab sofort für unseren vorherigen useEffect-Lauf und unseren neuen Lauf von useEffect. Nun, das klingt kompliziert. Eigentlich ist es das auf den ersten Blick. Es macht jedoch tatsächlich Sinn. Es gibt viele Anwendungsfälle, in denen Sie jede dieser Optionen verwenden möchten . Durch die Verwendung von useEffect sind wir in der Lage, einige Logiken während eines kompetenten Lebenszyklus unter verschiedenen Bedingungen und Umständen auszuführen kompetenten Lebenszyklus unter . Wir können das Abhängigkeitsarray verwenden, um useEffect anzuweisen , wann wir diese Logik ausführen möchten . Im Moment haben wir uns useEffect angesehen und den Wert des Suchoptionsstatus in der Konsole protokolliert , wenn sich eine Suchoption ändert. Vielleicht haben Sie eine Frage, warum wir UseEffect hier verwenden, wenn wir das Konsolenprotokoll ohne useEffect direkt hier platzieren können , genau wie wir es beim erneuten Rendern von Komponenten getan haben. Nun, die Sache ist, wieder mit useEffect haben Sie das Abhängigkeitsarray. Dieses erneute Rendern der Konsolenprotokollkomponente wird bei jedem kompetenten Re-Rendering ausgeführt, egal was passiert. Die Komponente wird gerendert, Sie werden immer das Konsolenprotokoll sehen. Mit dem useEffect warten Sie jedoch nur auf Werte, die sich ändern, und diese Werte werden im Abhängigkeitsarray angegeben . Wenn Sie ein leeres Abhängigkeitsarray angeben, werden diese useEffect nur einmal ausgeführt , wenn die Komponente gemountet wird. Diese Logik, die Bereinigungsfunktion hier wird ausgeführt, wenn die Komponente ausgemountet wird. Selbst wenn Sie die Abhängigkeit haben, beim Aushängen der Komponente feststellen, werden Sie beim Aushängen der Komponente feststellen, dass die Bereinigungsfunktion ebenfalls ausgeführt wird. Lassen Sie uns das beobachten. Wir wechseln die Schauspieler und wir haben unseren vor dem nächsten useEffect-Lauf. Wenn die Komponente nicht gemountet wird, werden Sie dies vor dem nächsten useEffect-Lauf sehen. Im Grunde bereinigt die Bereinigungsfunktion, genau wie ich Ihnen gesagt habe, genau wie ich Ihnen gesagt habe, den aktuellen useEffect-Lauf. Mit diesem Ansatz können wir Daten nur einmal abrufen, können wir Daten nur einmal abrufen wenn die Komponente gemountet wird. Wir geben ein leeres Abhängigkeitsarray , um useEffect anzuweisen, nur einmal auszuführen , wenn die Komponente gemountet wird. Innerhalb des Effekts werden wir die Logik von der API abrufen. So einfach ist das. Jetzt, wo wir etwas mehr über den Kompetenzlebenszyklus wissen, wissen wir, dass wir useEffect verwenden können, um kompetente Logik während des Lebenszyklus von Komponenten zu manipulieren . Wir können Daten abrufen und endlich etwas anzeigen. Im nächsten Video werden wir genau das tun. Lassen Sie uns vorerst den React Strict Mode zurückbringen und darüber werden wir noch einmal sprechen. Für den Moment ist das alles. Wir sehen uns im nächsten. 71. 15 Fetching von TV mit useEffect: Hallo nochmal. Im letzten Video haben wir über den useEffect Hook gesprochen, wie er uns helfen kann, die Logik innerhalb der Komponente während des Lebenszyklus der Komponente zu manipulieren die Logik innerhalb der Komponente während des Lebenszyklus der . Versuchen wir, useEffect auf unserer dynamischen Show-Seite anzuwenden , um einige Daten abzurufen. Lass uns gehen. Ich gehe zu den Seiten, Show.jsx. Wie Sie sich erinnern, holen wir uns hier die ShowID aus der URL. Lass uns nach Shows suchen. Sagen wir, Jungs. Wir gehen mehr lesen. Wir haben diese URL. Was auch immer wir in der URL, unserem dynamischen Parameter, haben , wir holen es mit dem useParams Hook ab. Lassen Sie uns nun UseEffect aus dem React-Paket importieren und jetzt in das Paket, das useEffect ausführen wird. Da wir Daten nur einmal abrufen wollen, wollen wir Logik nur einmal ausführen, wenn die Komponente gemountet wird. Aus diesem Grund geben wir ein leeres Array von Abhängigkeiten an. In diesem useEffect werden wir FetchData abrufen. Mal sehen, wie der Endpunkt aussehen wird. Das wird uns Informationen zur Show geben. Wenn wir zur TVMaze API gehen und hier nach dem Abschnitt Shows suchen, haben wir diesen Endpunkt/shows/id, und Sie können dieses Beispiel sehen. Lass es uns öffnen und sehen. Durch Angabe der ID der Show können wir alle erforderlichen Daten abrufen. Lassen Sie uns eine weitere wiederverwendbare Funktion in der tvmaze.js erstellen , in der wir diesen Endpunkt abfragen. Lassen Sie uns von hier aus eine weitere Funktion untersuchen , die wir getShowById nennen werden. Als Argument geben wir showId an, und darin rufen wir ApiGet auf, und wir nennen diese URL, diesen Endpunkt. Da ID etwas Dynamisches ist , das wir durch das Argument bereitstellen, werden wir Backticks verwenden, damit wir die Zeichenketteninterpolation anwenden können. Unsere Funktion wird so aussehen. Jetzt können wir in show jsx getShowById aus der API tvMaze importieren. Dann können wir in useEffect getShowId aufrufen und showId übergeben. Wir möchten eine Sync-Wait-Syntax verwenden , weil sie benutzerfreundlicher ist, aber Sie können den Callback von useEffect nicht async durchführen. Wenn ich das mache, werden Sie hier diese Warnung sehen, die aus dieser ESLint-Regel für Hooks stammt. Es sagt, Effekt-Callbacks sind synchron, um Rennbedingungen zu verhindern, stellen Sie die Async-Funktion und die Site ein. Sie können dieses Beispiel hier sehen. Nun, genau das werden wir tun. Wir werden eine asynchrone Funktion in useEffect erstellen und diese Funktion dann darin aufrufen. Lass uns das versuchen. In unserem Fall wird es wie fetchData aussehen. Wir markieren den Callback nicht als async , der FetchData heißt. In FetchData rufen wir ein Weight get show by ID auf und geben showID an, und geben showID an die wir aus der URL abgerufen haben. Sobald ich showId in useEffect verwende, werden Sie feststellen, dass ich jetzt diese Warnung hier habe, die besagt, React-Hook useEffect eine fehlende Abhängigkeit hat, showId. Wenn Sie etwas in der Komponente definiert haben und dieses Etwas, diesen Wert , im Idealfall in useEffect verwenden, muss er idealerweise als Abhängigkeit von diesem useEffect angegeben werden . Der Grund dafür ist, dass, sagen wir unsere showID hier auch dynamisch sein könnte, zum Beispiel könnte es unser Status sein, und wir möchten diesen useEffect ausführen, wenn sich dieser Wert ändert. Wenn wir hier keine Abhängigkeit angeben, lassen Sie unser Array von Abhängigkeiten leer. Die Logik wird nur einmal ausgeführt, wenn die Komponente gemountet wird. Aber was ist, wenn sich diese ShowID ändert, sagen wir von 1-2? In diesem Fall ist es für uns sinnvoll, Daten erneut abzurufen, um die neueste Sendung mit ID gleich zwei zu holen. Wenn wir die Reihe von Abhängigkeiten jedoch leer lassen, wird der Effekt nie wieder ausgeführt. Damit wir das korrigieren können, was auch immer wir in useEffect verwenden, alle Werte hier, die potenziell dynamisch sein oder sich ändern könnten , müssen wir das angeben. Dies ist unsere Abhängigkeit von diesem useEffect-Callback. Deshalb werde ich showId als Teil von useEffect auflisten. Jetzt bekommen wir unsere Daten hier. Versuchen wir es mit Konsolenprotokolldaten. Wir kommen zurück. Was wir jetzt sehen, sind zwei Konsolenprotokolle. Der Grund dafür ist wiederum der StrictMode, den wir haben. StrictMode ist problematisch und wurde in React Version 18 eingeführt, aber Sie können jetzt sehen, dass wir in der Entwicklung dieses Problem haben , dass die Komponente zweimal neu gerendert wird. Da wir in useEffect Daten abrufen, bedeutet das, dass wir Daten zweimal abgerufen haben. Das ist nicht wirklich das, was wir wollen. In diesem Fall empfiehlt das React-Team, dass Sie ab React 18, wenn Sie Daten abrufen möchten, etwas anderes als useEffect verwenden sollten. Wir werden etwas später darüber sprechen, aber das ist sehr umstritten. Vor React,18 in Version 17 und früher die sehr einfache und standardmäßige Methode zum Abrufen von Daten genau das, indem useEffect verwendet wurde. Nun, mit React 18 ändert sich nicht viel, außer dass wir jetzt React StrictMode haben. Moment schlage ich vor, React StrictMode zu entfernen, und wir werden es später aktivieren, wenn wir eine Alternative zur Verwendung des useEffect Hook für FetchData sehen werden. Moment werde ich in Index jsx einfach React StrictMode entfernen. Unser useEffect wird in der Entwicklung nicht zweimal ausgeführt . Jetzt speichern wir es. Ich habe die Seite aktualisiert und Sie sehen, ich habe hier Daten. Wenn ich die Registerkarte Netzwerk öffne, aktualisiere ich die Seite. Hier finde ich den Aufruf der TVMaze API mit showID, den wir von der URL erhalten. Wenn ich eine Vorschau ansehe, sind das die Daten, die wir haben. Lassen Sie uns nun einen Status erstellen und diese Daten in den Zustand versetzen. Nennen wir es einfach showData und setzen show data. Dies wird der useState-Anruf sein. Standardmäßig sind die Daten Null. Dann erstellen wir einen weiteren Status, um jeden Fehler abzufangen , falls die Anfrage fehlschlägt. Ich werde showError, setShowError erstellen. In der Standardeinstellung sind Anrufe Null. Ich werde einen Weg zu getShowId, getShowById in den try catch Block packen . Innerhalb des Catch-Blocks rufe ich set showError auf null auf. Wenn ich dann Daten erhalte, rufe ich setShowData und lege diese Daten als Teil des Zustands fest. Jetzt können wir bedingtes Rendern verwenden, um alle Daten anzuzeigen, die wir aufgenommen haben, und wir können den ShowData-Status verwenden. Wir können die Logik des bedingten Renderings direkt in die Komponente schreiben , nicht nur innerhalb des JSX-Markups, nicht nur, indem wir beispielsweise eine Hilfsfunktion verwenden , in der wir Logik definieren, wir können sie auch direkt in die Komponente schreiben. Hier frage ich nur, ob wir showError von dieser Funktion haben , von unserer Komponente, geben Sie bitte div zurück, was besagt, dass wir einen Fehler haben, showError.Message, weil showError das Fehlerobjekt sein wird. Hier habe ich es auf Null gesetzt, tut mir leid, es muss das andere Objekt sein, das wir hier fangen. Falls wir nun einen Fehler haben, geben wir das JSX-Markup mit einem Fehler zurück. Wenn wir ShowData haben, haben wir in diesem Fall Show-Daten. Lassen Sie uns vorerst einfach absagen. Lass uns sehen. Was haben wir? Wir haben einen Namen, also lass es den ShowData-Namen sein. Wenn keine dieser beiden Bedingungen erfüllt ist, können wir standardmäßig sagen, dass die Daten geladen werden. Ich kann sehen, dass ich search showError nicht verwendet habe. Hier habe ich es tatsächlich nicht benutzt. Lass uns sehen. Ich habe Showdaten, Jungs. Wenn ich aktualisiere, können Sie das hier blinken sehen, und dieses Blinken bedeutet, dass diese Daten geladen werden. Die Daten werden so schnell geladen, dass wir nicht einmal bemerken können , dass die Daten eine Nachricht laden. Aber wenn dieser API-Aufruf beispielsweise 10 Sekunden dauern würde, würden wir sehen, dass Daten geladen werden. Mit diesem Ansatz können Sie Daten abrufen, wenn die Komponente gemountet wird. Im nächsten Video werden wir uns einen neuen Begriff vorstellen , der Custom React Hooks heißt. Zum Beispiel haben wir hier useState verwendet und wir haben sowohl useEffect als auch useParams verwendet. Was auch immer Sie direkt aus React importieren, diese Hooks werden als integrierte React-Hooks bezeichnet. Aber Sie können anhand von react-route-dom sehen, dass wir etwas namens useParams importieren. Es ist auch ein React-Hook, aber es ist kein Teil der React-Bibliothek. Es ist etwas Benutzerdefiniertes, das von React-Router-dom erstellt wurde. Im nächsten Video werden wir darüber sprechen und unseren eigenen benutzerdefinierten Hook erstellen. Aber bevor wir dieses Video beenden, lassen Sie uns alles, was wir getan haben, begehen. Zunächst haben wir den StrictMode deaktiviert, sodass unser useEffect in der Entwicklung nicht zweimal ausgeführt wird. Dann erstellen wir eine getShowById-Funktion , die Daten abruft und innerhalb der Show-Komponente den useEffect-Hook, den FetchData, verwendet. Git add dot commit everything. Wir werden FetchData innerhalb der Show-Komponente angeben oder Show-Daten innerhalb der Show-Komponente abrufen, einfach so. Nächstes Video, benutzerdefinierte Hooks. Wir sehen uns dort. 72. 16 Custom React Haken: Hallo, da. Im letzten Video rufen wir mit Hilfe von useEffect Daten in der Show-Komponente ab. letzte Mal habe ich erwähnt, dass wir in diesem Video über den Unterschied zwischen integrierten React-Hooks und benutzerdefinierten Hooks sprechen den Unterschied zwischen integrierten React-Hooks und benutzerdefinierten Hooks werden, die wir aus anderen Bibliotheken importieren können. Die Sache ist, dass diese benutzerdefinierten Hooks eigentlich nur mehr Logik sind , zusätzlich zu integrierten React-Hooks, die Sie bereits gesehen haben, wie useEffect oder useState. Was ist dann der Unterschied? Diese Hooks useParams sind zum Beispiel nur Hooks mit zusätzlicher Logik, sodass wir Logik nicht in die Komponente schreiben müssen. Die Frage ist hier, warum brauchen wir benutzerdefinierte Hooks? Sie können sehen, dass wir im letzten Video tatsächlich drei verschiedene Hooks verwendet haben, eigentlich zwei Hooks, aber wir verwenden sie dreimal in unserer Komponente, useState, useState und dann useEffect hier. Nehmen wir nun an, ich möchte diese Logik in anderen Komponenten wiederverwenden. Was ist dann meine Option? Ein sehr naiver Ansatz besteht darin, diesen Code einfach zu kopieren und ihn irgendwo in anderen Komponenten zu verwenden. Aber du kannst sehen, dass es eine Menge Wiederholungen sind. Wenn wir nicht speziell über React sprechen, wenn wir uns das Beispiel der Programmierung ansehen können , um Logik irgendwie wiederzuverwenden, verwenden wir Funktionen oder wenn wir einfach etwas von der Stelle extrahieren wollen , würden wir auch eine Funktion verwenden, um den Raum, in dem diese Logik vorhanden ist, nicht zu färben. Genau das Gleiche gilt für Hooks. Wenn Sie die Hook-Logik wiederverwenden oder nur die Logik aus der Komponente extrahieren möchten , können Sie sie in einem benutzerdefinierten Reaktor platzieren. Das ist der Grund, warum wir sie verwenden. Sie werden verwendet, um die Hook-Logik wiederzuverwenden zweite Option ist, wenn Sie Logik aus der Komponente extrahieren möchten , damit sie innerhalb dieser Komponente nicht viel Platz beansprucht. In unserem Fall wird diese Logik nirgends in der App wiederverwendet, da wir nur einen Ort haben, an dem wir eine bestimmte Show innerhalb der Show-Komponente abrufen . Aber stellen wir uns vor, wir hätten einen anderen Ort, an dem wir diese Showdaten abrufen wollten. Anstatt die Logik zu kopieren und einzufügen, hätten wir sie in einen benutzerdefinierten Hook in allen Komponenten einfügen allen Komponenten denen wir die Show abrufen müssen. Lass mich dir zeigen, was ich meine. Oben auf der Datei erstelle ich einen benutzerdefinierten Funktions-Hook , den ich so etwas wie useShowById nenne. Du kannst ihm einen beliebigen Namen geben. Aber alle React-Hooks haben die Konvention, dass sie mit dem Use-Präfix beginnen müssen. Wenn Sie Ihren benutzerdefinierten Hook benennen möchten, stellen Sie sicher, dass er mit use, useShowById beginnt Es wird nur eine einfache Funktion sein und ich kopiere einfach meine Logik nach fetchData von der Komponente in den useShowById-Hook. Sie können hier ein paar Dinge sehen. Zuallererst haben wir innerhalb des Hooks keinen Zugriff auf die showID-Variable. Aber da es sich um eine Funktion handelt, können wir sie als Argument empfangen. Lass uns das machen. Sie können sehen, dass wir in der Show-Komponente jetzt keinen Zugriff auf showError oder ShowData haben. Genau der gleiche Ansatz. Wenn unsere useShowById nur eine Funktion ist, können wir einen Wert daraus zurückgeben. Wir sagen, gib ein Objekt mit zwei Schlüsseln zurück , showData und showError. Jetzt können wir diesen useShowByID-Hook in der Show-Komponente verwenden . Wir rufen diesen Hook einfach auf, wir übergeben showId und dieser Hook gibt uns ein Objekt mit zwei Schlüsseln zurück , showData und showError. Zerstören wir sie. Schauen Sie sich jetzt unser Endergebnis an. Wir haben nur eine einzige Zeile und die Logik ist woanders geschrieben. Wenn ich es verstecke, können Sie sehen, dass unsere Komponente jetzt viel sauberer ist als zuvor, und unsere Logik, Daten abzurufen, um abzurufen, zeigt, dass sie woanders lebt. Wenn ich diese Logik nun in anderen Komponenten wiederverwenden möchte, würde ich einfach useShowById, pass, showId als Argument aufrufen pass, showId als Argument und dann meine ShowData und meinen showError erhalten Lassen Sie uns zum Beispiel diese Zeile kopieren. Wenn ich Show in der App-Komponente abrufen möchte, würde ich einfach diesen Hook in der Vergangenheit verwenden, egal welche Show ich will, als Argument und ich hätte Zugriff auf showData und showError. Die Logik mit benutzerdefinierten Hooks, die Idee mit benutzerdefinierten Hooks ist dieselbe wie bei Funktionen in der Programmierung, aber bei benutzerdefinierten Hooks schreibt man Logik auf eingebaute oder andere React-Hooks. So einfach ist das. Das war's jetzt. Aber Sie erinnern sich, dass wir im letzten Video, als wir den useEffect-Hook vorgestellt haben, dieses Problem mit dem React-Strict-Modus in der Entwicklung hatten . Der React-Strict-Modus rendert die Komponente zweimal. Deshalb läuft unser useEffect immer mindestens zweimal. Das war problematisch. Die Lösung, die die Reaktion empfiehlt, besteht darin , etwas anderes anstelle von useEffect zu verwenden. Im nächsten Video werden wir darüber sprechen. Wir werden über die Alternative zu useEffect zum Abrufen von Daten sprechen . Wir werden endlich in der Lage sein unseren React-Strict-Modus wiederherzustellen, und wir werden keine Probleme damit haben, Daten nur einmal abzurufen , wenn die Komponente gemountet wird. Lassen Sie uns vorerst alles festlegen und dieses Video wie immer mit einer guten Note beenden. Meine Commit-Nachricht wird sehr einfach sein Extrahieren Sie die Datenstapellogik in einen benutzerdefinierten Hook useShowById. Fantastisch. Wir sehen uns im nächsten. 73. 17 Datenabruf mit Bibliotheken: Hallo nochmal. Im letzten Video haben wir über den Unterschied zwischen integrierten React-Hooks und benutzerdefinierten React-Hooks gesprochen . Im Grunde sind benutzerdefinierte React-Hooks die Hooks, die wir mit unserer eigenen Logik zusätzlich zu den integrierten React-Hooks schreiben. Der Grund dafür ist , dass wir etwas Logik extrahieren wollen oder ob wir die Hook-Logik wiederverwendbar machen wollen. In diesem Fall verwenden wir benutzerdefinierte Hooks. Wir rufen auch Daten von der TVMaze API nur einmal ab, wenn die Komponente gemountet wird. Das machen wir mit Hilfe des useEffect-Hooks. Aber wenn Sie sich erinnern, haben wir React StrictMode deaktiviert, weil es die Komponente zwingt, in der Entwicklung zweimal neu zu rendern, was bedeutet, dass useEffect immer mindestens zweimal statt nur einmal ausgeführt wird . Dies ist für unsere spezifische Situation problematisch . Um dies zu vermeiden, empfiehlt das React-Team Daten mit etwas anderem abzurufen. Sie empfehlen nicht, den useEffect-Hook zum Abrufen von Daten zu verwenden , wenn Sie React StrictMode aktiviert haben. Sie sprechen über etwas anderes. Was ist das? Nun, im Frontend gibt es das Konzept von sogenannten Datenabrufbibliotheken. Zwei Beispiele hierfür können React Query sein und SWR verwenden Beide sind sehr beliebt und beide sind einander sehr ähnlich. Aber was sie tatsächlich tun, zum Beispiel auf der Seite use SWR, können wir dieses sehr einfache Beispiel sehen, mit dem wir den use SWR-Hook aufrufen , sagen wir den Pfad , den wir abrufen möchten, und dann die Funktion, die Daten abruft. Dann gibt uns der Hook einen Datenfehler, den wir in unserer Anwendung verwenden können. Wenn wir das nun mit dem vergleichen, was wir hier geschrieben haben, finden Sie einen sehr ähnlichen Hinweis. Unser Hook hier zielt jedoch speziell darauf ab, Unser Hook hier zielt jedoch speziell darauf ab Sendungen von der TVMaze API abzurufen und sie per ID abzurufen. Das ist also die spezifische Logik , die eng mit der TVMaze API verknüpft ist , um Sendungen gezielt nach ID abzurufen . Wenn wir, sagen wir, eine Menge unterschiedlicher Abruflogik in unserer Anwendung über, sagen wir, Hunderte von Komponenten hinweg hätten eine Menge unterschiedlicher Abruflogik unserer Anwendung über, sagen wir, Hunderte von Komponenten hinweg , müssten wir uns in diesem Fall etwas Abstrakteres einfallen lassen, um unsere Abruflogik wiederverwendbarer zu machen und nicht eng an eine bestimmte Implementierung gekoppelt zu sein. Bibliotheken zum Abrufen von Daten machen genau das; sie geben uns den abstrakten Hook , mit dem wir Daten innerhalb der Komponente abrufen können. So ist es für uns einfacher , diese Logik in der Anwendung, die wir schreiben und die wir erstellt haben, wiederzuverwenden , diese Logik in der Anwendung, die . Suchen wir zum Beispiel in React Query nach Quick Start. Sie können sehen, dass die Logik ziemlich ähnlich ist; wir haben etwas namens Abfrageschlüssel und Abfragefunktion, darüber werden wir gleich sprechen, aber die Logik ist die folgende. Wir haben einen abstrakten Hook zum Abrufen von Daten, zu diesem abstrakten Hook wir unsere Logik zum Abrufen von Daten an, und dieser benutzerdefinierte Hook gibt uns einen Datenfehler und lädt Variablen, die wir innerhalb der Komponente verwenden können. Sie dienen dazu, das Abrufen von Daten für Entwickler optimierter, wiederverwendbarer und benutzerfreundlicher zu gestalten. Lassen Sie uns versuchen, eine dieser Bibliotheken zu installieren. In unserem Fall verwenden wir die React-Abfrage, das liegt nur daran, dass ich mich so entschieden habe. Wenn Sie möchten, können Sie useSWR ausprobieren, die Syntax ist ziemlich ähnlich. In der Dokumentation gehe ich zur Installationsseite. Von hier aus kopiere ich einfach das von NPM installierte Tanstack/React-Query. Ich werde diese Abhängigkeit zu meinem Projekt hinzufügen. Es wird im Paket Jason hier oben erscheinen. Großartig. Jetzt gehe ich zum Schnellstart und folge dem Beispiel. Zuerst müssen wir einen Kunden erstellen, dann müssen wir einen sogenannten Kreditkundenanbieter verwenden und diesen Kunden dorthin weiterleiten. Dann können wir innerhalb der Komponenten den useQuery-Hook verwenden. Mal sehen, wie es uns helfen kann. Ich kopiere einfach diese Eingaben von hier, ich gehe hier zur App-Komponente, ganz oben, ich werde nur Abfrageclient und Critic Client Provider importieren nur Abfrageclient und Critic Client Provider , einfach so, dann erstelle ich einen neuen Kreditkunden außerhalb der Komponente, dann verwende ich den Kreditkundenanbieter, sagen wir irgendwo hier, und schließe ihn am Ende. Irgendwann sieht meine App jetzt so aus. Großartig. Jetzt kann ich zur Show-Seite gehen und anstatt den use show by ID-Hook zu verwenden, verwenden wir hier den useQuery-Hook. Lassen Sie uns kommentieren, was wir hier haben, nennen wir useQuery, das auch aus tanstack/react-query importiert werden kann. Lass uns das machen. Wir benötigen nur useQuery und innerhalb der Komponente werden wir useQuery so aufrufen. Jetzt müssen wir hier Optionen übergeben. Options ist nur ein Objekt mit verschiedenen Schlüsseln , das wir liefern. Abfragetaste und Abfragefunktion sind erforderliche Optionen, die wir übergeben müssen. Der Abfrageschlüssel identifiziert eindeutig unsere Abfragelogik, unseren Faktor wie getsToDos in der gesamten Anwendung. Abfragefunktion ist die Logik zum Abrufen von Daten. Mal sehen, wie wir das nutzen können. Zuerst müssen wir den Abfrageschlüssel übergeben, und Sie können jetzt sehen, dass es sich um ein Array handelt. In unserem Fall können wir es so etwas wie Show Maybe nennen und dann wird unsere Show anhand der ID identifiziert, an die Sie sich erinnern. Wir werden Show und ShowID weitergeben. Dann müssen wir Fetcher bestehen. Sie können jedoch sehen, dass im Beispiel gerade die Abfragefunktion getsToDos übergeben wird . Aber in unserem Fall müssen wir irgendwie Zugriff auf ShowID in unserem Fetcher bekommen . Unser Fetcher ist diese Funktion, die wir zuvor erstellt haben, namens getShowById. Wenn wir in die Dokumentation schauen, ist sie irgendwo darin versteckt, ich sage Ihnen wo. Es befindet sich hier im Abschnitt Query Keys. Wenn wir hier hingehen und ganz nach unten scrollen und wir den ganzen Abschnitt hier sehen können, ob Ihre Abfragefunktion von der Variablen abhängt, ob Ihre Abfragefunktion von der Variablen abhängt die in Ihrem Abfrageschlüssel enthalten ist. Wir werden hier nur diesem Beispiel folgen. Ich kopiere es einfach und platziere es so. Der Abfrageschlüssel wird show statt todoId sein, wir werden showId anstelle von fetchToDobyId platzieren, wir werden getShowById aufrufen. Wir werden ShowID weitergeben. useQuery gibt uns ein Ergebnis zurück. Wenn wir versuchen, IntelliSense von diesem Ergebnisobjekt aus zu verwenden, können Sie sehen, dass wir hier eine Menge Dinge haben, aber wir interessieren uns speziell für Daten und Adder. Lass uns versuchen, das zu tun. Aus dem Ergebnisobjekt werde ich Daten abrufen und den Fehler abrufen. Ich werde sie umbenennen. Wir können Daten anstelle von ShowData verwenden, aber lassen Sie uns sie umbenennen Ich setze einen Doppelpunkt neben den destrukturierten Schlüssel und nenne ihn ShowData. Auf diese Weise. Der von mir destrukturierte Datenschlüssel wird in ShowData umbenannt. Aus dem Ergebnisobjekt heraus habe ich immer noch Daten destrukturiert, aber ich wollte nur einen anderen Namen haben, ShowData. Das Gleiche gilt für den Fehler, es wird showError sein. Jetzt kann ich tatsächlich zu meiner Bewerbung zurückkehren und sehen, wie sie funktioniert. Aber ich muss die App erneut starten, npm run start, ich komme zurück. Lass uns gehen und uns erfrischen. Sie können sehen, nun, nichts hat sich geändert, aber Moment haben wir den useQuery-Hook verwendet. Es ist eine benutzerdefinierte Hook-Logik, die irgendwo in der Tanstack/React-Query-Bibliothek geschrieben ist . Wir verwenden es nur, um Daten abzurufen. Sie können sehen , dass dieser Hook uns diese abstrakte Schnittstelle bietet , sodass wir diese Funktion in einen Hook wie useQuery einschließen und Daten nur einmal innerhalb der Komponente abrufen können. Dieser Abfrageschlüssel hier ähnelt etwas dem Abhängigkeitsarray in useEffect. Wenn sich etwas im Abfrageschlüssel ändert, werden die Daten hier wie bei useEffect abgerufen, sehr ähnlich. Das React-Team rät uns tatsächlich , so etwas zum Abrufen von Daten zu verwenden. Das ist eigentlich eine sehr gute Empfehlung. Sie wollten sich nicht jedes Mal in Ihrer Bewerbung mit all dieser sich wiederholenden Logik auseinandersetzen . Diese Bibliotheken haben viele Optionen, diese Bibliotheken sind für das Abrufen optimiert, sie haben diese Cache-Schlüssel und sie können viel mehr als nur das einfache Abrufen von Daten, spitze Komponentenmounts. In modernen React-Anwendungen ist die Bibliothek zum Abrufen von Daten ein sehr guter Weg. Wir werden useQuery für unser konkretes Beispiel verwenden. Jetzt können wir die Logik entfernen , die wir zuvor geschrieben haben, und jetzt können wir React.StrictMode wieder einbeziehen, da unsere Abfragelogik jetzt nicht zweimal ausgeführt wird. Lass uns das sehen. Wenn ich die Seite hier aktualisiere, habe ich nur einen Aufruf an die API, was bedeutet, dass unsere Logik, die wir hier schreiben , nicht zweimal abgerufen wird und wir trotzdem Zugriff auf React StrictMode haben. Mit diesem Ansatz haben wir zwei Fliegen mit einer Klappe geschlagen. Ich hoffe, es war nicht zu kompliziert oder ausgefeilt, um zu verstehen, wie das Abrufen von Daten in React funktioniert. Wir haben mit useEffect mit dem Nötigsten angefangen, weil useEffect verwendet werden kann, um Daten zu manipulieren und die Logik für einen Komponentenlebenszyklus zu manipulieren. Wir haben useEffect verwendet, um Daten nur einmal abzurufen , wenn die Komponente gemountet wird, aber wir mussten React StrictMode deaktivieren , da wir sonst etwas Logik schreiben müssen , um das doppelte Rendern im Entwicklungsmodus irgendwie zu überwinden . Um das zu überwinden, haben wir eine Bibliothek zum Abrufen von Daten verwendet. In unserem Beispiel haben wir React Query installiert. React Query gibt uns den abstrakten Hook useQuery, mit dem wir Daten innerhalb der Komponente abrufen können. Hoffentlich macht es Sinn. Diese Bibliotheken zum Abrufen von Bibliotheken sind eine gute Wahl, wenn Sie mit modernen React-Apps arbeiten. Lassen Sie uns die Änderungen , die wir vorgenommen haben, übernehmen. Was wir getan haben, wir haben im Grunde nur React Query installiert dann unseren benutzerdefinierten Hook für fetchShowById durch den useQuery-Hook ersetzt . Wir haben auch React StrictMode an die Anwendung zurückgegeben , da wir keine Probleme mehr mit dem Abrufen von Daten in useEffect hatten. Nun fügen wir alles zur Bühne hinzu, lassen Sie uns festlegen und sagen wir, die React-Abfrage installiert, useShowById durch den useQuery-Hook ersetzt. Fantastisch. Bis zum nächsten. 74. 18 Zuordnung: Hallöchen. Im letzten Video haben wir über Bibliotheken zum Abrufen von Daten gesprochen. Wir haben über React Query gesprochen und React Query in unsere App integriert. Wir haben den Use-Abfrage-Hook in der Show-Komponente verwendet , um Daten anhand der Show-ID abzurufen. Wenn wir jedoch zu Home jsx, Ihrer Home-Komponente, zurückkehren , können Sie sehen dass wir hier auch Daten abrufen. Es ist etwas anderes, als nur eine einfache GET-Anfrage zu stellen, wenn die Komponente gemountet wird. Da wir im Grunde Filter haben, geben wir etwas in das Suchfeld ein, dann können wir verschiedene Optionsfelder auswählen und dann klicken wir erst auf die Suchschaltfläche , nachdem die Anfrage gesendet wurde. Die React-Abfrage - und Datenabrufbibliotheken können diese Szenarien jedoch auch bewältigen. Ich habe einen Auftrag für dich. Können Sie den Use-Abfrage-Hook in die Homepage integrieren , damit wir diese Nutzungszustände hier durch einen einzigen Use-Abfrage-Hook ersetzen können . Versuchen Sie, den Use-Abfrage-Hook in die Home-Komponente zu integrieren . Hier ist ein Rat , den ich Ihnen geben kann. Sie können in der React Query-Dokumentation speziell nach Leuten und Konzepten suchen, nach denen Sie suchen können. Lassen Sie mich sehen, wie Abfragen deaktiviert, mit einem Schrägstrich unterbrochen werden, und ganz unten haben sie dieses Beispiel mit faulen Abfragen. Sie können dieses Beispiel hier verwenden, um die Komponente Use query inside home zu integrieren . Die Logik wird diesem Beispiel sehr ähnlich sein, aber Sie müssen diese Logik an unseren Anwendungsfall anpassen. Machen Sie weiter, versuchen Sie das, und dann werden wir das Ergebnis im nächsten Video vergleichen . Wir sehen uns dort. 75. 19 Verwendung von React Query zur Suche von Daten auf der Startseite: hallo. Wie war dein Auftrag? Konnten Sie erreichen, was wir wollten? Konnten Sie den useQuery-Hook in Home-Komponenten integrieren ? Lass es uns versuchen und sehen. Wie ich Ihnen bereits gesagt habe, können Sie auf dieses Beispiel zurückgreifen, um die Logik mit dem useQuery-Hook zu implementieren. Was ich tun werde, ich kopiere einfach diese beiden hier und lege sie oben drauf. Wir müssen auch UseQuery aus React-Query importieren. Lassen Sie uns die Eingabe oben platzieren. Dann müssen wir React.useState nicht verwenden, weil wir useState direkt aus der Bibliothek importieren, und jetzt müssen wir das an unseren Anwendungsfall anpassen. Zuallererst, was ist dieser aktivierte Schlüssel hier? Die Sache ist, dass es Situationen gibt, in denen wir Daten bedingt abrufen möchten, da diese Logik standardmäßig ausgeführt wird, wenn die Komponente gemountet wird. Daten werden abgerufen, wenn die Komponente gemountet wird. Dies ist jedoch nicht immer der Fall. Was ist, wenn wir einen Umschalter haben und wenn dieser Schalter wahr ist oder wenn wir den Filter nur anwenden, oder wenn wir den Filter nur anwenden dann wollen wir die Logik abrufen. In diesem Fall können wir hier die aktivierte Option verwenden, um React-Query verstehen zu lassen , dass wir diese Logik entweder ausführen oder nicht ausführen möchten . In unserem Fall haben wir Filter. Unsere Filter sind die Abfragezeichenfolge, was auch immer wir in das Suchfeld eingeben. Dann haben wir auch die Suchoption, die der Wert für Read Your Button ist, den wir auswählen, entweder Shows oder Schauspieler. Das sind Filter, die wir haben. Da wir die gesamte Logik verwalten, die mit der Eingabe dieser Filter zum Auswählen und Lesen Ihrer Schaltflächen verbunden Eingabe dieser Filter ist, verwalten wir das alles in SearchForm. Dann übergeben wir die Daten zurück an die Startseite, indem wir hier die OnSearch-Funktion verwenden. Wir müssen uns irgendwie überlegen, wie wir diese Filterinformationen an den useQuery-Hook übergeben können . Wir können, sagen wir, den Hilfsstatus für Filter verwenden , und dann können wir diesen Filter als Teil des QueryKey übergeben. Wenn der Filter null oder leer ist, haben wir nichts ausgewählt, wir deaktivieren einfach die Abfrage, denn als wir die Seite aufgerufen haben, wollen wir keine Daten abrufen, weil wir ja keine Filter haben. Wir haben nichts eingegeben. In unserem Fall filtern Sie standardmäßig anstelle einer leeren Zeichenfolge, Null ist und wir übergeben sie an die aktivierte Option. Wenn der Filter nur wahr ist, können wir die Daten abfragen. In diesem Fall wird der Hook aktiviert. Dann übergeben wir auch den Filter als Teil des QueryKey. Das heißt, wenn sich der Filter ändert, wenn sich dieser Wert irgendwie ändert, wird es in unserem Fall ein Objekt sein. Wenn dieses Objekt geändert wird, versteht ReactQuery das und der QueryKey ändert sich, und der useQuery-Hook validiert die Abfrage erneut. Die Abfrage wird mit dem neuen QueryKey erneut ausgeführt. Im Grunde wird QueryFunction, die wir hier bereitstellen, ausgeführt. Auch hier werden die Daten aktualisiert und die Datenvariable , die wir hier haben, erneut gefüllt. Genug geredet, lasst uns endlich etwas tun. Zuallererst müssen wir diesen Filter hier setzen. Wir werden das in der Onsearch-Funktion tun , die wir hier haben. Wir brauchen nicht all diese Try-Catch-Blöcke. Ich werde das nur kommentieren. In Onsearch rufe ich einfach setFilter auf und setze setFilter auf die Abfragezeichenfolge, und setze setFilter auf die wir haben, und auf die Suchoption, die wir haben. Dann übergeben wir, wie ich dir schon sagte, den Filter als Teil des QueryKey und nicht als Todos. Nennen wir es so etwas wie Suche, es spielt wirklich keine Rolle. In QueryFunction müssen wir die Logik , die wir hier haben, irgendwie platzieren , basierend auf der searchOption. In dieser QueryFunction werden wir fragen, ob filter.searchOption das ist, was wir gesetzt haben, und wenn ich die Logik in diesem QueryFunction-Filter schreibe , definiert ist, wird sie nicht Null sein. Denn wie Sie sich erinnern, wird die Abfrage deaktiviert, wenn der Filter in unserem Fall Null ist. Das bedeutet, dass es sicher ist, hier filter.searchOption zu schreiben , ohne sich Sorgen machen zu müssen, dass der Filter möglicherweise Null sein könnte, und es wird uns eine Fehlermeldung geben. Sowas wie kann die Eigenschaften searchOption von null nicht lesen . Falls filter searchOption = shows, in diesem Fall bitte searchforShowsFilter.q, andernfalls searchforPeopleFilter.q. Das war's. Jetzt können wir die Logik entfernen , die wir zuvor bei der Suche hatten. Wir können diese beiden useState-Hooks hier entfernen, Daten, die wir aus dem useQuery-Hook destrukturieren, wir werden sie als ApiData benennen, einen Fehler, den wir destrukturieren, werden wir ihn als ApiDataError nennen. Das war's. Ich entferne diesen unerwünschten Kommentar und lass uns sehen, was wir haben. Lassen Sie uns die Konsole untersuchen. Schauen wir uns die Registerkarte Netzwerk an. Ich tippe etwas wie Hallo. Klicken Sie auf „Suchen“ und Sie können sehen, dass es funktioniert hat. Nun, das gleiche Verhalten wie zuvor. Wenn ich zu Schauspielern wechsle und Jungs tippe. Hier haben wir zum Beispiel die Anfrage, wenn ich es wieder auf Shows ändere und dann wieder etwas anderes wie Mädchen mache , werden Daten abgerufen. Denn auch hier ändert sich der Filter, wenn wir die Suchtaste drücken. Immer wenn wir auf die Schaltfläche Suchen klicken, aktualisieren wir den Filterstatus. Der Filterstatus wird aktualisiert, QueryKey wird, sagen wir, für ungültig erklärt, er ändert sich. Das bedeutet, dass ReactQuery Daten mit dem neuesten Filter und dem neuesten QueryKey, den wir übergeben, erneut abruft . Einfach so. Sie haben dieses seltsame Verhalten wahrscheinlich schon bemerkt, wenn Sie sehen, wie mehrere Anfragen bearbeitet werden. Die Sache ist, dass ReactQuery etwas hat, das als erneutes Abrufen von Daten bei Neuorientierung bezeichnet wird. Dies ist eine der Funktionen dieser Bibliotheken zum Abrufen von Daten. Immer wenn Sie versuchen, das Fenster neu zu fokussieren , werden die Daten aktualisiert. Du kannst sehen, wenn ich in den Netzwerkjob klicke, dann klicke ich wieder irgendwo auf der Seite, es wird immer die Anfrage gesendet. Dieses Verhalten mag meistens gewollt sein, aber in unserem Fall ist dieses Verhalten definitiv unerwünscht. können wir deaktivieren. Innerhalb der Optionen übergebe ich refetchOnWindowFocus, und wenn Sie den Mauszeiger bewegen, können Sie die Beschreibung lesen , was genau diese Option bewirkt, wodurch sie unverändert bleibt. Lass uns sehen. Lass uns nach etwas suchen. Wenn ich versuche, das Fenster erneut zu fokussieren , passiert nichts. So etwas. haben wir useQuery auch in der Home-Komponente, herzlichen Glückwunsch. Ich hoffe wirklich, dass du diese Aufgabe gemeistert hast. Es könnte ziemlich herausfordernd sein, und das lag definitiv daran, dass es sich um eine neue Bibliothek handelt, eine neue Logik. Aber du siehst, wenn du dich daran gewöhnt hast, ist es am Ende nichts wirklich Komplexes. Lassen Sie uns die Änderungen , die wir vorgenommen haben, übernehmen. Es wird ziemlich einfach sein. Wir sagen nur, dass bearbeiten oder verwenden Sie Query auf der Startseite, um Suchdaten abzurufen. Fantastisch. Alles auf GitHub übertragen und bis zum nächsten. 76. 20 Informationen auf Seite anzeigen: Hallo nochmal, im letzten Video haben wir den Use-Query-Hook zur Homepage hinzugefügt und jetzt haben wir den kompletten Zyklus des Datenabrufs in unseren Komponenten. Aber da wir die Show-Seite erstellt haben, müssen wir die Showdaten auf dieser Seite anzeigen. Genau das werden wir in diesem Video tun Wir werden Daten auf der Show-Seite innerhalb der Show-Komponente auffüllen , los geht's. Welche Daten müssen wir anzeigen? Wenn wir uns die API-Antwort ansehen , erhalten wir diese in unseren Daten. Wir müssen entscheiden, was genau wir auf der Show-Seite anzeigen wollen also werden wir ein paar Komponenten erstellen und ich habe bereits eine Idee, also lass uns weitermachen. Zunächst erstelle ich im Ordner von show eine neue Datei namens ShowMainData.jsx. Das wird eine Komponente sein. Aber jetzt wird ein einfacher DIV-Export-Standard zurückgegeben , der die Hauptdaten anzeigt. Dann erstelle ich auch, lass mich eine weitere Komponente sehen , der ich Details nenne, jsx-Details, dann werden wir wahrscheinlich etwas anderes hinzufügen. Für den Moment ist das ausreichend, wir gehen zurück zur Show-Seite. Hier haben wir das mit Show-Daten, ShowData.Name. Stattdessen verwenden wir die Komponente show main data, die wir aus Komponenten importieren, shows showMainData, wo wir es jetzt so behalten. Danach werden wir die Details anzeigen. Hier können wir Details unter dem h2-Tag angeben und dann Details anzeigen und wir müssen sie auch aus den Showdetails importieren. Ordnung, lass mich es speichern, lass mich zurück zur Show-Seite gehen und hier habe ich Hallo, hallo, genau das, was wir momentan in unseren Komponenten haben. Was werden wir in ShowMainData anzeigen? Ich denke, wir brauchen den Namen der Sendung, so etwas wie eine Zusammenfassung und Steuern, lass mich sehen. Wir haben hier Namen, wir haben Genres, wir haben durchschnittlich oder nicht durchschnittlich, Bewertungsdurchschnitt, also werden wir das alles in ShowMainData anzeigen , lassen Sie es uns dort weitergeben. Zuallererst benötigen wir auch ein Bild und wenn Sie sich erinnern , haben wir dieses Bildmedium im Original, und es kann Null sein. Wir werden dieses Mal Nullfälle innerhalb der Komponente behandeln , also lassen Sie uns einfach showData.image übergeben , dann übergeben wir den Namen, der showData.Name lautet, dann werden wir die Bewertung bestehen. Die Bewertung wird sein, lassen Sie es mich einfach finden, einfach den Durchschnittswert, wir geben das Objekt weiter und behandeln den Durchschnittswert innerhalb der Komponente, showData-Bewertung, dann benötigen wir eine Zusammenfassung, da wir uns erinnern, dass wir sehr kurze Version der Zusammenfassung in Showcard anzeigen, diesmal zeigen wir die vollständige Zusammenfassung auf der Show-Seite an . Wir werden die Zusammenfassung weitergeben , die sich hier befindet. Dies ist die HTML-Zeichenfolge, wie Sie sich an die ShowData-Zusammenfassung erinnern , und dann übergeben wir die Genres. Lass mich hier nach Genres suchen. Dies ist nur eine Reihe von Genres dieser Show, ShowData-Genres. Fantastisch. Gehen wir nun in ShowMainData und holen wir uns all diese Eingabeaufforderungen. Wir schnappen uns das Bild, wir schnappen uns den Namen, die Bewertung, die Zusammenfassung und die Genres. Was wir nun in dieses Div schreiben werden, müssen wir zuerst das Bild anzeigen. Die Quelle wird Image.MEDIUM sein, wie Sie sich erinnern, aber dieses Mal werden wir das Originalbild anstelle der Vorschau in mittlerer Größe anzeigen. Wir müssen jedoch die Null-Anwendungsfälle behandeln , wie Sie sich erinnern also werden wir fragen, ob das Bild der Wahrheit entspricht und ob Bilder definiert sind? Dann verwenden Sie bitte das Originalbild , andernfalls verwenden Sie bitte das Bild, das nicht gefunden wurde. Wenn ich zurück zur Showcard oder zum Showgrid gehe , habe ich hier eine ziemlich ähnliche Logik Ich werde einfach das nicht gefundene PNG-Bild wiederverwenden und es hier ablegen und wenn Sie sich erinnern, dass PNG-Bild wiederverwenden und es hier ablegen es im öffentlichen Ordner abgelegt ist, wird es unter dem Stammverzeichnis bereitgestellt. Lassen Sie uns neben dem Bild vielleicht auch Alt hinzufügen, dessen Name angezeigt wird, dann werden wir die Informationen anzeigen, also trennen wir diesen Block durch ein Div. Hier geben wir etwas wie Namen als Titel ein, dann zeigen wir hier die Bewertung an , sodass wir die Bewertung als Durchschnitt angeben können , dieses Objekt, aber auch die Bewertung kann Null sein oder wenn ich mich nicht irre, kann der Bewertungsdurchschnitt null oder nicht definiert sein oder er kann Null sein, da Null sein oder wenn ich mich nicht irre, kann der Bewertungsdurchschnitt bin ich mir nicht sicher , aber der Bewertungsdurchschnitt dieser Struktur wird immer derselbe sein. In diesem Fall können wir etwas tun, wenn der Bewertungsdurchschnitt etwas Wahres ist oder sagen wir, er ist nicht Null, wir können den Operator oder verwenden. Was ich meine ist, dass wir annehmen, dass wir einen Bewertungsdurchschnitt von Null haben. Lassen Sie uns den Durchschnitt hier erstellen, er ist Null, also werden wir entweder Durchschnitt oder Hallo anzeigen und Sie können sehen, dass er ist Null, also werden wir entweder Durchschnitt oder Hallo anzeigen und Hallo gedruckt wird was bedeutet, dass der Durchschnitt nicht durchgegangen ist, weil er falsch ist und Null als falscher Wert betrachtet wird . In diesem Fall zeigen Sie bitte Hallo an. Wir werden hier genau dieselbe Logik anwenden. Wenn der Durchschnitt also Null ist oder wenn er in diesem Fall falsch ist , geben Sie bitte N/A an, macht das Sinn? Dann werden wir die Zusammenfassung anzeigen , aber hier ist die Sache. Lass uns versuchen, das einfach zu tun, mal sehen, was wir haben werden. Kehren wir zu unserer App zurück und wir haben hier ein ziemlich großes Bild. Das ist in Ordnung, lass uns einfach erhöhen und nach unten scrollen. Hier können Sie sehen, dass wir die HTML-Zeichenfolge so erhalten, wie sie ist. Die HTML-Zeichenfolge betrachtet sie tatsächlich als Zeichenfolge und nicht als HTML. Wenn wir in Daten schauen, ist es nur eine Zeichenfolge und React weiß nicht , dass dies HTML ist. Damit wir HTML so behandeln können, als ob es HTML wäre, müssen wir Folgendes verwenden. Zunächst werden wir dieses Div in eine sich selbst schließende Komponente verwandeln und an dieses Div können wir etwas namens DangerouslySet innerHTML übergeben. Dies ist eine spezielle React-Requisite, dies muss ein Objekt sein und dieses Objekt hat eine HTML-Eigenschaft und wir übergeben eine Zusammenfassung darin. Mit dieser Konstruktion versteht React, dass wir HTML tatsächlich als HTML behandeln wollen . Lass es uns versuchen und sehen. Jetzt können Sie sehen, dass wir hier keine HTML-Tags haben und wenn wir das Markup überprüfen , wird jedes HTML, das wir erhalten haben , tatsächlich als HTML behandelt. Warum ist das auf DangerouslySetInnerHTML gesetzt? Die Sache ist, wenn Sie beispielsweise HTML anzeigen oder HTML in die Seite einfügen möchten , es kann bösartiges JavaScript enthalten. Um das zu verhindern, warnt React Sie, dass, wenn Sie sicherstellen möchten, dass Sie HTML auf der Seite einfügen möchten , dies vollständig Ihre Entscheidung ist und die Vorsichtsmaßnahme ist, dass Sie dangerouslySetInnerHTML verwenden müssen weil es gefährlich ist. Neben der Zusammenfassung werden wir die Genres anzeigen. Wir können Genres erkennen und warum ich hier ein Fragezeichen habe. Genres werden sein, lassen Sie mich sehen, damit wir ein Array haben , was bedeutet, dass wir jedes Element dem JSX-Markup zuordnen können . Wir werden die Methode.map verwenden, los geht's. Wir werden hier eine weitere Div kreieren und Genres werden Genres sein. karte. Hier haben wir das Genre und wir werden vielleicht ein Span-Tag anzeigen und darin können wir das Genre anzeigen. Wenn wir das.map verwenden , um das JSX-Markup zuzuordnen, müssen wir den eindeutigen Schlüssel an das Map-Element übergeben . Lassen Sie mich sehen, dass Genres ziemlich einzigartig sind, würde ich sagen, also können wir das Genre selbst als eindeutigen Schlüssel weitergeben. Lass es uns versuchen und sehen. Ich zoome hinein, wir haben Genres, Comedy-Familie. Ich denke, diese Show hat nur ein Genre. Es hat Comedy und Familie. Da wir kein Leerzeichen haben, sieht es so aus, als ob dies eine einzelne Zeichenfolge ist, ist es aber nicht. Passt bitte nicht auf , dass dies vorerst ungestylt ist. Moment beschäftigen wir uns nur mit Logik in unserer Anwendung. Wir werden uns am Ende mit dem Styling befassen. Jetzt lass mich sehen, also haben wir jedes Problem benutzt, das wir wollten. Im Moment denke ich, das ist es. Lassen Sie uns weiter gehen und uns mit den Details befassen. Welche Insiderdetails werden wir zeigen? Lassen Sie mich sehen, welche Daten wir hier haben? Wahrscheinlich werden wir so etwas wie den Status der Sendung anzeigen, ob sie noch läuft, beendet ist oder vielleicht gerade veröffentlicht wurde und wann genau diese Sendung uraufgeführt wurde, und vielleicht das Netzwerk, wo genau die Sendung veröffentlicht wurde. In welcher Region, auf welchem Fernsehsender, so etwas. Um die Komponente detailliert zu beschreiben, übergebe ich zuerst den Status und das wird nur ShowData.Status sein, dann wahrscheinlich, wenn die Show uraufgeführt wurde, also wird es nur ShowData.Premiered und dann Netzwerk sein. Network ist nur ein Objekt, ShowData.Network. Cool. Ich speichere es. Dieses Mal gehe ich hier zur Details-Komponente, ich übergebe Status Premiered Network und ich schnappe mir Status Premiered Network oder vielleicht nehmen wir diesmal einfach eine andere Syntax , um erneut, sagen wir, gelegentlich JavaScript zu verwenden. Anstatt Requisiten direkt in Funktionsargumenten zu zerstören, werden wir das in einer separaten Zeile tun nur weil wir wollen, dass es so ist, daran ist nichts Besonderes. Hier sage ich statt „Hallo“ einfach, füge vielleicht ein Absatz-Tag hinzu und sage „Status ist Status“. Dann sage ich in einem anderen Absatz „Premiere an diesem Tag“ und dann werden wir das Netzwerk anzeigen. Dieses Netzwerk kann jedoch auch Null sein, da nicht alle Sendungen diese Informationen enthalten, sodass wir diesen Fall behandeln müssen. Wir müssen davon ausgehen , dass dies tatsächlich eine gute Praxis ist , wenn Sie mit etwas Unbekanntem arbeiten. Es ist sehr gut, davon auszugehen , dass etwas null oder undefiniert sein kann oder möglicherweise noch nicht einmal vergangen ist. Wir werden das Netzwerk fragen, ob es vertrauenswürdig ist, ob es existiert? In diesem Fall zeigen wir eine Zeichenfolge an, etwa an diesem Tag auf einem bestimmten Kanal oder Land uraufgeführt wurde . Wählen wir wahrscheinlich nur den Namen, der an diesem Tag auf network.name uraufgeführt wurde. Ich habe Backticks verwendet, um anzugeben, dass wir die Zeichenketteninterpolation innerhalb der Zeichenfolge verwenden möchten , und dann interpoliere ich den Netzwerknamen innerhalb der Zeichenfolge für den Netzwerknamen. Andernfalls zeigen Sie bitte Null an, zeigen Sie nichts an oder wir können sicherstellen , dass wir hier den booleschen Wert verwenden. Wir können das Netzwerk in einen booleschen Wert umwandeln und anstatt den ternären Operator zu verwenden, können wir das logische Ende verwenden. In diesem Fall wird kein Netzwerkname nur angezeigt , wenn das Netzwerk wahr ist. Schauen wir uns nun an, was wir haben und wir haben den Status beendet und an diesem Tag auf CBC uraufgeführt. Fantastisch. Jetzt sieht es so aus, hätten wir fast alles gezeigt, was wir wollten. Wir können jedoch noch einen Schritt weiter gehen und mehr Daten anzeigen, z. B. Informationen zu den Staffeln und Informationen zur Besetzung. Was brauchen wir in diesem Fall? Wenn wir in die API-Daten schauen, die wir erhalten haben, haben wir keine Informationen über Besetzungen oder Shows. Aber wenn wir zur TV Maze API zurückkehren, haben wir hier diesen Abschnitt, lassen Sie mich sehen, über das Einbetten. Durch das Einbetten können wir mehr Daten über die Show laden, und hier ist ein Beispiel. Lass mich es öffnen. Die URL sieht so aus. Wir haben Episoden einbetten, Besetzung einbetten und wenn wir nach unten scrollen, sehen wir diesen eingebetteten Unterstrich-Abschnitt mit Folgen und Besetzung. Das ist genau das, was wir tun werden, aber wir müssen unsere Funktion so ändern, dass sie angezeigt wird. Lassen Sie uns diesen eingebetteten Teil kopieren und dann die getShowByID-Funktion verwenden, um Daten abzurufen. Hier zur URL können wir Einbettung, Folgen und Besetzung hinzufügen . Aber statt Episoden werden wir Staffeln einbetten. Wir können auch Informationen zu den Jahreszeiten abrufen. Anstelle von Folgen geben wir Staffeln an. Wir speichern es, wir kehren zur Show zurück, und jetzt wurde es erneut validiert, weil Sie sich erinnern wenn Sie den Fokus zwischen Fenster und etwas anderem wechseln, Daten aktualisiert werden, wenn Sie den Fokus zwischen Fenster und etwas anderem wechseln, weil wir den useQuery-Hook verwenden, und wir können sein Verhalten verhindern , indem wir RefetchOnWindowFocus verwenden. Wenn Sie dieses Verhalten nicht wollen, brauchen wir dieses Verhalten wahrscheinlich nicht, ich werde es deaktivieren, genau wie wir es auf der Homepage getan haben. Mal sehen, was wir in diesem Fall haben. Sie können jetzt sehen, dass wir diesen Unterstrich eingebettet haben , hier haben wir Informationen zu Besetzung und Staffeln. Lassen Sie uns diese URL kopieren, sie hier öffnen und die Datenform der Staffeln und Besetzungen ansehen. Zunächst müssen wir entsprechende Komponenten für Staffeln und Besetzung erstellen . Im Ordner Shows erstelle ich cast.jsx und ich erstelle seasons.jsx. Ich werde das Markup schnell kopieren, also wird es vorerst div sein, Requisiten, wir werden sie in der Reihe destrukturieren und ich werde es Cast nennen. Das Gleiche werde ich für Seasons tun. Jetzt werden wir diese Komponenten in der hier gezeigten Abbildung verwenden. Im nächsten Div werden wir also wieder so etwas wie div haben, werden wir also wieder so etwas wie div haben ein weiteres Titel-Tag , auf dem Seasons stehen. Hier werden wir die Komponente „Jahreszeiten“ anzeigen. Es wurde automatisch importiert. Wenn ich mir den oberen Teil ansehe, wurde es aus den Komponenten Show Seasons importiert. Ich kopiere das. Anstelle der Staffeln werde ich jetzt die Besetzung anzeigen und dann die Besetzung erneut importieren. Wie importiere ich? Ich drücke „Tab“, bumm, oben importiert. Großartig. Welche Daten werde ich weitergeben? Für die Komponente „Jahreszeiten übergebe ich die Staffeln-Requisite, und die Staffeln werden zu eingebetteten Staffeln mit Unterstrichen. Das erhalten wir von der API, also übergebe ich show data underscore embedded. Achte darauf, dass du es nicht falsch buchstabierst, .seasons, und genau das Gleiche werde ich für die Besetzung tun, aber anstatt Staffeln weiterzugeben, werde ich die Cast-Requisite showData embedded.cast weitergeben. Jetzt, in Seasons, werde ich die Staffel-Requisite, an der wir vorbeigekommen sind, zerstören. Mal sehen, was ich hier zeigen werde. Zunächst möchten wir wissen, wie viele Staffeln wir insgesamt haben. Wenn ich zur App zurückkehre, habe ich dieses Problem: unerwartetes leeres Objektmuster. Lassen Sie uns das schnell beheben. Wenn wir zu Cast gehen, werde ich das einfach entfernen. Also in Seasons , was ich ausstellen werde. Zunächst werde ich im P-Tag die Saisons insgesamt anzeigen. Lassen Sie uns überprüfen, ob wir das haben, Saisons insgesamt. Hier fügen wir seasons.length hinzu. Wenn wir uns unsere Daten ansehen, sind Jahreszeiten nur ein Array. Jede Jahreszeit ist also ein Array-Element, was bedeutet, dass die Anzahl der Elemente der Anzahl der Jahreszeiten entspricht. Nun, es scheint logisch zu sein, also werden wir seasons.length verwenden. Neben den Staffeln insgesamt werden wir die Folgen insgesamt zeigen und sagen , lass mich sehen. Da wir Staffeln als Array haben und in jedem Element haben wir die Reihenfolge der Folgen, und im Grunde genommen, wie viele Folgen haben wir in einer einzigen Staffel? Wir müssen irgendwie die Gesamtzahl der Folgen in der gesamten Staffelliste berechnen . Wir können etwas array.reduce verwenden, um das zu berechnen. Also werden wir Seasons.reduce sagen. Seasons Reduce wird jetzt standardmäßig aktiviert sein, also wir unser gesamtes Saison-Array auf eine Zahl reduzieren . Wir werden dieses Saison-Array zu einer Zahl zusammenfassen. Wir werden einfach jedes Array-Element durchgehen und die Reihenfolge der Folgen zusammenfassen. Hier ist dies unsere Summe und das zweite Element hier wird unsere Summe und das zweite Element das aktuelle Array-Element sein , das in einer Schleife übertragen wird. Das wird Saison. Also werden wir sagen, bitte sende uns etwas mehr plus Staffel.Episodenbestellung zurück . Lassen Sie uns versuchen, zu sehen, ob wir keine Bestellung haben. Wir haben insgesamt eine Staffel, insgesamt 13. Folgen. Toll, es hat funktioniert. Neben dem Absatz werden wir nun Daten der einzelnen Jahreszeiten anzeigen, also im Grunde diese Informationen, was bedeutet, dass wir jedes Saisonelement dem jsx-Markup zuordnen müssen . Wir werden die Dotmap-Methode verwenden. Wir sagen seasons.map, season. Wir werden es einem Div zuordnen oder lassen es jetzt Hello oder Key sein, wir werden die Saison überstehen. lass mich die Daten sehen. Die Jahreszeit hat eine ID, die eindeutig dargestellt ist , sodass wir sie sicher als Schlüssel verwenden können. Wir werden sagen, bitte geben Sie die Jahreszeit, die Jahreszeitennummer an, also die Nummer der Jahreszeit. Großartig. Dann zeigen wir das p-Tag an. Wir werden den Folgen mitteilen wie viele Folgen diese Staffel hat. Wahrscheinlich können wir die Reihenfolge der Staffelfolgen verwenden, warum nicht? Dann zeigen wir an, wann diese Staffel ausgestrahlt wurde, und wir können das Premierendatum und das Enddatum verwenden. Großartig. Lassen Sie mich es also in separate Div aufteilen, dann werde ich es ausgestrahlt mitteilen. Was ich tun werde, sage ich Season.PremiereDate, SeasonEndDate. Wahrscheinlich das, ja. Lass es uns versuchen und sehen. Wir haben Staffeln insgesamt, Episoden insgesamt, dann haben wir Staffel eins 13 Folgen und sie wurde von diesem Datum bis zu diesem Datum ausgestrahlt. Sieht für mich gut aus. Wenn wir noch etwas hinzufügen müssen, werden wir das später tun, vorerst reicht das aus. Lassen Sie uns dieses Mal an der Cast-Komponente arbeiten. Zum Gussbauteil übergeben wir die Gussproquisite. Also hier in der Gusskomponente schnappe ich mir die gegossene Requisite und lass uns überlegen, welche Daten wir hier anzeigen werden. Lassen Sie uns die API untersuchen. Die Besetzung ist auch nur ein Array und jedes Array hat diese Person, Charakter, dieses Selbst und die Stimme Keith. Mal sehen, was wir tun werden. Wir werden wahrscheinlich einfach jedes Array-Element einigen Informationen zuordnen und sie hier anzeigen. Lass uns das machen. Also machen wir einfach cast.map. Nennen wir es Item und wir werden es vorerst einem Div zuordnen. Der Schlüssel wird, lassen Sie mich sehen, item person.id sein, wahrscheinlich das. Ich denke, das wird ziemlich einzigartig sein. In der Div werden wir zunächst, lassen Sie mich sehen, wahrscheinlich das tatsächliche Bild anzeigen lassen Sie mich sehen, wahrscheinlich . Lass uns versuchen, das zu tun. Lassen Sie uns das Bild vorerst in ein Div packen. Das Bild wird item.person.image sein, aber Sie denken daran, dass das Bild Null sein kann , also müssen wir uns darum kümmern. Wenn item.person.image existiert, verwenden Sie in diesem Fall item.person.image.medium. Ansonsten benutze es noch einmal, lass es uns schnappen, lass uns das nicht gefundene Bild png verwenden. Toll, speichern wir es. Dann werden wir neben dem Bild, das wir anzeigen, lassen Sie mich sehen, wir haben item.person.name und dann werden wir den Charakter in dieser Show in dieser Show anzeigen. Der Charakter wird der Charaktername sein, also hat diese Person item.character.name gespielt. Und weißt du was? Es ist ziemlich repetitiv, jedes Mal einen Punkt mit einem Punkt einzugeben, also werden wir von diesem Gegenstand aus Person und Charakter destrukturieren. Anstatt jedes Mal Item Dot zu schreiben, schreiben wir einfach person.character. Also character.name. Lassen Sie mich sehen, wie wir etwas anderes verwenden können. Wir haben dieses Selbst und diese Stimme hier. Stimme bezieht sich wahrscheinlich darauf, ob dies nur das Voice-Over war und die Rolle nicht direkt in der Show gespielt wurde. Es war nur ein Voice-Over von dieser Person, damit wir das vielleicht gebrauchen können. Wir können die Stimme auch von hier aus destrukturieren , weil es der Schlüssel zu unserem Artikel ist und wir werden fragen ob diese Person sich um das Voice-Over kümmert. Wir werden einfach so etwas wie eine weitere Pipe anzeigen , weil wir das hier verwendet haben und wir werden Voice-Over sagen , andernfalls eine leere Zeichenfolge oder wir können wieder den Operator und verwenden und wir wollen sicherstellen, dass dies ein boolescher Wert ist , aber ich denke, dieser Wert hier wird immer ein boolescher Wert sein , also müssen wir diese Variable nicht drehen Dieser Wert wird in einen booleschen Wert umgewandelt indem eine doppelte Negation angewendet wird oder ein boolescher Konstruktor verwendet wird. Ich denke, das wird ausreichen. Versuchen wir nun, unser Endergebnis zu sehen. Wir haben die folgende Show-Seite. Lass mich es kleiner machen. Im Moment weiß ich, dass es ungestylt ist , aber wir werden uns darum kümmern, keine Sorge. Wir haben alles, was wir von der Show wollen. Wir betten eine Zusammenfassung ein, wir zeigen Durchschnittsbewertungen an, wir zeigen Genres an, wir zeigen Details an, wann die Sendung ausgestrahlt wurde, vielleicht wann sie beendet wurde, wir zeigen Informationen zu Staffeln und wir zeigen Informationen zur Besetzung an. Was war die Person, die diese Rolle gespielt hat und war diese Person eine Voice-Over-Figur oder war es einfach eine beliebige Figur in der Show. Ich denke, das ist es. Es war tatsächlich viel. Wir haben mit API-Daten gearbeitet und entsprechende Komponenten zur Anzeige von Daten erstellt. Wo lasst uns jetzt alles begehen. Lassen Sie uns kurz einen Überblick darüber geben, was wir hier haben. Wir haben die Funktion get show by id geändert , um Daten abzurufen, wir betten Staffeln ein, wir betten Cast ein, dann verwenden wir die Informationen, die wir von der API erhalten , und zeigen diese Informationen auf der Show-Seite an. Wir haben die entsprechenden Komponenten erstellt, wir haben die entsprechenden Requisiten übergeben und dann haben wir alles innerhalb der entsprechenden Komponente erledigt , ungefähr so. Ich füge alles zur Bühne und meine Commit-Nachricht wird mit detaillierten Showdaten auf der Show-Seite angezeigt. Cool. Eine weitere Sache, auf die ich hier hinweisen möchte, ist, dass wir, wie Sie sich erinnern, dieses RefetchOnWindowFocus-Verhalten der Benutzerabfrage who deaktiviert haben. Wenn wir jetzt erneut validieren, entschuldigen Sie mich, lassen Sie mich die App erneut starten. Wo ist unsere Show-Seite? Ups, ich habe es versehentlich geschlossen. Was ich meine ist, dass, wenn wir Fenster jetzt neu fokussieren, die Daten nicht ständig abgerufen werden, aber was passiert, wenn unsere Show-ID nicht existiert? Lass es uns versuchen und sehen. Lass uns etwas Kauderwelsch versuchen. Mal sehen, was wir haben? Wir sehen, dass Daten geladen werden, und wir können dieses Wiederholungsverhalten sehen. Sie können sehen, dass die Anfrage tatsächlich dreimal gesendet wurde, und wenn bis zum Zeitpunkt der dritten Anfrage immer noch ein Fehler in unserer Anfrage auftritt, wird bei dritten Anfrage immer noch ein Fehler der Verwendung der Abfrage ein Fehler angezeigt. Sie können sehen, dass die Bibliothek zum Abrufen von Daten mehr als einfach ist . Bitte rufen Sie meine Daten ab, wenn die Komponente gemountet wird. diesem Datenabruf wird davon ausgegangen, dass die Anfragen möglicherweise fehlschlagen können, und wenn es fehlschlägt, wird es automatisch einige Male erneut versucht, mit einem sogenannten exponentiellen Backoff. Wenn unsere Anfrage beispielsweise zum ersten Mal fehlgeschlagen ist, wird die Anfrage nach einer Sekunde erneut versucht. Schlägt sie fehl, findet die nächste Wiederholung nach zwei Sekunden und nächste Wiederholung nach drei Sekunden statt. Use Query kümmert sich darum. Ziemlich cool. Das war's. Wir sehen uns im nächsten. 77. 21 Hinzufügen der Taste "Go Back": Hallo nochmal. Im letzten Video haben wir Komponenten erstellt, mit denen wir Daten zu einer bestimmten Sendung auf der Show-Seite anzeigen. Es war ziemlich lang. Jetzt müssen wir ein bisschen mehr über die Benutzererfahrung nachdenken. Was meine ich damit? wir davon aus, dass wir auf der Homepage sind, bestimmten Sendung suchen, dann klicken wir auf Read More. Wir landen auf der Show-Seite. Jetzt haben wir hier keine zusätzlichen Schaltflächen für die Navigation, was bedeutet, dass der Benutzer auf Zurück zur vorherigen Seite klicken muss , und wenn wir zu dieser Seite zurückkehren, sehen wir, dass alle unsere Daten weg sind, wir müssen die Suche erneut starten. Was wir in dieser Situation tun können. Zunächst müssen wir auf der Show-Seite eine Schaltfläche hinzufügen , die den Benutzer zurück zur Homepage bringt. Dies wird für den Benutzer nur ein bisschen bequemer sein. Aber es löst immer noch nicht das Problem, dass die Daten weg sind, wenn der Benutzer zu dieser Seite und an der Kinokasse zurückkehrt zu dieser Seite und an der Kinokasse Wir kümmern uns nicht darum, aber im Idealfall müssen wir uns irgendwie an die letzte Suche erinnern , die wir durchgeführt haben. Wenn der Benutzer zu dieser Seite zurückkehrt, ist sie immer noch da. Wir werden das nicht an der Kinokasse behandeln, wir werden eine Alternative vorstellen. Was ist, wenn wir nach der Sendung suchen und wenn wir auf Mehr lesen klicken, wird der Benutzer auf den neuen Tab geleitet? Es öffnet diese Show-Seite auf der neuen Registerkarte. Lass uns weitermachen und das tun. Wenn wir zur Showcard-Komponente zurückkehren, die wir haben, verwenden wir hier diese Link-Komponente. Wir verwenden die Link-Komponente, weil wir die clientseitige Routing-Bibliothek React-Router verwenden , und damit wir die Navigation über Links ordnungsgemäß abwickeln können, verwenden wir diese spezielle Linkkomponente, verwenden wir diese spezielle Linkkomponente aus dem React-Router-Dom importiert wurde. Wenn wir jedoch etwas in einem neuen Tab öffnen möchten, hat das in gewisser Weise nichts mit dem Routing der Client-Site zu tun. In diesem Fall können wir ein einfaches Ankertag verwenden, anstatt die Link-Komponente von React Router dom zu verwenden. Wir können es also einfach entfernen und anstatt Clink zu verwenden, werden wir das Ankertag anzeigen. Ankertag hat die Eigenschaft „ Trog“. Jetzt können wir ein weiteres Attribut des Anker-Tags namens target angeben und den Unterstrich leer angeben. Sobald ich leer als Ziel angebe, erhalte ich diesen Fehler von ES Link, der von React JS x target blank kommt , dass bitte die Beziehung nicht referenziert verwenden. Ich kopiere einfach unspezifiziert. Dies ist nur eine sehr kleine Sicherheitsmaßnahme. Ich speichere es. Versuchen wir es jetzt. Wenn ich auf Mehr lesen klicke, wird meine Show-Seite in einem neuen Tab geöffnet. Ziemlich cool. Da wir uns jedoch darauf geeinigt haben , die Benutzererfahrung etwas komfortabler zu gestalten, werden wir die Schaltfläche „Zurück zur Startseite“ irgendwo oben hinzufügen . Wir gehen zur Komponente „Seite anzeigen“. Hier oben, rechts oben, Hauptdaten anzeigen. Wir können hier zwei Dinge hinzufügen. Wir können entweder eine Link-Komponente hinzufügen , die uns zurück nach Hause bringt, so etwas, zurück nach Hause, und das ist eine völlig gute Lösung. Wir werden diesen tatsächlich benutzen. Aber ich möchte nur, dass du die Alternative dazu siehst. Weil der React-Router eine Routing-Bibliothek ist. Es hat etwas zu bieten. werden wir uns ansehen. Trotzdem können wir die Link-Komponente verwenden. Anstatt vorerst Clink zu verwenden, fügen wir eine Schaltfläche hinzu und sagen : „Geh zurück zur Startseite“. Auf dieser Schaltfläche vom Typ Button schalten wir den On-Click-Handler ein, Go back und das auf Go Back wird etwas für uns tun. Wenn wir zur React-Router-Dokumentation zurückkehren, gibt es dort etwas, das als Use Navigate bezeichnet wird. Verwenden Sie den Navigate-Hook, wenn Sie sich dieses Beispiel ansehen, können wir programmgesteuert zwischen den Seiten navigieren und dabei weiterhin den React-Router dom verwenden. Anstatt die Link-Komponente, sagen wir, deklarativer zu verwenden , verwenden wir eine Funktion die die Navigation grundsätzlich programmgesteuert und imperativer durchführt. dieses Beispiel ansehe, kann ich die Navigation von React Router dom abrufen und verwenden. Eigentlich habe ich schon importiert, also werde ich es einfach so machen. Entschuldigung, benutze keine Parameter, benutze Navigate. Dann rufe ich hier use navigation auf. Diese Verwendung von navigation gibt uns eine Funktion zurück, die wir aufrufen müssen, um zu einer bestimmten Seite zu navigieren. Navigiere zu, ich nenne es so. Wenn wir auf „ Zurück zur Startseite“ klicken , rufen wir navigieren zu auf und geben dann an, wir kehren zur Startseite zurück. Kommen wir zurück zur App. Oben haben wir diesen Button hier. Nochmals, diese Schaltfläche, sie verknüpft keine Komponente, es ist eine Schaltfläche. Wenn wir klicken, kehren wir nach Hause zurück. Falls Sie programmgesteuert navigieren oder Benutzer zu einer Seite umleiten müssen , können Sie den Use Navigate Hook verwenden. Aber in unserem Fall müssen wir die Schaltfläche nicht wirklich programmgesteuert in einen Link verwandeln. Wir können die Link-Komponente direkt verwenden , weil sie tatsächlich sinnvoller ist. Deshalb werden wir nicht navigieren verwenden, das bleibt bei der Link-Komponente. So einfach ist das. Versuchen wir es jetzt und sehen es uns an. Wenn wir in das Markup schauen. Jetzt ist es eigentlich das Ankertag. Cool. Wenn wir darauf klicken, kehren wir immer noch nach Hause zurück. Aber es erfordert , dass wir weniger Code verwenden. Es ist sogar besser, weil es jetzt richtiges Markup macht, richtiges HTML-Markup, um zwischen Seiten zu navigieren, da es ein Ankertag ist. Cool. Jetzt haben wir die Benutzererfahrung nur geringfügig erhöht. Jetzt sieht es viel, viel besser aus. Das war's für heute. Lassen Sie uns die Änderungen übernehmen. Wir haben Go back to home hinzugefügt und wir öffnen die Seite anzeigen in einem neuen Tab. Ich werde es in meiner Commit-Nachricht sagen Schaltfläche „ Öffnen“ oder „Mehr lesen“ den Benutzer jetzt zu einem neuen Tab bringt Link „Zurück zur Startseite“ wurde auf der Show-Seite hinzugefügt. Das war's. Drücken Sie alles, um aufzustehen. Wir sehen uns im nächsten. 78. 22 Einführung in useReducer als Alternative zu useState: Hallo, im letzten Video haben wir nur ein bisschen über die Benutzererfahrung gesprochen. Wenn wir jetzt auf Mehr lesen klicken, wird die Seite in einem neuen Tab angezeigt, und wir haben die Schaltfläche „Zurück zur Startseite“ hinzugefügt . Das ist alles großartig. fehlt uns jedoch die Funktionalität für die Schaltfläche „Star Me“. Immer wenn wir auf diese Schaltfläche klicken, möchten wir diese Show mit einem Stern markieren. Später, wenn wir zur Seite mit den Sternen navigieren, können wir hier unsere Sternenliste sehen. Wie wir das erreichen können. Bevor wir das tun können, müssen wir uns die Alternative ansehen, den Staat zu verwenden. Kommen wir zurück zu unserer Komponente. Sagen wir wahrscheinlich zur Homepage. Hier spielen wir mit dem neuen Haken. Wie Sie bereits wissen, wir den useState-Hook verwenden , wenn wir einen Wert haben möchten , der sich im Laufe des Lebenszyklus der Komponente ändert müssen wir den useState-Hook verwenden , wenn wir einen Wert haben möchten, der sich im Laufe des Lebenszyklus der Komponente ändert. Im Grunde ist es nur ein Wert, der sich ändert. Es gibt uns die Zustandsvariable und die Funktion, mit der wir diesen Zustand aktualisieren können. diese Weise verwalten wir den lokalen Zustand einer Komponente. Es gibt eine Alternative zur Verwendung von state namens useReducer. Es ist eine Alternative, das bedeutet, dass es useState nicht ersetzt, genauso wie useState useReducer nicht ersetzt. Sie können verwenden, was Sie wollen und was auch immer Sie für angemessener halten . Wenn wir useState haben und sagen wir eine eingestellte Filterfunktion haben, die wir aufrufen können um den Status mit useReducer zu leiten, haben wir etwas, das als Aktionen bezeichnet wird. Wir initiieren tatsächlich eine Aktion und dann wird diese Aktion von einer Funktion ausgeführt, und diese Funktion entscheidet, wie der Status auf der Grundlage einer Aktion aktualisiert wird. Wir schauen uns das Beispiel eines Zählers an. Der Hook, über den ich gesprochen habe, ist useReducer. Wir werden in einer Sekunde definieren, was ein Reduzierer ist. Hier oben rufe ich UseReducer an. Dieser useReducer als erstes Argument erhält einen sogenannten Reducer. Darüber hinaus werde ich eine Reducer-Funktion erstellen. Jetzt wird es eine leere Funktion sein und ich werde sie an useReducer übergeben. Als zweites Argument muss ich den Anfangszustand übergeben. Genau wie bei useState ist unser Status standardmäßig Null, weil wir Counter implementieren werden. Wenn wir auf eine Schaltfläche klicken, möchten wir sie entweder erhöhen oder verringern. useReducer gibt uns, genau wie useState, ein Array mit genau zwei Elementen zurück. Wir werden diese beiden Elemente zerstören. Das erste Element wird wieder der Staat sein, genau wie beim useState. Sagen wir Zähler. zweite Element wird ein sogenannter Versand sein. Was muss ich nun tun, um den Status irgendwie zu aktualisieren? Das Reducer-Konzept, also dieser UseReducer-Hook, basiert auf dem Konzept der Reducer. Lass mich Paint öffnen und dir etwas erklären. Visualisieren Sie einfach die UseReducer-Idee. Mit useReducer verfolgen wir einen Ansatz für Aktionen, die von einer einzigen Funktion , dem Reducer, ausgeführt werden. In unserem Bundesstaat finden mehrere Aktionen statt. Im Falle eines Zählers haben wir zum Beispiel Inkrement. Lassen Sie mich es etwas größer machen und dann haben wir eine Dekrementierung. Nehmen wir an, wir haben eine weitere Aktion namens Reset Counter, Reset. Dann werden all diese Aktionen von dieser Dispatch-Funktion an die interne React-Logik gesendet. Dann haben wir eine einzige Funktion namens Reducer, die all diese eingehenden Aktionen abwickelt. Wann immer eine Aktion ausgelöst wird, wird sie von der Reduzierfunktion verarbeitet, und was auch immer die Reduzierfunktion zurückgibt , ist der neue Zustand. Dieser gesamte Ablauf ersetzt den useState-Hook und basiert auf dem Reducer-Konzept. Nun, was ist der Reduzierer? Wie ich bereits erwähnt habe, ist Reducer nur eine Funktion , die diese Aktionen irgendwie abwickelt. Aber was sind diese Aktionen? Das ist der Punkt. Wir müssen die Maßnahmen selbst definieren. Eine Aktion ist in diesem Fall nur ein Objekt, das einige Daten übermittelt. Zum Beispiel können wir eine Aktion definieren, um Daten zu inkrementieren. Wenn wir über Reduktoren sprechen, wenn wir über dieses gesamte Konzept sprechen, wird normalerweise wenn wir über dieses gesamte Konzept sprechen eine Aktion immer ein Objekt sein. Bei dem Typ sagen wir Inkrement und etwas zusätzliche Nutzlast. Es kann alles sein. Es kann ein neuer Wert sein, was auch immer. Dieses Objekt kann jede Form annehmen. Aber normalerweise hat es diesen Typ, diesen Schlüssel und diese Nutzlast, nur um es konsistenter zu machen. Wir müssen diese Maßnahmen selbst definieren. Dann werden sie innerhalb des Reduzierers behandelt. Ich werde hierher gehen. Im JSX-Markup sage ich, Zähler wird Zähler sein, interpellieren Sie den Staat. Dann füge ich hier zwei Buttons hinzu. Eins wird inkrementiert, das zweite wird dekrementiert und das dritte wird zurückgesetzt. Jede Funktion hat diesen onClick und nennen wir diese Handler als onIncrement, dann onDecrement und onReset. Jetzt müssen wir diese Funktionen erstellen. Lass es uns hier oben schaffen. Wir haben onIncrement, dann haben wir onDecrement und wir haben onReset. Es muss etwas passieren. Wir müssen Aktionen ausführen , um den Status irgendwie zu aktualisieren. Wir können den Versand anrufen. Hier müssen wir eine Aktion verabschieden. Wenn zum Beispiel Inkremente vorgenommen werden, lösen wir eine Aktion aus. Auch hier ist eine Aktion nur ein Objekt. Nehmen wir eigentlich diesen. Wir benötigen hier vorerst keine Nutzlast. Wir werden einfach eine Aktion auslösen und es wird ein Objekt vom Typ INCREMENT sein. Wenn wir herabsetzen, wollen wir eine Aktion DEKREMENT auslösen. Wenn wir keinen Reset haben, können wir eine Aktion vom Typ RESET auslösen. Auch dies sind die Objekte , die wir uns selbst für uns definieren. Es wird für uns einfacher sein, sie zu verstehen. Immer wenn dieser Dispatch aufgerufen wird wird diese Aktion von der Reducer-Funktion ausgeführt. Diese Reduzierfunktion muss einen neuen Zustand zurückgeben. Lassen Sie uns vorerst Null zurückgeben. Diese Reduktionsfunktion erhält zwei Argumente. Zuallererst empfängt es CurrentState. Genau wie bei der Status-Update-Funktion mit useState , wenn wir den Callback übergeben. Wir haben Zugriff auf currentState als erstes Argument. Die gleiche Idee steckt hier im Reduzierer. Wir haben CurrentState, nennen wir es CurrentCounter. Das zweite Argument ist die Aktion, die wir ausgelöst haben. Ich werde CurrentCunter und Action protokollieren. Gehen wir zurück. Wir haben so etwas. Lassen Sie uns die Konsole untersuchen. Immer wenn ich auf Increment klicke, sehe ich zwei Dinge, die getröstet werden. Ich sehe, dass CurrentCounter gleich Null ist. Das ist unser aktueller Stand. Wir haben Action. Aktion ist einfach das, was wir übergeben, als wir die Versandfunktion aufgerufen haben Dies ist diese Aktion hier. Basierend auf dem, was wir übergeben, basierend auf dem, was wir versenden, können wir unsere Logik in eine einzige Funktion schreiben. Wenn Sie mit Reduzierern arbeiten, arbeiten Sie normalerweise mit einem Schaltgehäuse. Wir werden action.type wechseln. Falls wir den Typ INCREMENT haben. In diesem Fall geben wir vom Reduzierer CurrentCounter plus 1 zurück. Wir erhöhen den Zähler. Auch hier wird alles, was vom Reduzierer zurückgegeben wird, als neuer Zustand festgelegt. Falls wir ein Dekrement haben, sagen wir CurrentCounter minus 1. Falls wir RESET aufrufen, geben Sie bitte 0 zurück. Falls keine dieser Optionen standardmäßig übereinstimmt, wir 0 zurück. Lass es uns speichern und mal sehen. Wenn ich auf Inkrementieren klicke, wird der Zähler inkrementiert. Wenn ich auf Zurücksetzen klicke, wurde es auf Null zurückgesetzt. Wenn ich dekrementiere, wird es dekrementiert. Wie Sie sehen können, indem diese Reducer-Funktion verwenden und die Aktionen , die wir selbst definiert und dann innerhalb der Registerfunktion behandelt haben. Wir können diese Logik erreichen , um den Staat auf der Grundlage von Aktionen zu verwalten. Und auch dies ist eine Alternative zur Verwendung des useState-Hooks. Verwenden Sie den Reduzierer so, wie Sie den Status angeben, aber mit dem Konzept der Reduzierer und Dispatching-Aktionen, welche Sie verwenden sollten. Das hängt vom Anwendungsfall ab und , was Sie mehr bevorzugen. Am gebräuchlichsten ist die Verwendung von useState, aber nehmen wir an, wenn Ihre Logik zum Aktualisieren des Zustands viele, sagen wir, verschiedene Aktionen beinhaltet , zum Beispiel Increment, Reset, setzt einen bestimmten Wert, sagen wir, Increment um 10, sodass Sie Ihre Logik haben können, den Status basierend auf bestimmten Aktionen zu aktualisieren sodass Sie Ihre Logik haben können, den Status basierend auf bestimmten Aktionen zu aktualisieren, können Sie den useReducer-Hook verwenden. Ich erzähle Ihnen das alles , weil wir für unsere Logik zur Implementierung, Start Shows, unsere Logik zur Implementierung, Start Shows, den User-Reducer-Hook verwenden werden, weil wir ein paar Aktionen wie Start Show und OnStart Show haben werden . Ich habe bereits erwähnt, dass Sie für diese Aktion hier alle Daten übergeben können. Mal sehen, was ich damit meine. Wie ich dir schon sagte, wir haben einen einzigen Ort, an dem wir uns mit Logik befassen, und was auch immer von der Reduzierfunktion zurückgegeben wird von der Reduzierfunktion zurückgegeben , wird als neuer Zustand gesetzt. Warum haben wir hier nicht eine andere Aktion namens SET_VALUE definiert , etwa so. Dann erstelle ich hier einfach einen weiteren Button und sage Set, sagen wir, 500. Dann onClick onSetToValue. Ich werde diese Funktion hier erstellen und Typ SET_VALUE versenden, damit sie vom Reducer verarbeitet werden kann. Ich übergebe den Wert, oder sagen wir NewCounterValue 500. Da wir nun Zugriff auf das Aktionsobjekt innerhalb des Reducers haben und wissen, dass das Aktionsobjekt genau das ist , was wir versenden, können wir sagen, dass action.newCounterValue zurückgegeben wird. Was auch immer wir als newCounterValue übergeben, wird von der Reducer-Funktion zurückgegeben , wird von der Reducer-Funktion und es ist der neue Zustand. Lassen Sie uns versuchen, Increment, Set to 500 zu sehen , es ist 500, ungefähr so. Alle Daten, die Sie hier übergeben, sind in der Reducer-Funktion verfügbar. Das ist es im Grunde. Zu Reducern gibt es vielleicht nichts mehr hinzuzufügen , wenn Sie wahrscheinlich von Redux gehört haben, einer Bibliothek zur Verwaltung des globalen Zustands in React-Apps. Redux basiert auf dem Reducer-Konzept. In einer Redux löst man solche Aktionen aus und wickelt sie dann alle innerhalb von Reducern ab. Cool. Lassen Sie uns das alles loswerden. Hoffentlich war klar, warum useReducer als Alternative zu useState nützlich sein könnte . Eigentlich würde ich vielleicht hinzufügen, dass all diese Aktionen bei Inkrement, bei Dekrement, leicht durch useState Hook ersetzt werden können . Anstatt die gesamte Logik innerhalb des Reducers zu handhaben, können Sie einfach etwas wie setCounter tun, sagen wir CurrentCounter plus 1. Das Gleiche kannst du drinnen nach Belieben tun. Entschuldigung, es wird so sein, CurrentCounter minus 1. Sie würden im Grunde dieselbe Logik schreiben wie in den Reducer. Wenn Sie den UseState Hook verwenden und wenn auf Reset, wäre es nur setCounter zu wissen und es könnte einfacher sein. Das hängt davon ab. Deshalb wird es als Alternative bezeichnet. Es liegt an Ihnen, was auch immer Ihren Bedürfnissen entspricht. Jetzt, wo wir UseReducer kennen, können wir es tatsächlich verwenden, um unsere Logik zum Starten von Shows zu implementieren . Cool. Wir sehen uns im nächsten. 79. 23 Starred zeigt p1: Hallo, da. Im letzten Video haben wir über useReducer als Alternative zum useState-Hook gesprochen. Es kann verwendet werden, um den Status zu verwalten wenn mehrere Aktionen definiert sind und wir den Status anhand einiger Aktionen aktualisieren möchten . Wir werden UseReducer verwenden, um unsere Logik für das Studium von Sendungen zu implementieren . Lass uns gehen. Zuallererst, wie werden wir mit der Logik umgehen , die hinter den Starserien steckt? Immer wenn wir auf die Schaltfläche „Start Me“ klicken , fügen wir dem Array die ID anzeigen hinzu, die unser Status sein wird. Der Status der Startshows wird nur aus einer Reihe von Show-IDs bestehen. Wenn wir auf eine Show klicken, wird die ID zum Array hinzugefügt. Wenn wir zweimal darauf klicken, wird es aus diesem Array entfernt. Wenn wir dann zur Startseite gehen, nehmen wir das mit einem Stern versehene Show-Array und verwenden es dann , um Daten von der TV Maze API abzufragen. Ziemlich einfach. Die Frage ist, wo werden wir diese Logik schreiben? Wir haben eine Home-Komponente. In der gesamten Komponente, die entweder das Raster oder das tatsächliche Raster angezeigt wird , basierend auf den uns vorliegenden Daten. Wir werden die Logik vorerst in Show Grid schreiben und später werden wir diese Logik in eine andere Datei extrahieren . Es wird einfacher sein , in anderen Komponenten darauf zuzugreifen, zum Beispiel in der Startkomponente, da unsere Logik irgendwann von mehreren Dateien gemeinsam genutzt wird . Wir fangen einfach an. In Show Grid werde ich useReducer aus React importieren. Dann rufe ich Sie vorerst mit einem, sagen wir, Star-Show-Reducer an, den wir in einer Sekunde erstellen werden. Unser Anfangszustand wird ein leeres Array sein. useReducer gibt als Array aus zwei Elementen zurück, wobei das erste Element der Zustand selbst sein wird , also mit einem Stern markiert, und dann die Dispatch-Funktion, sagen wir, Versandstart. Jetzt müssen wir den Show-Reducer mit Sternen erstellen, eine Funktion, die sowohl die Logik zur Aktualisierung des Status als auch die Definition von Aktionen übernimmt. Wir werden hier im Grunde nur zwei Aktionen haben. Zur Starshow und zur Unstar-Show. Definieren wir sie. Immer wenn wir auf Star Me klicken, wir eine Aktion vom Typ Stern mich oder sagen wir einfach Stern, und die Daten, die weitergegeben werden, werden ID anzeigen. Die zweite Aktion wird unstar sein. Auch hier geben wir den Ausweis an den Reduzierer weiter. Innerhalb des Reduzierers ist das erste Argument unser aktueller Status. Nennen wir es als aktuellen Start. Das zweite Argument wird ein Objekt sein, die Aktion, die ausgelöst wird. Dann schreiben wir hier, indem wir erneut den Switch-Fall verwenden, die Logik für die Ausführung Aktionen, die ausgeführt werden. Wir schreiben Logik auf der Grundlage des Aktionstyps. Wir wechseln den Aktionstyp. Falls wir einen Stern haben, geben Sie in diesem Fall bitte die aktuelle Starred.concat-Aktion showId zurück. Unabhängig von der Show-ID , die wir durchführen, fügen Sie diesen Wert bitte zu unserem aktuellen Sternen-Array hinzu. zweite Aktion wird auf Star sein , um die wir uns kümmern werden. In diesem Fall müssen wir diese Show-ID aus unserem aktuellen State-Array entfernen . Wir können die Punktfiltermethode verwenden, die für das Array verfügbar ist. Für Elemente erwartet die Filtermethode also zunächst einen Callback, in dem wir die Logik schreiben , um Elemente innerhalb des Arrays zu filtern. Diese Punktfiltermethode genau wie die Dark Map erhält genau wie die Dark Map genau die gleichen Argumente. erste Element ist der Wert, das aktuelle Element, das wir in einer Schleife überfahren , dann der Index dieses Elements und die Referenz auf das Array selbst. Wir benötigen nur den Wert, der die Show-ID sein wird. Was auch immer dieser Punktfilter zurückgibt, es kann entweder wahr oder falsch sein. Wenn dieser Callback für dieses Element den Wert true zurückgibt, bleibt dieses Element innerhalb dieses Arrays. Wenn der Callback für das Element, das wir in einer Schleife überfahren, den Wert false zurückgibt, wird es nicht in das endgültige Array aufgenommen. Wir werden nur sagen, ob show ID nicht gleich action show ID ist. Mit dieser Logik können wir alle Elemente herausfiltern , die diese Bedingung nicht erfüllen. Wenn wir in diesem Fall etwas Unbekanntes weitergeben, geben Sie bitte standardmäßig dasselbe Muster mit einem Stern zurück. Lassen Sie uns hier eine Funktion erstellen , die die Logik verarbeitet , wenn wir auf die Schaltfläche „Star Me“ klicken. Wir sagen Const auf Stern, ich klicke. In dieser Funktion werden wir die Logik schreiben. Zuallererst wird, wenn Sie mich anklicken, eine Funktion , die die Show-ID als Argument erhält. Dies ist Show ID, die entsprechende Show ID mit der Schaltfläche, Star Me“. Es bezieht sich auf die Show-ID , auf die wir im Grunde klicken. Dann müssen wir hier drinnen herausfinden, ob die Show bereits in den Hauptrollen aufgeführt ist. Wenn Show ohne Sterne ist, wir die Startaktion, andernfalls wir die UnStar-Aktion. Wir können eine Variable namens starred erstellen und fragen einfach ob starred shows array die Show-ID enthält, auf die wir geklickt haben. Wenn diese Sendung mit einem Stern versehen ist, werden wir sie mit einem Stern versenden. Die Aktion wird vom Typ OnStar sein, und Show-ID , wir müssen die Show-ID hier übergeben, wird das sein, was wir OnStar nennen, ich klickbreite. Andernfalls rufen wir Dispatch Starred vom Typ Star an Jetzt müssen wir das irgendwie onStarmeClick verwenden. Nun, wir können diese Funktion in ShowCard verwenden. Wir können, sagen wir, ein Argument übergeben, eine Requisite namens onStarClick übergeben und wir können das Verzeichnis onStarmeClick hier so übergeben, oder sagen wir , onStartMeClick wird onStarmeClick sein. In ShowCard schnappen wir uns die OnStarmeClick-Sonde, die wir jetzt bestehen. Sie können sehen, dass dieser onStarmeClick mit dem Argument showId aufgerufen wird, was bedeutet, dass wir immer, wenn wir onStarmeClick aufrufen, showId übergeben müssen. Auf dieser Schaltfläche hier, onStarMe, teilen wir onClick mit, bitte rufen Sie onStartMeClick an und geben Sie die ID der Sendung weiter. Cool. Jetzt haben wir den kompletten Ablauf, lasst uns versuchen, Log StarredShows abzubrechen , um zu sehen was genau wir in unserem Bundesstaat haben. Inzwischen ist es zunächst ein leeres Array, das haben wir festgelegt. Wenn ich auf StarMe klicke, sehe ich jetzt, dass showID zu diesem Status hinzugefügt wurde. Ziemlich cool. Versuchen wir, eine weitere hinzuzufügen. Wir können jetzt sehen, dass wir drei Elemente haben. Wenn ich zweimal auf dieselbe Sendung klicke, wird sie aus dem staatlichen Tarif entfernt. Unsere Kernlogik, Unstar-Shows zu starten, funktioniert einwandfrei. Da sich dieser Hook jedoch innerhalb der ShowGrid-Komponente befindet, immer dann, wenn wir zu Start und dann, sagen wir, zurück zu Home navigieren dann, wenn wir zu Start und dann, sagen wir, zurück zu Home wird unser Zustand immer dann, wenn wir zu Start und dann, sagen wir, zurück zu Home navigieren, wieder auf den Anfangszustand , weil dieser Zustand für diese Komponente lokal ist Wenn die Komponente ausgemountet wird, ist der Zustand weg. Wir müssen darüber nachdenken, wie wir diese Daten tatsächlich dauerhaft speichern können. Das können wir tun, indem wir beispielsweise StarredShows im Browserspeicher speichern, StarredShows im Browserspeicher speichern damit wir es später abrufen können. Das wird etwas fortgeschritten sein, denn das Erste, was mir in den Sinn kommt, wenn wir den Status zwischen mehreren Seiten, zwischen mehreren Komponenten teilen müssen , können wir diesen Status erhöhen, sagen wir irgendwo auf App. Wenn wir unseren Staat hier verwalten lassen, kann dieser Staat als Requisite an, sagen wir, Kinderkomponenten weitergegeben werden, um kann dieser Staat als Requisite an, sagen wir, Kinderkomponenten weitergegeben werden, um die Hauptrolle zu spielen und nach Hause zu bringen. Aber in diesem Fall heben wir alles nach oben, sodass jeder, sodass jeder, unsere Stammkomponente, etwas über diesen Zustand weiß. Das ist nicht schlecht und dies ist eine ziemlich standardmäßige Methode, um den Share-Status zwischen Komponenten in React zu verwalten. Aber wir werden eine Alternative dazu vorstellen. Warum machen wir das auf diese Weise und heben die Komponente State to App nicht an? Denn selbst wenn wir den Status zwischen Seiten innerhalb der App teilen, beim Aktualisieren der Seite dieser Status beim Aktualisieren der Seite weg. Aber das wollen wir nicht tun. Stattdessen wollen wir den Status irgendwie beibehalten, sodass unsere StarredShows immer noch da sind, wenn wir die Seite aktualisieren . Selbst wenn wir den Browser schließen oder vielleicht diesen Tab schließen, werden unsere StarredShows nicht verschwinden. Was wir in diesem Fall tun werden, wir können einen sogenannten Browserspeicher verwenden. Wir können speziell lokalen Speicher oder Sitzungsspeicher verwenden. Dies ist wie eine kleine Datenbank , die sich im Browser befindet, und Sie können sie verwenden, um temporäre Daten im Browser zu speichern . Es ist eine Datenbank vom Typ Schlüsselwert, was bedeutet, dass Sie unter einem bestimmten Schlüssel einen bestimmten Wert speichern können, und wenn Sie die Seite aktualisieren oder sagen wir, den Browser schließen und zu dieser Seite zurückkehren, für diese bestimmte URL, für diese bestimmte Website, ist dieser Speicher persistent. Die Werte sind immer noch da, es sei denn, sie werden von der Anwendung selbst oder manuell von Ihnen, vom Benutzer, bereinigt . Wir werden unsere Startseite im lokalen Speicher speichern. Lassen Sie uns weitermachen und darüber nachdenken, wie wir das machen können. Wir müssen uns überlegen, wie wir den Status, den wir in unserer App haben, in den lokalen Speicher schreiben können den Status, den wir in unserer App haben, in den lokalen Speicher schreiben . Wir müssen es synchronisieren, denn wann immer wir diesen Status ändern, möchten wir es auch im lokalen Speicher speichern, in der Datenbank speichern, und wenn wir dann die Seite aktualisieren, möchten wir die Daten aus diesem Speicher abrufen und sie dann in unserer App verwenden. Damit können wir beispielsweise zusätzliche Logik zusätzlich zu useReducer schreiben . Dafür können wir zusätzlich zu useReducer einen benutzerdefinierten Hook mit zusätzlicher Logik erstellen, der useReducer einen benutzerdefinierten Hook mit zusätzlicher Logik erstellen, Status im lokalen Speicher beibehält. Das ist etwas fortgeschritten, aber das ist, sagen wir, nicht verwirrend. Lass uns weitermachen und versuchen, das zu tun. Wir haben bereits den useReducer-Hook und wollen die Logik schreiben, die alles genauso macht wie useReducer, aber auch den Status mit dem lokalen Speicher synchronisiert. Wir können vielleicht einen benutzerdefinierten Hook namens usePersistedReducer erstellen. Lassen Sie uns weitermachen und diesen benutzerdefinierten Hook oben drauf machen, wir werden ihn usePersistedReducer nennen. Wir wollen die API des eingebauten Hooks beibehalten, was bedeutet, dass wir genau dieselben Argumente verwenden wollen, wir wollen genau dieselben Elemente zurückgeben, sodass alles so ziemlich gleich ist. Lass uns weitermachen und versuchen, das zu tun. In usePersistedReducer werden wir useReducer verwenden. Da dieser Hook, sagen wir, wiederverwendbar sein wird , wollen wir die Logik hier nicht, sagen wir, eng an StarredShows koppeln , es wird etwas, sagen wir, abstraktes und wiederverwendbares sein, um mehrere Anwendungsfälle zu behandeln. Wir werden diesen Patch einfach Dispatch nennen und statt StarredShows werden wir ihn einfach State nennen. Dann müssen wir in diesem useReducer den Reducer übergeben, da wir die API von usePersistedReducer beibehalten werden. Wir werden es tatsächlich wie useReducer, usePersistedReducer verwenden , wir werden, sagen wir, einen Reducer übergeben , dann wollen wir den Anfangsschlüssel übergeben und dann wollen wir auch den lokalen Speicherschlüssel übergeben, und dann wollen wir auch den lokalen Speicherschlüssel übergeben den lokalen Speicherschlüssel unter dem die Werte hier gespeichert werden. Da wir nun drei Argumente übergeben müssen, müssen wir sie in usePersistedReducer empfangen, also erhalten wir Reducer, erhalten initialState und wir erhalten LocalStorageKey. Wir gehen zu UseReducer über. Den Reducer übergeben wir initialState und wir übergeben etwas namens Initializer. Was ist das? Beim Aktualisieren der Seite wollten wir Daten aus dem lokalen Speicher abrufen und als Ausgangszustand verwenden. Wir möchten diese Logik nur einmal ausführen , wenn die Komponente gemountet wird, damit wir die Initialisierungsfunktion verwenden können. Es ist das dritte Argument , das nur einmal ausgeführt wird , um initialState zu initialisieren. Dieser Initialisierer erhält ein Argument, initialState. Im Grunde wird alles, was wir hier übergeben, als Argument im Initialisierer verfügbar sein . Dies geschieht in diesem Fall, wenn der Initialisierer irgendwo außerhalb als separate Funktion erstellt wird. In diesem Fall werden wir das nicht tun, wir werden den Initialisierer einfach direkt hier einbinden, was ihn initial nennt. Dieses erste Argument wird im Grunde nur der Anfangszustand sein , den wir hier übergeben. Jetzt wird die Logik wie folgt aussehen. Zuerst müssen wir überprüfen, ob wir bereits Daten im lokalen Speicher haben. Lokaler Speicher ist auf dem Fensterobjekt verfügbar, es ist, sagen wir, eine globale Variable was bedeutet, dass wir einfach den lokalen Speicher starten können und dann zack, es funktioniert einfach. Hier werden wir PersistedValue fragen. Wenn der lokale Speicher GetItem unter einem bestimmten Schlüssel erhält, müssen wir zuerst verstehen, ob dieser Wert innerhalb der Layerbasis existiert oder nicht. Lassen Sie uns vielleicht ein bisschen mit localStorage spielen , damit Sie sich ein Bild machen können. LocalStorage können wir unter bestimmten Schlüsselinformationen setItem setzen. Sagen wir, unter Key Low kann ich Wert hoch sagen. Ich führe diese Logik aus und gehe zurück zu localStorage. Hier, nur für den Fall, dass ich es aktualisiere, können Sie sehen, dass ich unter Key Low jetzt Wert High habe. Ich kann hier beliebig viele Werte speichern, ich kann sie umschreiben. Da dieser Wert nun im Speicher des Browsers gespeichert ist, kann ich einfach getItem aufrufen und dann den Schlüssel angeben , unter dem ich meinen Wert erhalten wollte. Ich gebe getItem niedrig an, ich habe meinen Wert hoch erhalten. Die Sache mit localStorage ist, dass es nur mit Zeichenketten arbeiten kann . In unserem Fall ist der Zustand, mit dem wir arbeiten, ein Array, was bedeutet, dass ist der Zustand, mit dem wir arbeiten, ein Array, was bedeutet wir, wenn wir in LocalStorage schreiben , unser Array in eine Zeichenfolge umwandeln und wenn wir dieses aus dem lokalen Speicher abrufen, müssen wir es erneut von einer Zeichenfolge in ein Array konvertieren. Wie wir das machen können. Zunächst erhalten wir von LocalStorage Item unter LocalStorageKey. Unser persistenter Wert wird entweder Null oder eine Zeichenfolge sein. Null, falls dieser Wert nicht im lokalen Speicher existiert, andernfalls wird es immer eine Zeichenfolge sein, da localStorage wiederum nur mit Zeichenketten funktioniert. Hier wird alles, was wir vom Initialisierer zurückgeben als endgültiger Anfangszustand festgelegt. Was auch immer wir hier angeben dient als Argument für den Initialisierer und dann entscheidet der Initialisierer was der endgültige InitialState sein wird. Wenn wir diesen Initialisierer nicht hatten, können wir einfach initialState übergeben und es wird funktionieren. Aber wenn wir mit dem Initialisierer gearbeitet haben und wir mit dem Initialisierer arbeiten , weil wir mit localStorage gearbeitet haben, fügen wir all diese Logik hinzu. Hier werden wir fragen, ob der persistente Wert wahr ist. In diesem Fall wenden Sie bitte die Methode JSON.parse an. Was ist JSON.parse? Wir haben eine Reihe von, sagen wir, Elementen 1, 2. Wir konvertieren es in eine Zeichenfolge, indem die Methode JSON.stringify verwenden. Jetzt wurde unser Array in eine Zeichenfolge umgewandelt und wenn wir sie von localStorage abrufen, ist dieser persistente Wert diese Zeichenfolge. Jetzt müssen wir diese Zeichenfolge zurück in ein Objekt konvertieren , zurück in ein Array. Wir können JSON.parse anstelle von JSON.stringify verwenden, um unseren Wert von localStorage zu deserialisieren , und wir können sehen, dass wir unerwartet und nicht weiß haben. Da dies bereits ein Objekt ist, muss es eine Zeichenfolge sein. Nehmen wir an, wir übergeben eine Zeichenfolge, die dieses Array ist , und wir haben immer noch dieses Problem; es ist kein gültiges JSON. Was ist los? Wahrscheinlich möchte es, dass ich das benutze. Lass uns sehen. Jetzt übergebe ich die gültige Zeichenfolge und Sie können sehen dass sie die Zeichenfolge zurück in das Array analysiert hat. Jetzt hat diese Datenstruktur den Typ eines Arrays, nicht nur eine Zeichenfolge. Hoffentlich macht es Sinn. Hier analysieren wir PersistedValue, andernfalls, wenn persistedValue null ist, wenn der Wert nicht existiert, verwenden Sie bitte den Anfangswert , der der InitialState sein wird. Jetzt sind wir endlich mit der Logik fertig, um den Status zu initialisieren , wenn die Seite aktualisiert wird oder wir zur Seite zurückkehren. Cool. Jetzt müssen wir irgendwie auch Zustandsupdates innerhalb des usePersistedReducer-Hooks synchronisieren , an dem wir gearbeitet haben. Wir können UserEffect verwenden, weil Sie sich erinnern, dass UserEffect es uns ermöglicht, uns in den Lebenszyklus von Komponenten einzubinden und Logik auszuführen, wenn sich etwas ändert. Ich importiere UserEffect und rufe von hier aus userEffect auf und übergebe das Abhängigkeitsarray , in dem ich angeben werde. Wenn sich unser Status ebenso ändert wie unser Schlüssel; localStorageKey, führen Sie in diesem Fall bitte diesen Callback aus. Auch hier gilt: Wenn sich der Status ändert oder wenn sich LocalStorageKey ändert, rufen wir diese Funktion auf. Diese Funktion synchronisiert den Status mit localStorage, also teilen wir localStorage.set mit. Der Elementschlüssel ist localStorageKey und der Wert ist state. Wir müssen es jedoch in eine Zeichenfolge umwandeln, bevor wir in LocalStorage schreiben können. Wir werden JSON.stringify state aufrufen. Am Ende dieses Hooks möchten wir, dass er ein Array mit genau zwei Elementen zurückgibt , sodass unser Hook usePersisted Reducer dem ursprünglichen useReducer-Hook ähnelt. Wir werden es sagen [unverständlich]. Geben Sie diese Pakete an und geben Sie sie zurück und das war's. Das wird unser letzter Haken sein. Es ist im Grunde nur eine zusätzliche Logik zusätzlich zum integrierten UseReducer , der den Status mit localStorage synchronisiert . Wie ich dir schon sagte, es ist ein bisschen fortgeschritten, aber wenn du es dir ansiehst, ist es hier eigentlich nicht kompliziert. Anstatt useReducer zu verwenden, rufen wir hier in ShowGrid usePersistedReducer auf und als Schlüssel als drittes Argument sagen wir starredShows. Versuchen wir es jetzt und sehen es uns an. Wenn wir zur App zurückkehren, öffnen wir den lokalen Speicher der Anwendung. Lass es uns vorerst aufräumen, lass uns nach Sendungen suchen. Sie können sehen, sobald die Komponente auf der Seite gemountet ist, dieser usePersistedReducer-Hook ausgeführt, der Zustand ist initialisiert, da sich unser Status ändert und useEffect mindestens einmal ausgeführt wird. Es hat hier bereits begonnen , den Status mit localStorage zu synchronisieren . Unter Key Start Shows platzieren wir unser leeres Array, unseren InitialState. Wenn ich versuche, etwas Boom zu starten, ist Show hier Edit. Es ist synchronisiert. Wenn ich zu etwas anderem auf „Star me“ klicke, wurde es immer mit localStorage synchronisiert , was bedeutet, dass es funktioniert hat. Fantastisch. Im Moment denke ich, dass das gut sein wird, denn nun, ich denke, das reicht vorerst. Im nächsten Video werden wir darüber sprechen, wie wir mit dieser Logik vorgehen können, sodass wir tatsächlich irgendwie anzeigen können , ob diese Sendung mit den Hauptrollen spielt oder nicht. Teilen Sie dem Benutzer irgendwie visuell , dass diese Show bereits gestartet ist, und dann werden wir wahrscheinlich all die Daten auf der mit den Sternen markierten Seite abrufen . Lassen Sie uns vorerst das festlegen; was wir bereits haben, damit wir die Änderungen nicht verlieren. Hier werde ich sagen, eine anfängliche Logik hinzugefügt, um Sendungen mit UseReducer zu starten. UsePersistedReducer wurde erstellt , um den Status mit localStorage zu synchronisieren. Im nächsten Video werden wir damit fortfahren . Wir sehen uns dort. 80. 24 Starred Shows p2: Hallo zusammen. Im letzten Video haben wir begonnen, an den Funktionen zu arbeiten, die mit Sternen gekennzeichnet sind. Wir haben einen benutzerdefinierten Hook-Use Persisted Reducer erstellt , der unseren StarredShows-Status mit dem lokalen Speicher synchronisiert hat, sodass wir bei jeder Aktualisierung den Status aus dem lokalen Speicher neu initialisieren können. Ich habe es im vorherigen Video nicht gezeigt, aber wenn wir versuchen, StarredShows abzusagen , wenn ich die Seite aktualisiere, lass mich zur Startseite zurückkehren. Wenn ich die Seite aktualisiere und wenn die Komponente gemountet wird, wird unser Anfangszustand aus dem lokalen Speicher abgerufen, was auch immer wir hier haben. Wenn wir es bereinigen, wenn wir alles aus dem lokalen Speicher entfernen, die Seite aktualisieren und nach Sendungen suchen, ist unser Standardstatus ein leeres Array. Cool. Jetzt müssen wir uns überlegen, wie wir diesen Hook tatsächlich, sagen wir, auf mehreren Seiten, auf Home und Start wiederverwenden können. Aber zuerst teilen wir dem Benutzer mit, ob diese Show gestartet ist oder nicht. Wir kehren hier zu ShowGrid zurück und zur ShowCard, wir können eine weitere Requisite namens isStarred weitergeben. Das ist Starred wird ziemlich einfach sein, wir werden nur fragen, ob StarredShows. Staat, den wir haben, enthält diese Daten, zeigt die ID. Das ist also isStarred ein boolescher Wert, der angibt, ob diese Show bereits im StarredShows-Array vorhanden ist . Dann schnappen wir uns in ShowCard einfach IsStarred als Requisite. Vorerst werden wir nur fragen, ob diese Sendung bereits in den Hauptrollen aufgeführt ist, bitte auf Star me anzeigen, oder einfach Unstar me oder Star me. Lass es uns versuchen und sehen. Immer wenn ich hier klicke, wird es zu Unstar me. Wenn wir auf „Hallo morgen“ klicken, ist es immer noch Unstar me. Wenn ich jetzt die Seite aktualisiere, suche ich erneut nach Hallo. Wenn ich scrolle, können Sie sehen, dass die Werte beibehalten werden. Selbst wenn ich meinen Browser schließe, diesen Tab schließe und wieder zu dieser Seite zu den spezifischen Sendungen zurückkehre, wird immer noch Unstar me angezeigt, da wir den Status erneut mit dem lokalen Speicher synchronisiert haben. Cool. Lassen Sie uns nun fortfahren und die Logik, die wir hier geschrieben haben aus ShowGrid in eine separate Datei extrahieren, damit wir später dieselbe Logik auf der Startseite wiederverwenden können . Lass uns gehen. Wahrscheinlich im Quellcode oder vielleicht erstellen wir einen neuen Ordner namens library, kurz lib. Hier erstellen wir eine Datei namens UseStarredShows. In diese Datei werde ich all die Logik einfügen, die sich auf Hooks bezieht, die wir zuvor geschrieben haben. Das ist usePersistedReducer, das ist StarredShowsReducer, das ist dieser usePersistedReducer-Aufruf und der Import von useReducer und useEffect. Wenn wir also, sagen wir, genau den gleichen Hook in einer anderen Komponente verwenden wollen, sagen wir innerhalb von Seiten, die mit einem Stern markiert sind, würden wir ihn einfach so kopieren. Wir müssen usePersistedReducer erneut aufrufen, wir müssen StarredShowsReducer erneut übergeben, denselben Schlüssel angeben, aber wir können noch einen Schritt weiter gehen, wir können darüber einen weiteren benutzerdefinierten Hook erstellen und sagen wir, die Logik dort verstecken. In useStarredShows erstellen wir einen neuen Hook namens useStarredShows und diesen Hook nennen wir usePersistedReducer und anstatt nur Zerstörungswerte hier, wir den Wert zurück , den usePersistedReducer hier zurückgibt. Hier werden wir wahrscheinlich nichts weitergeben, weil wir, sagen wir, die Logik direkt hinter diesem Hook verbergen wollen , also können wir innerhalb unserer Komponente einfach useStarredShows aufrufen und es tatsächlich speichern, dann aus useStarredShows exportieren und dann aus der Bibliothek useStarredShows importieren und useStarredShows sein und der Hook wird useStarredShows sein. Wir nennen es und wir bekommen einfach StarredShows und wir bekommen einfach DispatchStarred. Sie können sehen, dass es jetzt viel, viel sauberer aussieht als zuvor. Jetzt ist es auch wiederverwendbar, was bedeutet, dass wir innerhalb der mit Sternen versehenen Komponente genau dasselbe tun können. Wir können einfach useStarredShows wir innerhalb der mit Sternen versehenen Komponente genau dasselbe tun können aufrufen und dieselben Daten löschen. Lass uns das machen. In starred werde ich useStarredShows importieren und hier werden wir wahrscheinlich dispatchStarred nicht benötigen, wir werden die Dispatch-Funktion nicht benötigen, also werden wir sie nicht destrukturieren, wir werden nur das erste Element nehmen, die StarredShows. Nun, hier können wir die Logik zur Gutschrift der Daten schreiben, das werden wir im nächsten Video tun. Moment gehen wir wahrscheinlich zu Starred page, starred, starredshows.length , wo die Anzahl der Serien angezeigt wird, in denen wir bisher die Hauptrolle gespielt haben. Lassen Sie uns versuchen zu sehen , ob es funktioniert hat. Wenn wir zur Startseite gehen, können wir sehen, dass zwei Sendungen mit einem Stern markiert sind. Dies ist das, was wir in unserem Status sehen, im lokalen Speicher gespeichert wird. Wenn wir versuchen, den lokalen Speicher zu bereinigen und wenn wir die Seite aktualisieren, wird Sternchen Null sein , weil wir alles entfernt haben, der Status wurde neu initialisiert, so etwas in der Art. Lassen Sie uns vorerst einfach alles verpflichten, was wir hier getan haben. Wir haben die Hook-Logik in eine separate Datei extrahiert , in der wir zusätzlich zu unserem usePersistedReducer speziell für StarredShows einen weiteren benutzerdefinierten Hook erstellt der wir zusätzlich zu unserem usePersistedReducer speziell für und ihn useStarredShows genannt haben. Dann verwenden wir diese benutzerdefinierte, mit Sternchen versehene Komponente, um vorerst die Gesamtzahl der von uns hinzugefügten Shows anzuzeigen , und wir verwenden diesen Hook innerhalb von ShowGrid, useStarredShows sowie dem visuell benachrichtigten Benutzer, indem Star me- oder Unstar me-Texte basierend auf der Show-ID anzeigen, unabhängig davon, ob sie sich innerhalb des State-Arrays befindet oder nicht. Eigentlich schien es viel zu sein. Es war jedoch nicht so viel, oder? Also füge ich alles zur Bühne hinzu und sage erstellten useStarredShows, benutzerdefinierter Hook hat die gesamte Hook-Logik platziert oder sagen wir useStarredShows-Hook-Logik in einer separaten Datei platziert. Teilen Sie dem Benutzer mit, ob die Sendung angestarrt wird oder nicht. Teilen Sie dem Benutzer mit, ob die Sendung angestarrt ist oder nicht. Das war's. Lass uns zu GitHub wechseln und wir sehen uns im nächsten. Im nächsten Video werden wir all diese Shows abrufen, die wir innerhalb der Startkomponente Zugriff haben. Jetzt werden wir sie von der TV Makes API abrufen und sie endlich anzeigen. Wir sehen uns. 81. 25 Starred Shows p3: Hallo zusammen. In diesem Video werden wir endlich die Seite mit den Stars der Sendung fertigstellen. Im vorherigen Video haben wir einen benutzerdefinierten Hook namens User Starred Shows erstellt . Dabei handelt es sich um einen Hook zusätzlich zu Use Persisted Reducer, der ebenfalls ein benutzerdefinierter Hook zusätzlich zum Use Reducer ist ebenfalls ein benutzerdefinierter Hook zusätzlich zum Use Reducer jedoch mit zusätzlicher Logik, die den Status mit dem lokalen Speicher synchronisiert. In diesem Video nehmen wir die mit Sternchen markierten Sendungen, in denen wir eine mit Sternen versehene Komponente haben , und rufen sie dann von der TVMaze API ab. Zuallererst haben wir eine Reihe von Show-IDs. Wenn wir in die TVMaze-Dokumentation schauen , haben wir keinen Endpunkt. Versuche danach zu suchen, wo wir mehrere Sendungen gleichzeitig aufnehmen können . In unserem Fall werden wir also mehrere Anfragen an die API senden. Gehen wir zur markierten Komponente. Hier würden wir standardmäßig use effect verwenden, würden wir standardmäßig use effect verwenden um Daten nur dann von der API abzurufen, wenn die Komponente gemountet wird. Da wir jedoch die Datenabrufbibliothek verwenden, verwenden wir Query, können wir sie verwenden, um Daten abzurufen . Lassen Sie mich das von der Home-Komponente kopieren, ich gehe hier hin, drinnen importiere ich die Benutzerabfrage aus der React-Abfragebibliothek. Jetzt wird unser Abfrageschlüssel mit einem Stern markiert und wir übergeben die Reihe der Sternchen versehenen Sendungen, die wir als Abfrageschlüssel haben. Dann müssen wir innerhalb der Abfragefunktion alle unsere Shows abrufen. Wie können wir das machen? Der erste und naive Ansatz ist, dass wir tatsächlich den einfachen For-Loop verwenden können, dann wiederholen wir jede Sendung, die wir innerhalb des mit Sternchen versehenen Show-Arrays haben , wir nehmen jede Show-ID und senden dann die Anfrage. Sie können jedoch sehen, dass all diese Anfragen, die wir senden können, sagen wir, wir haben zwei Ausstellungs-IDs innerhalb des Bundesstaates und wir werden zwei Anfragen senden. Wenn wir jedes Element in einer Schleife durchlaufen können wird die erste Anfrage gesendet, erst wenn sie fertig ist , wird die zweite Anfrage gesendet. Das ist nicht effizient, da die Anfragen, die wir für Shows senden werden, nicht voneinander abhängig sind. Wir wollen, dass das so schnell wie möglich geschieht. Deshalb müssen wir mehrere Anfragen gleichzeitig senden . Um dieses Verhalten zu erreichen, verwenden wir promise.all. Lass mich dir zeigen, was ich meine. In der Abfragefunktion werden wir die folgende Logik schreiben. Bevor ich das mache, entfernen wir Option aktiviert und wir werden den Windows Focus erneut abrufen. Hier wird die Logik wie folgt aussehen. Lass es nur eine Funktion und eine Sync-Funktion sein. Hier werden wir zuerst unsere kartografieren, wo ist sie? API TV-Labyrinth. Diese Funktion „Get Show by ID“. Wir werden die Funktion , die das Versprechen zurückgibt, einem Array zuordnen. Klingt schon kompliziert, aber lassen Sie mich Ihnen zeigen, was ich meine. Was wir hier machen werden. Wir sagen, sagen wir, API-Anforderungsversprechen. Wir werden starredshows.map machen. Wir werden die Show-ID der API zuordnen , um eine solche Anzeige nach ID zu erhalten. Wir geben hier die Show-ID an. Mit diesem Ansatz werden wir am Ende eine Reihe von Versprechungen erhalten. Weil wir jede Show-ID so zuordnen , dass sie nach ID angezeigt wird, was ein Versprechen zurückgibt. Am Ende erhalten wir eine Reihe von Versprechungen. Um eine Reihe von Versprechen zu handhaben und sicherzustellen , dass diese Anfragen, sagen wir, parallel zur gleichen Zeit bearbeitet werden , können wir die Methode promise.all verwenden. Wir werden es Await Promise.all sagen. Wir können tatsächlich, weißt du was, all diese Logik von hier in eine wiederverwendbare Funktion in TVMaze.gs verschieben . Wir werden die Shows dieses Mal nur anhand der Ausweise mitteilen und wir werden die Ausstellungsausweise hier erhalten. Anstatt einfach API Get Here zu machen, werden wir diese Funktion in eine Synchronisierungsfunktion verwandeln und die Logik, die wir hier geschrieben haben, in get show by IDs einfügen. Wir werden jede Show-ID einem Versprechen zuordnen, dann innerhalb von promise.all, und wir sehen bereits, dass das Versprechen nicht definiert ist und eigentlich von ES Lint stammt. Nun, das ist interessant. Ich nehme an, das liegt daran, dass wir innerhalb von ES Lint RC ES Lint anweisen müssen , zu verstehen, dass wir die neueste JavaScript-Syntax verwenden , die moderne, also werden wir sagen ES6 wahr sein wird. ES6 bedeutet ECMAScript Version 6 und höher. Nun, ich denke, wir haben keine Fehler, das stimmt. Um promise.all zu versprechen, geben wir API-Anforderungsversprechen oder nennen wir es einfach Versprechen, um es einfacher zu machen. Was promise.all macht, ist, dass es eine Reihe von Versprechen parallel löst, und sie werden alle auf einmal gelöst und parallel bearbeitet. Unter der Haube sieht es so aus, als ob Versprechen 1, Versprechen 2, Versprechen 3 zu versprechen. Alles wieder, eine Reihe von Versprechungen. Promise.all löst sie alle auf einmal. Dann ergibt promise.all ein Array aufgelöster Werte. Wenn wir eine Reihe von Versprechungen haben, sagen wir, Versprechen 1, Versprechen 2, Versprechen.all löst sie alle auf einmal. Promise.all gibt ein Array aufgelöster Werte zurück. Wenn sich Versprechen 1 beispielsweise auf den Wert 1 auflöst, würden wir ein Array mit einem, sagen wir, aufgelösten Wert 1 erhalten . Sie haben versprochen, sich um etwas anderes zu kümmern, wir würden den Wert „Resolved, Solved“ erhalten. Wenn das Versprechen zu nichts führt , vielleicht zu Null, wäre ein undefinierter Wert undefiniert oder Null. Die Reihenfolge wird jedoch beibehalten. Welche Reihenfolge auch immer hier vorhanden ist, in derselben Reihenfolge werden Versprechen gelöst, wenn promise.all verwendet wird. Ein Punkt hier: promise.all gibt auch ein Versprechen zurück, also müssen wir es umgehen. Das ist wichtig. Jetzt können wir es als Ergebnis bezeichnen. Hier geben wir Versprechen ab und geben das Ergebnis zurück. Weil in unserem Fall jedes Versprechen dazu führt, dass Daten angezeigt werden, werden wir irgendwann eine Reihe gelöster Versprechen erhalten , was bedeutet, dass wir eine Reihe von Sendungen erhalten werden . Wir werden es auf der Konsole protokollieren , um zu sehen, womit wir genau arbeiten. In Start J6 nennen wir das Get Show by IDs. Vielleicht weißt du was? In get show by ID betten wir Daten ein. Aber auf der Startseite brauchen wir es nicht. Anstatt get show by ID hier aufzurufen , rufen wir ApiGet ohne den Embed-Teil auf. So etwas. Auf der mit den Sternen markierten Seite geben wir nun an, bitte rufen Sie Get Shows by IDs an. Inside query function und inside pass mit Sternchen zeigen, dass wir das haben. Jetzt werden wir Fehler mit Sternchen und Sternchen markiert haben. Verwechseln Sie uns nicht mit dem Benennen. Nennen wir es wahrscheinlich Starshow, Starstard-Show-IDs. Hier wird es nur StarredShows und StarredShows fehlerfrei sein. Jetzt wenden wir hier einfaches bedingtes Rendern an , genau wie zuvor auf der Show-Seite mit ob und wenn Sie drehen. Wir werden fragen, ob StarredShows tatsächlich wahr ist. In diesem Fall geben Sie bitte ShowGrid zurück , da wir Show Grid verwenden , um alle Shows anzuzeigen, die wir haben . Das wird ShowGrid verwenden , aber zuerst müssen wir es importieren. Importieren Sie ShowGrid. Es wird für mich bereits automatisch aus den Komponenten ShowGrid vervollständigt . Wenn wir mit Shows begonnen haben, kehren wir zu ShowGrid und ShowGrid erwartet, dass wir die Shows hier bestehen. Lassen Sie uns versuchen, das zu tun, shows entspricht StarredShows und standardmäßig Wochenende und Display Hello. Lassen Sie uns zuerst versuchen, zu sehen, was wir haben. Unsere App läuft nicht, weil wir den Div-Server nicht gestartet Okay, jetzt haben wir unsere Shows Versuchen wir, etwas hinzuzufügen, starme mich. Jetzt gehen wir zur Startseite und zack, wir haben einen leeren Bildschirm und wenn wir in die Konsole schauen, sehen wir, dass die Eigenschaften einer undefinierten Lese-ID nicht gelesen werden können. Was passiert, wenn wir in ShowGrid schauen? Wo ist es? Wir erhalten Shows, die ein Array sein sollen , und innerhalb dieses Arrays hat jedes Element den Schlüssel.show property.show, hat jedes Element den Schlüssel.show property.show aber es wird in unser Ergebnis schauen und das ist es, was wir in der Konsolenanmeldung erhalten, die hier nach IDs angezeigt werden. Sie können sehen, dass wir eine Reihe von Elementen haben und nicht jedes Array-Element die. Eigentum anzeigen. Wir müssen es irgendwie reparieren. Wir müssen diese Datenform an die Datenform anpassen , die voraussichtlich in der Komponente verwendet wird. Die Frage ist, wo genau müssen wir das tun? Das ist eine gute Frage. Nun, wenn wir diese Funktion, sagen wir, in unserem Fall, in unserer App so wiederverwendbar wie möglich machen wollen in unserem Fall, in unserer App so wiederverwendbar wie möglich , stimmt das nicht, aber dennoch ist es eine gute Praxis, die erforderlichen Änderungen nur dort vorzunehmen , wo sie benötigt werden, und wenn wir sie wiederverwendbar machen wollen, wollen wir sagen, die Datenform hier nicht irgendwie ändern lassen . Wir werden diese Logik in der Abfragefunktion ausführen. Hier in getShowsByIds muss ich das Ergebnis nicht mehr auf der Konsole protokollieren oder lassen Sie es uns vorerst behalten, und später werden wir das loswerden. Aber innerhalb der Abfragefunktion hier werden wir Folgendes tun. Wenn getShowsByIds das Versprechen gelöst ist, werden wir jetzt den Punkt dieser Syntax verwenden, weil es besser zu dieser Syntax passt. Sehen wir uns diese Syntax an, die wir hier haben. Anstatt async wait zu verwenden, können wir Async von hier entfernen Wenn diese getShowsByIds-Anfrage also beendet ist , wenn das Versprechen mit diesem Ergebnis aufgelöst wird, wir jedes Array-Element zuordnen und alle Daten, die wir hier haben, unter dem Schlüssel show, unter der Eigenschaft show verschachteln Daten, die wir hier haben, unter dem Schlüssel show, , sodass wir der Struktur entsprechen, die erwartet wird wird vom ShowGrid verwendet, da wir ein Array von Elementen benötigen in dem jedes Element die show-Eigenschaft hat. Was wir tun werden, wir werden das Ergebnis mitteilen. map werden wir hier Show-Daten erhalten und von diesem Callback , der showData zurückgibt, um es einfacher zu machen, anstatt die längere Syntax mit return zu verwenden, werden wir return showData mit geschweiften Klammern mitteilen. Wenn wir jetzt versuchen, StarredShows hier abzusagen , haben wir immer noch dieses Problem. Lass mich sehen. Wir haben ShowData. Das liegt daran, dass wir zugeordnet haben, dass Sie sehen können , dass jedes Array-Element den ShowData-Schlüssel hat, aber wir erwarten, dass es nur angezeigt wird. Hier können wir anstelle von Show Data show and show verwenden. Jetzt versuchen wir zu sehen, dass wir uns erfrischen und bumm, jetzt funktioniert alles wie von Zauberhand. Wenn wir uns das Ergebnis ansehen, haben wir diese Daten , die wir von getShowsByIds erhalten , und dann haben wir die Daten zugeordnet. Wir verschachteln diese Daten tatsächlich unter dem Show-Schlüssel in jedem Array-Element, ungefähr so. Jetzt können wir dieses Ergebnis endlich von hier entfernen und einfach promise.allpromises zurückgeben. Hier müssen wir nichts ändern, das ist unsere Logik hier. Jetzt müssen wir uns mit dem Fall befassen, in dem wir keine Starserien haben. Nehmen wir an , ich räume den lokalen Speicher auf, ich aktualisiere die Seite, nichts wird angezeigt, aber im Idealfall möchten wir dem Benutzer sagen, dass , hey, wir keine StarredShows haben. Wir haben bereits diese If-Bedingung geschrieben, die sowohl für Shows als auch für solche ohne Shows funktioniert , da ein leeres Array auch ein wahrheitsgemäßer Wert ist , sodass wir einfach feststellen können, ob starredShows.Length größer als Null ist, wenn wir mindestens eine Show haben , und wir verwenden hier die optionale Verkettung, da unser Anfangszustand durch use query undefiniert sein wird. Nun, die Anfrage erfolgt nicht sofort, also diese StarredShows können undefiniert sein und keinen Fehler auslösen Lassen Sie mich das zum Beispiel entfernen, ich aktualisiere es, ich gehe zur Konsole und sehe, dass ich aktualisiere es, ich gehe zur die Eigenschaften von undefined nicht gelesen werden können, da dieser Status zunächst wieder undefiniert ist, die Anfrage wird nicht sofort ausgeführt. Wir können hier entweder die optionale Verkettung verwenden oder wir können fragen, ob starredShows wahr ist . Dann verwenden wir den Add-Operator, this starredShows, dieser Zeitpunkt definiert ist, können wir sicher starredShows.Length eingeben, aber um das zu vereinfachen, verwenden wir die optionale Verkettung. Wenn die Länge von StarredShow größer als Null ist, zeigen wir ShowGrid an und fügen dann eine weitere Bedingung wenn die Länge von StarredShow gleich Null ist. In diesem Fall zeigen wir div so an, als ob keine Shows mit Sternen markiert wurden. Dann fügen wir eine weitere Bedingung hinzu falls wir einen Fehler haben. Wenn wir shows adder gestartet haben, werden wir sagen, dass ein Fehler aufgetreten ist und wir sagen starredShowsError.Message. Wenn in diesem Fall keine dieser Bedingungen erfüllt ist, teilen wir standardmäßig mit, dass die Sendungen noch laufen oder nur die Sendungen geladen werden. Dies ist vorerst unser letzter Markt, lassen Sie uns versuchen, es zu sehen. Wenn ich schnell aktualisiere, ein kurzes Blinken angezeigt, da dieser Status zunächst undefiniert ist, das heißt nur für einen kurzen Zeitraum nicht übereinstimmen und wir sehen, diese Bedingungen nur für einen kurzen Zeitraum nicht übereinstimmen und wir sehen, dass Sendungen geladen werden dass Sendungen , wenn die Anfrage länger dauert als erwartet. Wir werden sehen, dass Sendungen geladen werden, dann sehen wir, dass keine Sendungen mit Sternen markiert wurden. Wenn wir nach Hause gehen, suchen wir nach Serien, bei denen wir hier mitgespielt haben, dann suchen wir nach etwas anderem, hey Alter, hey, wir gehen zurück zu den Stars, du kannst sehen, jetzt haben wir diese Shows hier. Selbst wenn wir die Seite aktualisieren, sind die Shows immer noch da. Ziemlich cool. Jetzt haben wir den kompletten, vollständigen Zyklus dieser mit Sternen ausgezeichneten Funktionalität. Herzlichen Glückwunsch. Das war's vorerst, wir werden alle Änderungen zur Bühne hinzufügen. Wir haben ES Link zuerst angewiesen, modernes JavaScript zu verwenden, damit wir modernes JavaScript zu verwenden, damit keine Fehler erhalten, wenn wir einen solchen Promise-Konstruktor schreiben . Wir haben hier eine weitere Funktion hinzugefügt, um alle Sendungen abzurufen , wenn wir die Show-IDs kennen. Wir verwenden die Methode promise.all, um alle Anfragen gleichzeitig zu bearbeiten promise.all, um alle Anfragen gleichzeitig , da diese Anfragen nicht voneinander abhängig sind, diese Anfragen nicht voneinander abhängig sind, sondern parallel bearbeitet und dann auf einmal gelöst werden müssen und dann auf einmal gelöst Genau das macht promise.all. Dann haben wir in der mit Sternen versehenen Komponente den Use-Abfrage-Hook verwendet , um Daten abzurufen. Wir wissen bereits, was er tut und warum wir ihn verwenden, dann wenden wir bedingtes Rendern an, um Daten anzuzeigen. Das war's. Großartig. Lassen Sie uns alles festlegen und sagen wir, abgerufene, Sternen versehene Sendungen Daten und Anzeige. ShowGrid für sie. Cool. Ich schiebe alles auf GitHub und in diesem guten Sinne, wir sehen uns im nächsten. 82. 26 Zuordnung: Hallo nochmal, ich habe eine kleine Aufgabe für Sie, um sich daran zu erinnern, dass zur Implementierung von Start Shows angezeigt werden , Daten im Browser zu speichern. Wenn wir die Seite aktualisieren, ist unser Status immer noch da. Wir haben lokalen Speicher verwendet, Speicher im Browser , der Daten persistieren kann. Wäre es nicht schön, wenn wir auch was wir in das Suchfeld eingeben, in der Home-Komponente beibehalten könnten. Also, wenn ich die Seite aktualisiere, ist alles, was sich in der Textbox befindet, immer noch da. Die Idee hier ist sehr ähnlich. Also für Startshows haben wir unseren eigenen Hook erstellt, der den Zustand synchronisiert, genannt Fuse persisted Reducer. Wir können einen sehr ähnlichen Rahmen erstellen, der diesmal Hughes persisted state on top of US state heißt , und dann diesen Bundesstaat verwenden, um dieses Datum für das Suchfeld zu implementieren. Das ist die Aufgabe für dich. Mach weiter und probiere das aus. Und diesmal können Sie anstelle von lokalem Speicher vielleicht Sitzungsspeicher verwenden. Der Unterschied zwischen lokalem Speicher und Sitzungsspeicher besteht darin, dass der lokale Speicher Daten beibehält, auch wenn Sie den Tab schließen und den Browser schließen, Sitzungsspeicher nur Daten beibehält, bis Sie den Tip schließen, den Tab schließen und dann zur Seite zurückkehren. Auch hier wird der Sitzungsspeicher leer sein, was möglicherweise besser für Textbox geeignet ist, da wir ihn nicht speichern möchten , wenn wir den Tab schließen oder den Browser schließen. Die API ist also nicht dieselbe, was bedeutet, dass Sie anstelle von lokalem Speicher Sitzungsspeicher schreiben und der Rest bleibt gleich, Objekt und Seitenelement abrufen. Versuchen Sie also, diesen persistenten Benutzerstatus zu erstellen und ihn dann so zu implementieren, dass und ihn dann so zu implementieren der Status des Suchfelds beibehalten wird. Viel Glück damit. Wir sehen uns im nächsten. 83. 27 Implementierung von benutzerdefinierten Hook usePersistedState: Hallo nochmal, wie war dein Auftrag? Konnten Sie erreichen, was wir wollten? Konnten Sie Daten im Sitzungsspeicher dauerhaft speichern? Lass uns sehen. Wenn wir zum Suchformular zurückkehren, haben wir hier den Befehl state, um die Suchzeichenfolge state zu verwenden . Wenn wir es nun im lokalen Speicher oder Sitzungsspeicher beibehalten möchten , müssen wir eine zusätzliche Logik schreiben. Wir können die ganze Logik irgendwo in einer anderen Datei extrahieren , und dann hier im Suchformular wollten wir einfach use persisted aufrufen oder vielleicht search string verwenden, was uns wieder ein Array aus zwei Elementen, Zeichenfolge und Suchzeichenfolge, zurückgibt , damit wir die API des Use-State-Hooks nicht ändern. Es wird so ziemlich dasselbe sein. Lassen Sie uns das alles umsetzen. Unter dem Bibliotheksordner, den ich hier habe , in dem sich use start chose befindet, erstelle ich eine neue Datei namens use search, STR, search string. Hier exportiere ich const, verwende die Suchzeichenfolge. Unser Hook akzeptiert keine Argumente, wir werden alles darin behandeln, also wird der Anfangszustand durch den Hook im Inneren definiert. wollen wir uns nicht kümmern, wenn wir diesen Haken benutzen. Dann hebe ich es mir vorerst auf. Dann werde ich von hier aus aus der Bibliothek importieren und die Suchzeichenfolge verwenden. Der endgültige Look wird so aussehen. So ziemlich das Gleiche wie zuvor , aber die ganze Logik, jetzt gehen wir rein. Im Falle einer Verwendung unterstützten die Startanzeigen wöchentlich diesen benutzerdefinierten Hook namens use persisted reducer. Wir können genau dasselbe mit use state machen , aber statt use-reducer werden wir use state verwenden. Ich werde das als Referenz kommentieren. Verwenden Sie erneut ein Factorable, das benötigt wird, um diesen Status mit dem Sitzungsspeicher zu synchronisieren. Ich benötige Ihren Status und hier erstelle ich den persistenten Status. Use persistent state erhält den Anfangsstatus als Argument. Hier rufe ich use state an und übergebe den Anfangsstatus hier. Aber anders als bei use reducer kann use state entweder den Anfangszustand als Argument oder die Initialisierungsfunktion erhalten den Anfangszustand als Argument oder die , die nur einmal ausgeführt wird, um den Zustand zu initialisieren. Im Fall von use reducer war es das dritte Argument, im Fall einiger angeben, ist es einfach immer noch dasselbe Argument, aber Sie übergeben den Callback einfach dort. Hier im Inneren wird die Logik so ziemlich dieselbe sein wie beim lokalen Speicher. Zuallererst beziehen wir uns auf den Sitzungsspeicher, holen Sie sich den lokalen Speicherschlüssel des Elements. Wir müssen den lokalen Speicherschlüssel hier bekommen. In unserem Fall wird es der Sitzungsspeicherschlüssel sein. Wir werden es aus der Verwendung persistenter Zustandsargumente herausholen. Neben dem Anfangsstatus können wir den Sitzungsspeicherschlüssel übergeben. Andererseits haben wir einen persistenten Wert, falls ein Wert existiert, desoralisieren wir ihn aus der Zeichenfolge, andernfalls verwenden wir den von uns übergebenen Anfangswert, das Anfangsstatusargument sein wird. Fantastisch. Hier erhalten wir die Status - und Status-Update-Funktion. Dann genau die gleiche Logik mit Nutzungseffekt. Wir nehmen es einfach von hier aus und sagen, wann immer sich der Status oder wann immer sich der Sitzungsspeicherschlüssel ändert, rufen Sie bitte session storage dot set item, session storage key JSON, stringify, state auf. Dann geben wir ab der Phase „persisted genau dieselbe API wie für den Use-State-Hook beizubehalten “ ein Array mit zwei Elementen zurück, wobei das erste Element der Zustand und das zweite die State-Update-Funktion ist, um genau dieselbe API wie für den . Jetzt können wir diese Kommentare hier entfernen und darin die Suchzeichenfolge verwenden. Wir können use persistent state aufrufen, innerhalb dessen wir den Anfangsstatus übergeben, es ist eine leere Zeichenfolge und der Sitzungsspeicherschlüssel wird eine Suchzeichenfolge sein. Fantastisch. Was auch immer dieser persistente Zustand zurückgibt, und er gibt ein Array mit zwei Elementen zurück , wobei das erste Element der Zustand ist, zweite die Status-Aktualisierungsfunktion ist, genau dieselbe API wie für den Use-State-Hook. Anstatt dies zu schreiben und dann return state und set state zu schreiben, können wir einfach das zurückgeben, was die Funktion use persisted state zurückgibt. zurück, verwenden Sie den persistenten Status. Nun, das ist es. Jetzt können wir den Hook verwenden, den wir im Suchformular erstellt haben , und er wird auf magische Weise funktionieren. Lass es uns versuchen und sehen. Wenn ich die Seite aktualisiere, können Sie sehen, dass ich im Sitzungsspeicher eine Schlüsselsuchzeichenfolge habe, was auch immer wir hier als Sitzungsspeicherschlüssel angeben , sodass der Status mit dem Wert initialisiert wird , den wir hier standardmäßig als leeren String übergeben. Was auch immer wir nun in das Suchfeld eingeben, es wird als Wert innerhalb des Sitzungsspeicherschlüssels unter der Suchzeichenfolge umgeleitet des Sitzungsspeicherschlüssels unter der , da wir den Effekt dafür verwenden , um den Status zu synchronisieren. Wenn ich aktualisiere, können Sie sehen, dass alles, was wir im Sitzungsspeicher haben , jetzt als Anfangszustand in einem Textfeld angezeigt wird , wenn ich es aktualisiere. Das ist zum Beispiel sehr praktisch, wenn ich die Seite versehentlich aktualisiere, macht es hoffentlich Sinn. Nicht zu komplex, wie Sie sehen können, und ich hoffe wirklich, dass Sie so ziemlich dieselbe Logik implementiert haben. Moment werden wir alles festhalten und sagen, dass dies die Verwendung von Suchzeichenfolge Hook war, Commit-Nachricht wird in der dritten Form gespeichert, Textfeldwert im Sitzungsspeicher. Die gesamte verwendete Logik, Suche, Zeichenfolge, Haken. Ich schiebe alles auf GitHub. Wir sehen uns im nächsten. 84. 28 Einführung zu Styled Components: Hallöchen. Im letzten Video würde ich sagen, dass wir unsere gesamte Logik innerhalb der App abgeschlossen haben. Jetzt ist es an der Zeit, dass wir über Stile sprechen. Wie wir die Anwendung gestalten werden. In diesem Video werden wir über den Ansatz sprechen, den wir verfolgen werden , und hier ist ein Spoiler für Sie, der Ansatz wird aus stilisierten Komponenten bestehen. In diesem Video werden wir sehen, wie gestylte Komponenten funktionieren. Warum genau wählen wir sie aus und am Ende werden wir stilisierte Komponenten mit der traditionellen Art vergleichen , Apps mit nur normalen CSS-Stilen zu verkaufen. Lass uns gehen. Was sind gestylte Komponenten? Das ist nur eine Bibliothek zum Stylen oder Reagieren Anwendungen mit einem Ansatz namens CSS-IN-JS. CSS in JavaScript ist ein Ansatz, der es uns ermöglicht, CSS-Markup mit Hilfe von JavaScript zu schreiben. Moment bin ich auf der offiziellen Website von Style Components, offizielle Dokumentation. Was wir jetzt in diesem Video tun werden, wir werden die Grundlagen durchgehen, um zu verstehen wie genau wir diese Bibliothek verwenden können. Wenn ich ein wenig nach unten scrolle, werde ich den einfachen Installationsvorgang durchführen. Ich werde zu meiner Bewerbung zurückkehren. Ich werde hier eine neue Terminalinstanz öffnen und Komponenten im Stil von npm install ausführen. Sobald es installiert ist, werde ich die Instanz einfach schließen. Ich habe das nur gemacht, um die Anwendung selbst nicht zu stoppen. Jetzt sind die gestylten Komponenten unter dem Paket Jason erschienen. Abhängigkeiten In der Dokumentation können wir Ihre erste gestylte Komponente sehen. Wir müssen Styled aus Styled-Components importieren und dann so etwas verwenden. Gehen wir zur Home-Komponente und wir können uns mit gestylten Komponenten hier auf der Homepage bewerben . Oben werde ich Styled aus Styled-Components importieren. Dann mache ich styled.button und lasse am Ende dafür leere Häkchen übrig. Also, was ist das? Indem Sie das Element style, style.HTML, aufrufen , das Sie in dieser sehr langen Liste haben , können Sie beispielsweise das zugrunde liegende Element erstellen , das Sie stylen möchten, zum Beispiel styled button. Aus diesem Element erstellen Styled-Components eine Komponente und diese Komponente wird Stile haben. Wenn wir zurück zur Dokumentation gehen und ein wenig nach unten scrollen, finden wir hier dieses einfache Beispiel, style.button back-Ticks und dann CSS-Markup Wie Sie sehen können, wird CSS-Markup in Back-Ticks geschrieben. Das Syntaxhighlight, das Sie hier sehen können, stammt übrigens von der VS Code-Erweiterung, die als VS Code Styled Components bezeichnet wird. Wenn Sie möchten, dass Ihre Syntax hervorgehoben und automatisch vervollständigt wird, haben Sie diese Erweiterung installiert. Wir können hier CSS in Back-Ticks schreiben. Styled-Component verwendet das Button-Element und verwendet im Grunde nur und verwendet im Grunde nur dieses native HTML-Button-Element und wendet die hier geschriebenen Stile darauf an. Am Ende wird die Button-Komponente erzeugt, die wir in unserem Markup verwenden können. Lass uns weitermachen und es versuchen. Im Markup verwende ich die Komponente im Button-Stil die erstellt wurde, und sage hier Hallo. Ich speichere es. Ich gehe zurück zu meiner App und was haben wir hier? Wenn wir in das Markup schauen, haben wir hier diesen hübschen Button mit diesem eindeutigen Klassennamen. Alle Stile wurden zusammengeführt und lassen Sie uns aufschlüsseln, was wir hier haben. Zuallererst rendert diese Button-Komponente das HTML-Button-Element genau das, was wir hier als Basiselement für die Anwendung von Stilen angegeben haben , was bedeutet, dass diese Button-Komponente hier im Grunde ein natives HTML-Button-Element rendert, was bedeutet, dass wir alle Requisiten, die dieses Styled.something hat, direkt an diese Komponente übergeben können. Wenn das Button-Element ein Attribut namens type hat, können wir hier type übergeben. Wenn ich es speichere, wirst du sehen, dass es reflektiert wird. Ich habe jetzt Type Button, genau das Gleiche, was Sie mit allen regulären, sagen wir nativen HTML-Attributen für das Button-Element machen sagen wir nativen HTML-Attributen , wenn Sie möchten, dass es so etwas wie beim Klicken übergibt, oder wenn Sie so etwas wie Datenattribute, ein benutzerdefiniertes Attribut, übergeben ein benutzerdefiniertes Attribut, würden Sie das tun, dann wird es funktionieren. Cool. Jetzt haben wir diesen eindeutigen Klassennamen hier. Was ist das und warum sieht es so seltsam aus? Die Sache ist , dass diese Kacheln , die Sie hier speziell für dieses Element schreiben , nur auf dieses Element beschränkt sind, was bedeutet, dass diese Stile einzigartig sind. Dieser Klassenname ist eindeutig und wurde automatisch von Styled-Components generiert. Gestylte Komponenten garantieren die Einzigartigkeit der Klassen, die Sie für dieses Element schreiben. Wenn ich eine andere Style-Komponente erstelle, die genauso aussieht, aber einen anderen Namen hat, spielt das keine Rolle. Es kann, sagen wir, alles sein, und dann verwende ich diese Anything-Komponente neben dieser Button-Komponente, sie haben genau die gleichen Stile. Sie sehen visuell gleich aus. Aber wenn man ihre Klassennamen vergleicht, sind sie unterschiedlich. Was die gestylten Komponenten getan haben, war, dass auf der Grundlage dieser Stile ein eindeutiger Klassenname generiert wurde. Auch hier erstellt styled-components lokal begrenzte, einzigartige Stile, speziell für das Element. Macht Sinn? Ich glaube, das tut es. Wir haben hier auch dynamisches Styling für uns zur Verfügung. Wenn wir zur Dokumentation zurückkehren und nach unten scrollen, finden wir hier ein weiteres Beispiel, finden wir hier ein weiteres Beispiel, erweitertes Beispiel mit Zeichenketteninterpolation. Lassen Sie uns diese Zeichenketteninterpolation kopieren. Kommen wir zurück zu unserer Schaltfläche, und hier verwende ich einfach diese Zeichenketteninterpolation. Ich muss auch den CSS-benannten Export aus gestylten Komponenten importieren . Wenn wir jetzt zur App zurückkehren, wird nichts geändert. Aber was genau macht diese Zeichenketteninterpolation? Zuallererst können wir hier die String-Interpolation verwenden, weil wir hier CSS innerhalb von Backticks schreiben. Innerhalb von Backticks können wir JavaScript interpolieren, indem wir $ und geschweifte Klammern verwenden. Hier übergeben wir eine Funktion , die dieses CSS zurückgibt, sagen wir, ein weiteres CSS-Markup hier. Was ist los? Hier verwenden wir etwas, das als Requisitenargument bezeichnet wird. Dieses Argument wird ein Objekt sein, das die Primärschlüsseleigenschaft hat , aber nichts ändert sich. Diese Requisiten beziehen sich hier auf die Requisiten, die wir tatsächlich an die Komponente übergeben. Wenn ich hier primary übergebe, wird es eine benutzerdefinierte Requisite an diese Button-Komponente sein, was bedeutet, dass sie hier unter diesem Requisitenobjekt verfügbar ist. Wenn ich zur App zurückkehre, werden Sie sehen, wie sich diese Stile geändert haben. Wenn ich mir das Markup ansehe, sind das die Stile, die angewendet wurden, als wir das primäre Requisit übergeben haben. Sie überschreiben unsere Basisstile. Um es klarer zu machen, erstellen wir eine weitere Schaltfläche mit dem Namen Hello, aber ohne das primäre Attribut zu übergeben, ohne die primäre Requisite zu übergeben. Sie können jetzt sehen, dass diese unterschiedlich sind. Sie haben hier dieselbe Basisklasse, eindeutig generiert wurde, aber die zweite Klasse ist einzigartig. Auf diese Weise können wir dynamische Stile mithilfe von gestylten Komponenten anwenden . Du kannst hier im Grunde jede Requisite weitergeben. Es kann alles sein, was nicht primär ist. Nehmen wir an, es kann wie die Schriftgröße sein und Sie können angeben, wie viele Pixel Sie möchten, z. B. 20. Dann können Sie innerhalb der Zeichenketteninterpolation mithilfe dieser Funktion mithilfe dieser Funktion CSS basierend auf den Requisiten zurückgeben , die Sie an die Komponente übergeben. Nehmen wir zum Beispiel an, wir möchten die Schriftgröße für jede Schaltfläche dynamisch angeben, wir würden erneut eine Zeichenketteninterpolation innerhalb dieser Stilkomponente aufrufen eine Zeichenketteninterpolation innerhalb dieser Stilkomponente und hier würden wir einfach übergeben. Wenn wir die Schriftgröße übergeben, geben Sie bitte CSS an, Sie bitte CSS an, das die Schriftgrößeneigenschaft gegen die Verkleinerung der Interpolation props.fontsize Pixel hat , die wir übergeben. Wir interpolieren JavaScript im Grunde in CSS-Markup. Wenn wir nun hierher zurückkehren und das Element untersuchen, haben wir hier eine Schriftgröße von 20 Pixeln. Mir ist gerade aufgefallen, dass dieses Schriftgrößenattribut auch dieses Schriftgrößenattribut an das Button-Element angehängt ist. Dies ist möglicherweise nicht erforderlich und das ist möglicherweise überhaupt nicht gewünscht. Ich denke, wenn wir etwas Zufälliges an Startkomponenten übergeben und es hier nur als Argument als Teil dieses Requisitenobjekts zur Verfügung stellen wollen es hier nur als Argument als Teil dieses Requisitenobjekts zur Verfügung stellen , wollen wir ihm das $ voranstellen , damit die gestylten Komponenten verstehen, dass, sagen wir, bitte nicht interpolieren. Übergeben Sie diese Schriftgröße nicht als das tatsächliche Attribut des zugrunde liegenden Elements. Machen Sie es nur innerhalb dieser Zeichenketteninterpolation verfügbar , wenn wir Stile anwenden. Jetzt würden wir uns hier auf die Schriftgröße der Requisiten beziehen, auf die Schriftgröße mit dem Präfix $, wenn ich mich nicht irre. Ja, im Moment können Sie sehen, dass wir immer noch die Stile haben und es funktioniert immer noch. Auf diese Weise können wir dynamische Stile anwenden. Wenn wir hier zur Dokumentation zurückkehren, finden wir ein weiteres Beispiel für gestylte Komponenten. Wir erstellen eine weitere stilisierte Komponente namens Container. Lass uns weitermachen und das oben machen. Ich werde dieses Mal den Stil, das Div, erstellen , die Komponente am Ende, die wir haben werden, wird Container sein. Jetzt können wir unsere Schaltflächen in die Container-Komponente einwickeln. Wenn wir uns das noch einmal ansehen, werden Sie einen eindeutigen Klassennamen sehen, der diese Komponente, die die entsprechenden Stile hat, spezifisch identifiziert . Ich würde sagen, das ist ein gutes Intro für Stilkomponenten. Sie können sehen, dass es sehr einfach ist, die Anwendung mit diesem Ansatz zu stylen die Anwendung mit diesem Ansatz , da hier alles eine Komponente ist. Es mag, sagen wir, verwirrend sein, zwischen regulären Komponenten und installierten Komponenten zu unterscheiden, aber das sind die Nachteile. Sie müssen das goldene Mittel finden, wo Sie Ihre Styles haben möchten oder wo Sie Ihre regulären Komponenten haben möchten. Stilkomponenten sind jedoch eine sehr beliebte Lösung. Ich würde sagen. Eine Sache, die es auch bietet, ist ein sogenanntes globales Thema oder globale Konfiguration. Wenn wir zu den Dokumenten für stilisierte Komponenten zurückkehren und in der oberen rechten Ecke nach einem Thema suchen, können wir diese Referenz für den Themenanbieter finden, und die Referenz zum Themenanbieter werden wir jetzt ausprobieren. Lassen Sie uns den Themenanbieter aus den gestylten Komponenten hier oben importieren . diesem Beispiel folgen, übergeben wir dann die Theme-Requisite an die Theme-Provider-Komponente. Das Thema, das wir hier übergeben müssen, muss ein Objekt sein. Definieren wir es irgendwo oben. Wir werden es Thema nennen. Es wird nur ein Objekt sein und dieses Objekt, was auch immer Sie hier angeben, wird innerhalb der Zeichenketteninterpolation in jeder gestylten Komponente verfügbar sein. Das bedeutet, dass Sie hier jede globale Konfiguration definieren können , die Sie in gestylten Komponenten verwenden möchten . Es können Farben sein, es können, sagen wir, Schriftgrößen sein , es kann eine Schriftfamilie sein, an der Kinokasse. Wenn wir die App stylen, verwenden wir zum Beispiel Farben und Schriftfamilien, hier können wir Farben angeben. Nehmen wir an, das Hauptteil wird nur rot sein. Dann übergeben wir das Theme-Objekt hier an den Theme-Anbieter. Nun, innerhalb der Interpolation, wo immer Sie den globalen Themenkonflikt verwenden möchten , den Sie hier haben, schreiben Sie einfach Farbe, um die Interpolation erneut zu öffnen. Wir übergeben eine Funktion, die ein String-CSS-Markup zurückgeben muss. Es werden, sagen wir, Requisiten sein. props.theme und props.theme werden hier auf dieses Objekt verweisen. props.theme.colors.main. Wenn wir jetzt zur App zurückkehren und sehen, wird die Farbe rot sein. Anstatt jetzt überall in jeder gestylten Komponente Rot zu schreiben , würden Sie einfach auf props.theme.colors.main verweisen. Anstatt diese Farbe an allen Stellen zu ändern, haben Sie dann eine einzige Stelle , an der diese Farbe definiert ist. Zum Beispiel habe ich jetzt beschlossen, meine Hauptfarbe von Rot auf Blau zu ändern. Ich würde hier einfach Blau eingeben und das wird sich in allen Komponenten widerspiegeln , in denen auf prompts.theme colors main verwiesen wird. Wir werden diesen Ansatz verfolgen, um, sagen wir, eine globale Konfiguration an der Kinokasse zu erstellen . Nun, dies war eine Einführung in gestylte Komponenten. Lassen Sie uns nun vergleichen, was genau es uns bietet und was genau die Nachteile sind und was der Unterschied zwischen beispielsweise der Verwendung von Zellkomponenten und einer herkömmlichen Art der Verwendung von CSS ist. Ich öffne Paint. Auf der linken Seite haben wir etwas, das statisches CSS genannt wird , und in der rechten Ecke haben wir etwas namens Laufzeit-CSS. Gestylte Komponenten sind Teil von Laufzeit-CSS, aber wir beginnen mit der ersten statischen Komponente. Was ist statisches CSS? , schreiben wir es auf traditionelle Weise Wenn wir CSS schreiben, schreiben wir es auf traditionelle Weise in CSS-Dateien, und dann werden die CSS-Dateien in die App importiert. Wenn wir uns zum Beispiel GitHub ansehen, verwenden sie statisches CSS, um ihre Website zu gestalten. Was ich damit meine, wenn wir in ihr Markup, in den Hashtag schauen , laden sie CSS-Dateien, und wenn wir einen dieser Styles öffnen, einen der CSS, lassen Sie uns vielleicht einen anderen öffnen. Es gibt einen globalen. Es hat diese Klassennamen wie Color Border Inverse, vielleicht so etwas wie BG Gray. Sie importieren statische CSS-Dateien , die zum Zeitpunkt der Erstellung definiert wurden, und verwenden dann die Klassennamen, die aus diesen CSS-Dateien stammen , innerhalb des Markups. Öffnen wir das Bodytag. Hier sehen Sie regelmäßige, verständliche, umfassende Klassennamen. Aber wenn wir in gestylte Komponenten schauen, ist das etwas anders. Statische Klassennamen, unabhängig davon, was zum Zeitpunkt der Erstellung definiert ist. Wenn wir dynamische Klassennamen anwenden möchten oder wenn wir dynamische Stile mit statischen CSS-Klassennamen anwenden möchten , gehen Sie mit statischem CSS vor. Nehmen wir an, wir haben hier eine Schaltfläche, die primär sein kann, wir würden, sagen wir, mit einer regulären CSS-Punkt-Button-Klasse erstellen, dann würden wir eine primäre Punktklasse erstellen, und wenn wir diese Schaltfläche dann stylen, werden wir einfach die Klassennamen umschalten. Nehmen wir an, es wäre standardmäßig ein Button-Element, das Sie hier haben würden, z. B. Button-Klasse, und wenn Sie dann auf etwas klicken, hat diese Schaltfläche einen zusätzlichen Klassennamen namens primary. Auf diese Weise können Sie statische Klassennamen und statische CSS-Stile verwenden, um dynamische Klassennamen speziell für Elemente zu erstellen . Bei Styled-Components oder mit Laufzeit-CSS ist das anders. CSS ist, sagen wir, in Defly eingebaut. Was ich damit meine. Wenn wir hier in unsere App schauen, haben wir im Hashtag keine CSS-Dateien verbunden. Die Frage ist, woher genau diese Stile kommen? Sie kommen von. Lass mich sehen. Wenn wir den Hut öffnen. Hier haben wir das Style-Tag. Die Sache ist Laufzeit-CSS, was es macht, die Komponenten im Bibliotheksstil injizieren Stile dynamisch in die Seite, indem sie das Style-Tag verwenden. Wenn wir Styled-Components , Markup, offizielle Dokumentation öffnen , haben sie diese, lassen Sie mich sehen, sie haben genau das gleiche Style-Tag hier, wo diese Styles eingefügt werden. Das ist leer, ich bin mir nicht sicher warum. Schauen wir uns das an, das ist eine globale Verschmelzung. Dies sind keine dynamischen Stile. All diese Stile, die Sie hier sehen sind in das Style-Tag integriert. Es ist leer hier. Lassen Sie mich es mit der Seitenquelle versuchen. Hier ist es nicht leer. All diese Stile hier sind hier in die Style-Technologie integriert. Die Sache ist, dass diese Dateien auf Defly injiziert werden. Sie wurden zum Zeitpunkt der Erstellung nicht definiert. Das heißt, als ich auf diese Seite zugreife , war das Style-Tag zuerst leer. Aber wenn ich tatsächlich auf diese Seite gehe, waren die gestylten Komponenten, die Teile, welches JavaScript auch immer, gestylten Komponenten, die Teile, welches JavaScript auch immer, genau hier in Backticks. Dann dauert es einige Zeit, das zu verarbeiten, zu analysieren, was wir hier schreiben, dann erstellt es dieses CSS-Markup und dann fügt es dieses CSS-Markup hier in das Style-Tag ein. Auf diese Weise werden Stile zur Laufzeit, während Benutzerinteraktionen, eingefügt . Das Besondere an diesem Ansatz ist, dass beim Wechseln zwischen Seiten nur die Stile eingefügt werden, die für die Anzeige des Inhalts auf dieser bestimmten Seite erforderlich sind . Das bedeutet, dass nur Stile geladen die für den aktuellen Inhalt benötigt werden. Es werden niemals Stile eingefügt, die für diese bestimmte Seite nicht erforderlich sind . Im Gegensatz zu herkömmlichen Apps importieren Sie hier diese große, große CSS-Datei, sie hat viele verschiedene Klassennamen, aber sie werden möglicherweise nicht auf der Seite verwendet. Gestylte Komponenten injizieren Styles zunächst dynamisch zur Laufzeit und wenn, injizieren Styles zunächst dynamisch zur Laufzeit sagen wir, etwas ist dynamisch, wir haben zum Beispiel die Probe hier geändert Diese Styles werden ebenfalls dynamisch eingefügt und zu den Style-Tags hinzugefügt, sodass sie auf der Seite verfügbar werden. Bei herkömmlichen Apps ist das nicht richtig. Alles muss Voraus vordefiniert und über CSS-Dateien geladen werden. Das Problem mit dieser CSS-NGS-Lösung, insbesondere mit Runtime-JavaScript, ist, dass sie Zeit in Anspruch nimmt. Es dauert einige Zeit, dieses JavaScript zu analysieren, um es in CSS zu übersetzen und es in die Seite einzufügen. Es ist Datenverarbeitung, es braucht Zeit. Das bedeutet, dass, wenn Sie einen sehr großen, sagen wir Elementbaum auf der Seite haben sagen wir Elementbaum auf , der eine stilisierte Komponente ist, dies irgendwann zu einem Engpass werden kann , da das JavaScript Zeit braucht, um es zu verarbeiten. Wenn Sie Millionen von Hunderten von Komponenten auf der Seite haben , kann es eine Sekunde oder ein paar Sekunden dauern , bis die Stile in die Seite eingefügt werden. In den meisten Apps ist dies jedoch nicht der Fall. Aber Sie sollten diese Option wirklich in Betracht ziehen müssen, wenn Sie an größeren Apps arbeiten und derjenige sind, der Entscheidungen trifft. Aber auch hier bin ich die meiste Zeit nicht hier, um dich zu erschrecken. den meisten Fällen ist das völlig in Ordnung und Endbenutzer werden den Unterschied nicht einmal sehen. Für die Kinokasse werden wir gestylte Komponenten verwenden. Wir werden diese Option ausprobieren. Der Vorteil von gestylten Komponenten besteht darin, dass wir mit ihnen auf einfache Weise die globale Konfiguration zunächst mit JavaScript definieren können. Wir erstellen das Theme-Objekt und es stellt alles durch die Interpolation innerhalb der Style-Komponenten bereit. Der zweite Vorteil ist , dass wir dynamische Klassennamen einfach anwenden können , indem wiederum dieselbe Zeichenketteninterpolation verwenden, und drittens ist alles JavaScript. Sie müssen überhaupt keine CSS-Dateien erstellen. Alles ist hier direkt geschrieben. Der Nachteil ist, dass es zunächst einmal , weil dies JavaScript ist Rechenzeit benötigt, weil dies JavaScript ist. Auch hier kann es bei sehr großen Apps zu einem Engpass kommen. In kleineren Apps wird dies überhaupt nicht sichtbar sein. Zweiter Nachteil: Es könnte verwirrend sein, da jetzt alles eine Komponente ist und es leicht ist, zwischen regulären Komponenten und gestylten Komponenten zu verwechseln . Ich denke, das ist es. Moment werden wir nur alle Änderungen entfernen , die wir in Home GS6 vorgenommen haben. Ich werde die Installation der gestylten Komponenten beibehalten und dann werden wir im nächsten Video endlich die gesamte Anwendung mithilfe von gestylten Komponenten stylen . Wir sehen uns dort. 85. 29 Styling der App p1: Hallöchen. In diesem Video werden wir weiter über Stile sprechen. In diesem Video werden wir unsere Bewerbung stylen, nicht vollständig, aber wir werden den Hauptteil davon machen. Lass uns gehen. Im vorherigen Video habe ich Styled-Components bereits installiert, ich führe einfach npm install styled-components aus, ich kann diesen Befehl erneut ausführen, nur Fälle, um sicherzustellen, dass das Paket definitiv installiert ist. Gleich danach starte ich den lokalen Entwicklungsserver und lassen Sie uns sehen, wo genau wir mit dem Styling unserer Anwendung beginnen werden. Die Stile, die ich in diesem Video verwenden werde, werden Ihnen über den Gast mitgeteilt , zu dem Sie bereits Zugriff haben. Fangen wir von hier an. Zunächst werden wir die Google-Schrift, insbesondere Roboto, mit unserer Anwendung verbinden insbesondere Roboto, mit unserer Anwendung und möglicherweise den Titel ändern. Denn im Moment ist es nur die React-App. Ich gehe einfach hierher, stylingPart1.md und kopiere den Index-HTML , den ich hier habe. Dann navigiere ich zu index.HTML. Hier verbinde ich anstelle des Titels diese Schrift, lade dieses Stylesheet und ändere den Titel auf Box Office. Jetzt wird es unter Box Office erscheinen. Meine App erscheint an der Box Office und ich habe diese Schrift Roboto hier angeschlossen. Fantastisch. Aus dem vorherigen Video erinnern Sie sich, dass ich über das Thema Styled Components gesprochen habe Thema Styled Components Wir haben den Theme Provider verwendet. Lassen Sie uns weitermachen und dieses Thema erstellen. Wenn ich zurück zu Gast navigiere, habe ich dieses Objekt hier. Dieses Objekt hier wird unsere globale Themenkonfiguration sein . Nur ein paar Farben plus die globale Schrift, die wir verwenden werden, das Roboto, das wir gerade in Index-HTML eingebunden haben. Ich nehme das Themenobjekt, ich gehe zur App JS6, lass mich sehen. Hier füge ich dieses Themenobjekt hinzu, und jetzt muss ich den Themenanbieter verwenden und dieses Themenobjekt an die zugrunde liegenden Komponenten übergeben. Lassen Sie uns zunächst das Markup hier loswerden, wir brauchen es nicht mehr, es wurde auskommentiert. Dann werde ich aus den gestylten Komponenten den Themenanbieter importieren. Hier unten den Client-Anbieter abfragen oder darüber hinaus. Es ist nicht wirklich wichtig, ich rufe den Themenanbieter an, ich werde meinen Browser-Router in den Theme-Anbieter packen und als Theme-Objekt übergebe ich das Theme-Objekt, das wir hier haben, dass wir es vom Gast kopiert haben. Jetzt können Sie sehen, dass diese neue Ausgabe tatsächlich war, sagen wir, mit diesem neuen Theme-Objekt wurde unsere App j6 etwas verschmutzt. Was wir in diesem Fall tun können, wir können vielleicht teilweise oszillieren oder die Logik, die wir bisher hier geschrieben haben, in einer separaten Datei extrahieren . Zum Beispiel können wir diesen Theme-Anbieter und das Theme-Objekt irgendwie in eine separate Datei extrahieren diesen Theme-Anbieter und das Theme-Objekt irgendwie in und von dort aus alles verwalten. Damit meine ich, dass wir im Quellordner eine neue Datei namens theme.jsx erstellen können. Jetzt können wir hier das Themenobjekt verschieben und hier können wir unsere eigene Komponente erstellen, die vielleicht so etwas wie globales Thema genannt wird. Lassen Sie uns versuchen, das zu erstellen, const, globalTheme. Dieses GlobalTheme werden wir innerhalb von Appjsx anstelle des Theme-Anbieters verwenden . Wir müssen den Themenanbieter nicht aus stilisierten Komponenten importieren, das Theme-Objekt hier drinnen verwalten und dann den Theme-Anbieter verwenden, um das Team-Objekt zu übergeben Wir können die gesamte Logik in Theme jsx extrahieren alles von hier aus verwalten. Dafür können wir nur eine Komponente namens Global Theme erstellen , und wir können den Browser-Router nicht einfach so in eine globale Themenkomponente einwickeln . Das werden wir aus Denmark jsx importieren . Lass mich das machen. Ich importiere einfach aus dem globalen Thema. Dieses GlobalTheme muss exportiert werden nach, ich nenne export const, GlobalTheme. Jetzt sieht es viel sauberer aus. Dieses GlobalTheme muss all seine Kinder, die ihm übergeben werden, ausliefern. Das bedeutet, dass ich innerhalb der GlobalTheme-Komponente die untergeordneten Requisiten destrukturieren und von dieser Komponente aus werde und von dieser Komponente aus einfach den Theme-Anbieter zurückgebe , der aus gestylten Komponenten importiert wurde, und alte Kinder werden hineingehen. Für die Theme-Requisite werde ich das Theme-Objekt hier übergeben. Jetzt haben wir das Thema erstellt, wir haben die Logik in Theme jsx verwaltet, aber wir müssen auch einige globale Stile anwenden. Moment haben wir einige globale Stile hier im Index-CSS definiert , aber für unsere Stillösung verwenden wir gestylte Komponenten. Wir können tatsächlich stilisierte Komponenten verwenden , um ein globales Thema zu erstellen, das, sagen wir, irgendwie nicht auf eine bestimmte Komponente beschränkt ist. Also einige Stile, die durch stilisierte Komponenten definiert werden, die global verfügbar sind. Anstatt Index-CSS zu verwenden, können wir diese Datei tatsächlich löschen. Innerhalb von index jsx können wir jetzt den Verweis auf ein vorhandenes Index-CSS entfernen . Jetzt müssen wir irgendwie globale Stile kreieren. In der Styled-Komponente haben wir eine Sache namens Create Global Style. Wir können in der Dokumentation danach suchen. Lass mich sehen. Globaler Stil erstellen, APA-Referenz, globalen Stil erstellen, nur im Internet. Es ist nur eine Funktion , die Sie aufrufen. Auch hier Backticks, Sie schreiben globale Styles, globales CSS und verwenden es dann einfach als Komponente. Im Grunde dasselbe wie die Verwendung von regulären Stilkomponenten, aber dieses Mal wird es nicht auf bestimmte Komponenten beschränkt sein. Die Stile werden global angewendet. Wir werden Create Global Styles hier nennen, aber wir haben diesen Ruf als internen Gast, der mit uns geteilt wird. Also können wir es einfach von hier aus nehmen, lassen Sie es uns kopieren und einfügen. Ich rufe einfach create global style auf, der aus gestylten Komponenten importiert wurde , und spezifiziere dann einige globale Stile, speziell hier für Budget Deck. Was ich hier mache, verwende ich die String-Interpolation, um das Theme-Objekt zu interpolieren und die hier definierte Schriftfamilie zu nutzen. Sie erinnern sich, weil wir hier Backtest verwenden, dürfen wir die Zeichenketteninterpolation verwenden. Wir müssen eine Funktion übergeben, die etwas CSS zurückgibt , das hier direkt interpoliert wird. Im vorherigen Video habe ich Requisiten verwendet, genau dann habe ich props.theme gemacht. Da das erste Argument jedoch ein Objekt ist , das den Themenschlüssel enthält, können wir den Themenschlüssel direkt innerhalb von Argumenten destrukturieren . Das ist völlig optional. Dies dient nur dazu, sagen wir, diese Syntax zu vereinfachen und zu verkürzen. Ich werde das Thema von hier aus einfach destrukturieren und die Theme-Schriftfamilie verwenden. Auch hier bezieht sich das Theme-Objekt auf das Objekt, das wir hier definiert haben , und dann übergeben wir es an den Theme-Anbieter. diesem Grund ist es in unserer Definition für gestylte Komponenten verfügbar . Dann verwenden wir einfach diese globalen Stile in unserem Markup, wie eine unregelmäßige Komponente. Jetzt wird das alles auf magische Weise verfügbar. Wenn wir noch einmal zu unserer App gehen und nach dem Body-Tag suchen, lassen Sie mich es finden, können Sie sehen, dass die Stile angewendet wurden. Wir haben die Schriftfamilie Roboto sans-serif, genau wie wir sie im Theme und dem Rest des CSS definiert haben, das wir hier platziert haben. Großartig. Nun, was wird unser nächster Schritt sein? Ich denke, wir werden zuerst mit der Navigation beginnen , weil wir eine kleine Sache haben, die wir besprechen müssen. Was ich mit dieser kleinen Sache meine, wenn wir zwischen den Seiten navigieren, möchten wir angeben, welche Seite gerade aktiv ist. Wenn ich zum Beispiel auf der Homepage bin, möchte ich dem Benutzer zeigen , dass dieser Link aktiv ist. Wenn ich zum Start navigiere, möchte ich angeben, dass der Startlink gerade aktiv ist. Wie kann ich das machen? Wenn wir zu den Komponenten zurückkehren, nav.sjsx, hier haben wir dieses einfache Markup, wir ordnen unser Links-Array einfach dem LI-Element mit der Link-Komponente zu , die aus React-Router-dom importiert wird. Wie können wir irgendwie überprüfen, ob dieser Link, den wir hier rendern, aktiv ist. Aber dieser React-Router hat eine bestimmte Komponente, und wenn wir in der Dokumentation nach Komponenten für NavLink suchen , können wir der Beschreibung entnehmen, dass ein NavLink eine spezielle Art von Link ist , der weiß, ob er aktiv ist oder nicht. Wenn wir weiter lesen, heißt es, dass standardmäßig eine aktive Klasse zu einer NavLink-Komponente hinzugefügt wird, wenn sie aktiv ist. Kurz gesagt, anstatt einen Link zu verwenden, können wir eine Komponente namens NavLink verwenden, und wenn sie aktiv ist wird die aktive Klasse standardmäßig an diesen Link angehängt. Lass es uns versuchen und sehen. Ich habe den Link durch Navlink von React-Router-DOM ersetzt, ich gehe zurück zu meiner App, ich überprüfe das Markup. Ich schaue mir den Tag [inaudible] hier an, und Sie können sehen, dass ich gerade auf der Startseite bin und sehe, dass dem Link plus active hinzugefügt wurde. Wenn ich zur Startseite navigiere, wird Now plus active an Home angehängt. Einfach so gab uns der React-Router die Möglichkeit, unseren aktiven Link zu stylen , indem wir einfach den Link durch den Navlink ersetzen. So einfach ist das. Sie können mehr lesen, wie anpassbar dieser NavLink sein kann, vielleicht aufgrund einiger Bedingungen, aber in unserem Fall möchte er irgendwie geändert werden, die Schnittstelle, zum Beispiel, wenn wir uns die Dokumentation ansehen, können wir dieses Style-Tag verwenden, das kann eine Funktion sein, die diesen aktiven Schlüssel vom ersten Argument erhält . Damit werden wir nicht weiter gehen, wir gehen einfach zurück zu unserem Gast hier und ich habe die Styles schon für uns vorbereitet. Lassen Sie mich erklären , was wir hier haben. Zunächst kopieren wir diese Komponente im Nav-Listenstil und platzieren sie irgendwo unten. Zuallererst müssen wir den Stil importieren. Oben rufen wir den Importstil aus gestylten Komponenten auf. Hier erstellen wir ein einfaches UL-Element, dieses mit Stilen. Jetzt ersetzen wir UL einfach durch Novelist, und alles, was im Markup enthalten ist , wird gestylt. Auch hier erstellen wir Stile, die ein geordnetes Listenelement mit Stilen markieren, und dann geben wir auch an, dass jedes LI-Element darin einen Rand mit 10 Pixeln hat. Lass es uns versuchen und sehen. Wir kehren zur App zurück, Sie können sehen, dass das Layout geändert wurde. Wenn wir uns die L-Klasse wie zuvor ansehen, haben wir eine eindeutig generierte Klasse speziell für dieses Nav-Listenelement, speziell für dieses UL-Element, wir können die Stile sehen. Wenn wir das LI-Element untersuchen, hat es auch Stile. Toll, es hat funktioniert. Aber was ist jetzt mit den Links? Weil wir keine NavLink-Komponente angefasst haben. Wenn wir hier zum Gast zurückkehren, haben wir hier auch einen Link gestylt. Lassen Sie mich es kopieren und ich werde erklären, was wir haben. Gestylte Komponenten sind, sagen wir, vielseitig genug, dass wir damit keine einfachen, sagen wir nativen HTML-Elemente stylen können . Es ermöglicht uns, auch andere Komponenten zu stylen. Hier rufe ich styled als Funktion auf und übergebe die darin enthaltene NavLink-Komponente als Argument. Auf diese Weise erweitern wir die NavLink-Komponente mit diesen Stilen, die wir hier haben. Auf diese Weise wird dieser Link-Stil am Ende nur eine NavLink-Komponente sein, aber mit diesem CSS-Stylesheet das so einfach. Anstatt NavLink hier zu verwenden, kann ich getrost den Link-Stil verwenden , oder vielleicht können wir ihn sogar NavLink-Stil nennen, wenn Sie möchten Lassen Sie uns den Link-Stil beibehalten. Was wir drinnen machen, wir geben einfach wieder die Farbe aus dem Designobjekt an und dann haben wir hier den Ampersand, und dann haben wir.active, was bedeutet, wenn dieses Element, also dieses Ampersand sich auf sich selbst bezieht, was bedeutet, dass sich Ampersand hier auf die NavLink-Komponente selbst bezieht , und dann, wenn diese Komponente, wenn dieses Element, wenn dieser NavLink die aktive Klasse hat, Wir haben angegeben, dass es dieses und dann das andere Markup eingefärbt hat, um den gewünschten Effekt zu erzielen. Lass es uns versuchen und sehen. Was haben wir? Wir gehen zurück und Sie sehen jetzt haben wir diese schöne Navigation. Wenn wir navigieren, wird jetzt die Seite angezeigt, die gerade aktiv ist. Toll, lass uns weitermachen. Wenn wir hier zum Gast zurückkehren, haben wir hier noch einen Moment , der Custom Radio heißt. wir für diese Radiobuttons, die wir hier haben Nehmen wir für diese Radiobuttons, die wir hier haben, an, wir erstellen benutzerdefinierte Optionsfelder. Wenn es darum geht, Eingaben wie Checkboxen oder benutzerdefinierte Radios zu gestalten, ist das ein bisschen umständlich, aber nicht wirklich kompliziert. Wenn wir zu der Suchformularkomponente gehen, die wir hier haben, sehen wir, dass wir zwei Bezeichnungen haben. In jedem Etikett befindet sich ein Eingang vom Typ Radio. Wenn wir ein benutzerdefiniertes Funkelement erstellen müssen , das vollständig gestaltet werden soll, müssen wir einen etwas anderen Ansatz wählen, um es, sagen wir, wiederverwendbar zu machen. Damit meine ich, dass ich vorschlage, eine Komponente zu erstellen, die wir Custom Radio nennen. Unter Komponenten erstelle ich eine neue Datei namens Custom radio.jsx, also erstelle ich hier ein benutzerdefiniertes Radio. Hier wird es vorerst nur ein Etikett sein. Ich lege es zur Seite und lass uns sehen, was wir haben. Wir haben ein Etikett und darin haben wir Text, und dann haben wir eine Eingabe. Also können wir das Markup einfach hier kopieren und es in ein benutzerdefiniertes Radio einfügen. Was wollen wir nun tun und welche Schnittstelle wollen wir diesem benutzerdefinierten Funkelement geben? Lassen Sie uns einfach abschätzen, wie genau wir es verwenden möchten. Moment erstellen wir also ein Label und geben stattdessen die Eingabe weiter. Ab sofort wird es eine Komponente namens Custom Radio sein . Wir rufen Custom Radio auf, und an dieses benutzerdefinierte Radio möchten wir idealerweise alle Requisiten übergeben, alle Attribute, die wir an das Eingabeelement vom Typ Radio übergeben . Also werde ich das alles einfach kopieren, vielleicht ohne Typ Radio, weil es dieser Komponente bereits um Radio geht. Wir werden den Namen und die Werteprüfung unverändert bestehen. Aber was ist mit dem Etikett? Was sind unsere Optionen? erste Option ist, dass wir dieses Label vielleicht als Kinder weitergeben können , zum Beispiel so. Dies könnte eine Option sein, aber stattdessen bevorzuge ich es, es als Attribut zu übergeben. Also werden wir sagen, definiere ein weiteres Attribut, eine weitere Requisite, die wir Label nennen werden, und wir werden hier Shows geben. Anstatt Kinder zu verwenden, wird es sich um eine selbstschließende Komponente mit einer zusätzlichen Requisite namens Label handeln. Nun, wie können wir das alles innerhalb von Custom Radio handhaben? Zunächst spezifizieren wir hier Requisiten und anhand der Requisiten werden wir destrukturieren. Zuallererst nehmen wir das Label-Attribut, das beschriftete Requisiten, die wir übergeben werden, dann innerhalb des Markups, wir werden dieses Label interpolieren, und jetzt ist unser Ziel, all diese Requisiten zu nehmen, den Rest der Requisiten, die wir übergeben, egal was diese Requisiten sind, wir wissen, dass sie alle irgendwie zum Eingabeelement hier umgeleitet werden . Die Frage ist also, wie können wir das machen? Wir werden nicht alle Requisiten nacheinander zerstören , oder? Das wollen wir nicht tun. Wir wissen, dass wir das Label nehmen und der Rest wird definitiv in das Eingabeelement gehen. In React gelten dieselben Regeln, da das Requisitenobjekt immer noch nur ein JavaScript-Objekt ist das Requisitenobjekt immer noch nur ein JavaScript-Objekt ist. Wir können diese Strukturierung verwenden, wir können den Spread-Operator verwenden, wir können den Rest-Operator verwenden. All diese Regeln gelten also. Ich schlage vor, dass wir den Spread-Operator tatsächlich verwenden können . Wir können hier drei Punkte aufrufen und Eingabe-Requisiten angeben. diese Syntax hier verwende, kann ich sie hier vielleicht direkt einbetten. Also nehmen wir hier nur die Label-Requisite, und was auch immer wir übergeben, der Rest der Requisiten ist unter dem Eingabe-Requisitenobjekt verfügbar . Jetzt können wir das Eingabe-Requisitenobjekt nehmen und all diese Requisiten, die wir übergeben, verteilen, indem wir einfach so den Spread-Operator verwenden. Zunächst verwenden wir den Rest-Operator, um beispielsweise alle Requisiten, die wir an das benutzerdefinierte Radio übergeben, zu akkumulieren Alle Requisiten werden unter Eingabe-Requisiten, Objekt verfügbar, und dann verteilen wir alle Requisiten, alle Schlüssel innerhalb der Eingabe-Requisiten, als Requisiten, als Attribute für das Eingabeelement. Jetzt werden wir vom benutzerdefinierten Radio standardmäßig das benutzerdefinierte Radio exportieren, und jetzt müssen wir das alles irgendwie stylen. Gehen wir also zurück zum Gast hier, haben wir Radio gestylt. Lass uns das alles kopieren und dann unten platzieren. Jetzt müssen wir zuerst gestylte aus gestylten Komponenten importieren. Hier erstellen wir ein gestyltes Punktelabel, und ich nenne die zurückkehrende Komponente als gestyltes Radio. Anstelle des Labels können wir einfach das gestylte Radio verwenden, und jetzt wird alles wie von Zauberhand funktionieren. Das ganze CSS-Markup besteht also nur darin, ein benutzerdefiniertes Optionsfeld zu erstellen vollständig mit dem Thema, das wir haben, und den Farben, die wir in diesem Thema definieren, gestaltet ist. Jetzt speichern wir es. Außerdem müssen wir hier ein zusätzliches Markup hinzufügen, nur ein leeres Span-Element. Einfach so. Es wird innerhalb des Markups verwendet, es wird gestylt. Gehen wir nun zurück und verwenden im Suchformular das benutzerdefinierte Radio. Also, anstatt ein Label zu verwenden und einfach so, werden wir zuerst ein benutzerdefiniertes Radio importieren. Importieren Sie einfach so benutzerdefinierte Radio-ROM-Komponenten aus dem benutzerdefinierten Radio , und das benutzerdefinierte Radio wird standardmäßig exportiert, sodass ich den benannten Export oder den Namensimport nicht verwenden muss. Das ist falsch. Jetzt verwende ich einfach das benutzerdefinierte Radio. Ich übergebe die beschriftete Requisite und die restlichen Requisiten werden umgeleitet, sagen wir zum zugrunde liegenden Eingabeelement. Also das Gleiche werde ich mit Schauspielern machen. Ich brauche dieses Etikett hier nicht mehr. Ich kopiere einfach das benutzerdefinierte Radio-Label Schauspielern und die Requisiten werden der Rest sein. Eine weitere Sache, die mir hier aufgefallen ist, wir haben angegeben, dass dieser Eingang vom Typ Radio sein wird. Wir geben jedoch nirgends an, dass unser zugrunde liegender Eingang auch den Typ Radio hat. Lassen Sie uns zunächst sagen, dass all diese Requisiten, die wir an das benutzerdefinierte Radio übergeben , zum zugrunde liegenden Eingabeelement umleiten, aber was auch immer wir übergeben, wir können es mit den Requisiten überschreiben , die wir hier definieren, indem sie, sagen wir, nach der Verbreitung einbeziehen. Unser Input wird also vom Typ Radio sein. Wenn wir Requisiten angeben, nachdem wir diesen Spread gemacht haben, wird alles, was wir angeben, dadurch überschrieben. Wenn ich hier zum Beispiel an benutzerdefiniertes Radio übergebe, sagen wir Text, dieser wird durch das überschrieben, was ich nach diesem Spread spezifiziere sagen wir Text, dieser wird durch das überschrieben, dieser wird durch das überschrieben . Aber wenn ich hier im benutzerdefinierten Radio spezifiziere, Radio vor dem Spread eintippe, überschreibt die Spread, sagen wir die Standard-Requisiten , die ich hier übergebe. Aber wenn es danach definiert wird, wird es überschrieben. Genau die gleichen Regeln wie bei Verteilung innerhalb eines einfachen Objekts. Also verteilt ihr hier etwas, sagen wir Input-Requisiten, und dann spezifiziert ihr das. Der Typ wird Radio sein. Im Grunde ist alles, was wir in Zeile 12 haben , grob übersetzt. Was Sie in diesen Zeilen sehen drei bis sechs, ungefähr das Gleiche. Wir geben den Typ Radio an, wir müssen hier keinen Typtext angeben. Jetzt können wir einfach alles retten. Wir können zu unserer App zurückkehren und sehen, dass wir jetzt gestaltete Elemente haben, aber wir haben vergessen, das Label hier zu löschen , und jetzt können Sie sehen, dass es funktioniert. Wenn ich spezifiziere, suchen Sie jetzt nach Jungen, dann wird tatsächlich nach Schauspielern gesucht. Dann bin ich zu Shows gewechselt und es funktioniert. Also hier ist alles gut, und ich denke, das wird es speziell für dieses Video sein. Wir haben, sagen wir, die wesentlichen Dinge für das Styling behandelt . Ich denke, wir haben viel erreicht. Beschränken wir uns vorerst darauf und verpflichten uns zu allem. Lassen Sie uns kurz einen Überblick darüber geben, was wir getan haben. Zunächst haben wir in index.HTML diesen Link zur Roberta-Schrift hinzugefügt, wir haben den Titel auf Box Office gesetzt, in app.jsx verwenden wir die globale Themenkomponente, verwenden wir die globale Themenkomponente die wir in der jsx erstellt haben. Also haben wir diese globale Ding-Komponente erstellt, die nur ein Wrapper ist , der auf dem Theme-Anbieter und den globalen Stilen aus gestylten Komponenten aufbaut. Die Logik wird im Theme jsx verwaltet. Wir haben das globale Themenobjekt erstellt, das wir in unseren stilisierten Komponenten in der gesamten App verwenden . Dann haben wir in navs.jsx die Nav-Link-Komponente verwendet, da dies keine Komponente ist, die uns den aktiven Link bereitstellt. Der aktive Link erhält also die aktive Klasse, und dann verwenden wir diese aktive Klasse in unserem CSS-Markup, um den aktiven Link zu stylen. Dann haben wir die benutzerdefinierte Optionskomponente erstellt und verwendet , bei der es sich um ein benutzerdefiniertes Optionsfeld handelt, das wir erneut mit Hilfe von Stilkomponenten erstellt haben . Wir haben hier auch diesen neuen kleinen Trick kennengelernt , wenn wir beispielsweise die Requisiten mithilfe der Operatoren Rest und Spread an das zugrunde liegende Element umleiten oder übergeben müssen Requisiten mithilfe der Operatoren Rest und Spread an das zugrunde liegende Element umleiten oder übergeben . Wir können also ein Objekt in ein Element aufteilen und welche Schlüsselwerte es auch hat, sie werden alle als Requisiten betrachtet, als Attribute des Elements. Das klang nach viel. Lassen Sie uns alles festlegen und sagen wir , installierte Komponenten, dann werden wir sagen, dass der globale Strahl mit SC erstellt wurde. Lassen Sie uns das mit gestylten Komponenten vereinfachen. Benutzerdefiniertes Radio erstellt. Nav-Link vom React-Router wurde verwendet, um den aktiven Link zu stylen. Klingt großartig. Lass uns alles auf GitHub übertragen und im nächsten Video werden wir mit den Stilen fortfahren. Wir sehen uns dort. 86. 30 Styling der App p2: Hallo nochmal. Im letzten Video haben wir begonnen, die Anwendung mithilfe von gestylten Komponenten zu stylen. In diesem Video werden wir weitermachen. Wenn wir zu dem Gast zurückkehren, den du mit dir geteilt hast, findest du stylingpart2.empty. Dies ist die Datei, auf die wir verweisen können. Wir haben eine Menge CSS-Markup, und das alles zu schreiben wird sehr lang und langweilig sein . Um das zu vermeiden, verwenden wir einfach das vorhandene Stylesheet, sodass Sie und ich das alles nicht selbst aufschreiben müssen. Lass uns eins nach dem anderen gehen. Was wir in StylingPart2.md haben. Zuerst haben wir AppTitle.jsx und wir haben hier eine Komponente im Titlewrapper-Stil. Lass es uns kopieren. Kommen wir zurück zu unserer App. Lass uns dorthin gehen, wo ist es? Was war die Akte? AppTitle.js x? Gehen wir zu AppTittle.jsx, und hier unten verwenden wir diesen Titlewrapper und importieren Styles aus gestylten Komponenten. Anstelle des div hier verwenden wir jetzt Titlewrapper, und all dieser h1- und p-Text darin wird wie unseren Stilen in styled div hier gestylt. Speichern wir es. Lass uns zur App zurückkehren und sehen. Jetzt, bumm, wir haben diesen ziemlich zentrierten Titel. Fantastisch. Lass uns weitermachen. Als nächstes haben wir ein Suchformular auf der Liste. Lassen Sie uns das alles kopieren und navigieren wir zur Suche nach. Im letzten Video hier haben wir diese CustomRadio-Komponente bereits erstellt. Jetzt fügen wir zusätzliche Stile hinzu, damit unser gesamtes Formular gut aussieht. All diese gestylten Komponenten werde ich ganz unten hineinlegen . Nur um zu erwähnen, dass Sie diese Komponenten im Stil überall platzieren können. Sie können searchform.style.jsx erstellen und alle stilisierten Komponenten dort platzieren und sie dann in das Suchformular importieren. Dies ist der Fall, wenn Sie die Suchformulardatei selbst nicht verschmutzen möchten . Weil gestylte Komponenten, CSS , viel Platz beanspruchen. Nur für den Fall, dass Sie das alles nicht hier schreiben möchten, können Sie es in eine separate Datei schreiben und es dann hier auf der Site importieren. In unserem Fall schreiben wir alles unten. Zuerst müssen wir Styled importieren, ich drücke die Intellisence, um das Drop-down-Menü zu öffnen. Hier importiere ich wie immer gestylte aus gestylten Komponenten. Lassen Sie uns nun diese Komponenten verwenden. Zuerst haben wir das Eingabeelement gestaltet. Wir haben diese Texteingabe, also anstatt die Eingabe zu verwenden, werden wir die Sucheingabekomponente verwenden, eine stilisierte Komponente, die wir erstellt haben. Als nächstes haben wir dieses Div im RadioWrapper-Stil. Das wird hier ein zusätzliches Div sein, gestylt oder wie habe ich es genannt? Es war RadiosWrapper. Es wird nur ein Div sein , das unsere beiden Custom-Radios einfach so umhüllt . Am Ende haben wir auch den Such-Button-Wrapper , der ein weiteres zusätzliches Wrapper-Div für dieses Button-Element sein wird . Wir können den Suchschaltflächen-Wrapper verwenden und darin eine Schaltfläche vom Typ Senden platzieren. Das schreiben wir in styles. Speichern wir es. Kommen wir zurück zum Formular und schauen wir uns das jetzt an. Bisher sieht es so gut aus. Lass uns versuchen, nach Jungs zu suchen. Sie können sehen, dass unsere Karten noch nicht gestylt sind. Wir werden das im Moment beheben. Aber das Formular sieht toll aus. Übrigens haben wir hier in diesem Suchfeld keinen Platzhalter. Lass es uns vielleicht hinzufügen. Ich übergebe die Platzhalteraufforderung an die Sucheingabekomponente, die eigentlich keine Komponente ist. Es ist immer noch das Eingabeelement. Platzhalter wird nach etwas suchen. Lass es uns versuchen und sehen. Jetzt sieht es besser aus. Großartig. Lass uns noch weiter gehen. Außerdem haben wir eine Reihe von Dateien, denen das Präfix common vorangestellt ist. Dies sind gestaltete Komponenten, die in unserer App in mehreren Dateien gemeinsam genutzt werden . Sie werden in mehrere andere Komponenten importiert. Deshalb wird ihnen das Präfix common vorangestellt. Das bedeutet, dass wir innerhalb von Komponenten wahrscheinlich einen Ordner namens common erstellen und diese gestylten Komponenten dort platzieren werden. Zuerst haben wir flexgrid.jsx. Kopieren wir das. Lassen Sie uns hier eine neue Datei namens Flex Grid erstellen. In dieser Datei exportieren wir einfach die Flexgrid-Komponente. Nichts besonderes. Dann haben wir eine Suchkarte. Dies wird eine Reihe von Komponenten sein , die wir verwenden werden , um die Suchkarte zu gestalten. Sowohl für Serien als auch für Schauspieler kopieren wir diese Markierung. Wir stellen es hier hin. Von hier aus exportieren wir zwei Dinge Suchbild-Wrapper und dann die Suchkartenkomponenten. Wir werden diese beiden verwenden , um Suchkarten zu gestalten. Gehen wir jetzt weiter. Hier haben wir StarIcon jsx. Lassen Sie uns dieses erstellen, StarIcon, jsx. Das wird interessant sein. Dies ist nur ein gestyltes Div. Hier verwenden wir jedoch eine Requisite namens active. Wir werden aktive Requisiten übergeben, um die Farbe dieses StarIcons zu ändern . Wir werden das in einem Moment ansprechen wenn wir zu dieser Komponente zurückkehren, wenn wir sie verwenden werden. Jetzt haben wir hier noch eine Sache namens Textzentrum. Nichts Besonderes hier. Nur ein Div, das den Text darin zentriert. Das nächste, was wir haben, heißt Pages Show.jsx. Lassen Sie uns das alles kopieren. Gehen wir zu Pages Show.jsx. Wie zuvor werden wir alle unsere Stilkomponenten verwenden. Unten werden wir gestylte aus gestylten Komponenten importieren. Mal sehen, wie wir diese Komponenten verwenden können. Verpackung zu Hause. Es hat den Stil div und darin wird das Ankertag formatiert . Hier haben wir den Link , der uns zur Homepage führt. Wir werden das in die Wrapper-Komponente zu Hause einwickeln. Irgendwann sieht es ungefähr so aus. Dann haben wir den Show-Page-Wrapper , der hier der Wrapper für das gesamte Markup sein wird. Ich werde es einfach so benutzen. Dröhnt. Zeigt den Seitenumschlag an und das abschließende Tag zeigt den Seitenumschlag. Dann haben wir auch InfoBlock, InfoBlock ist dieses wiederverwendbare Div für unsere zusätzlichen Informationen für die Show. Hier finden Sie InfoBlock-Details, InfoBlock-Saisons und InfoBlock-Besetzung. Hier haben wir auch das. Wir haben einen Fehler, die Daten werden geladen. Anstatt nur div zu verwenden, können wir die Komponente im Textzentrum , die wir im aktuellen Ordner erstellt haben, wiederverwenden Komponente im Textzentrum , die wir im aktuellen Ordner erstellt haben, . Ich importiere aus Komponenten, Common Text Center, und ich werde das Textzentrum importieren, und anstatt diese Divs hier zu verwenden, werde ich das Textzentrum anwenden. Fantastisch. Lassen Sie uns nun versuchen, zu sehen ob ich auf eine der Sendungen auf read more klicke. So sieht unsere Seite gerade aus. Wir haben jedoch immer noch ungestylte Hauptdaten der Sendung, wir haben immer noch ungestylte Details, Staffeln und Besetzung. Wenn wir hier zu Gast zurückkehren, haben wir die Besetzung der Sendungen, die Details der Sendungen, die Staffeln, die Showcard. Wir werden das alles jetzt stylen. Fangen wir mit der Besetzung an. Ich werde das alles kopieren und in die Besetzung der Show aufnehmen. Bei der. Unten wird das Styled aus den gestylten Komponenten importiert und die Besetzungsliste dient als Wrapper für die Besetzung. Darin haben wir Dinge , die als Liste von Klassennamen gestaltet werden. Wir können diese Klassennamen tatsächlich in unserem Markup verwenden und sie werden gestylt, weil wir das für das div, die Stile, angeben. In der Besetzungsliste haben wir dieses Div, das ein Cast-Item mit dem Klassennamen sein wird. Dann haben wir den Bild-Wrapper , der eigentlich unser Bild-Wrapper sein wird, ich nenne es so, und dann haben wir Schauspieler, das wird dieser Klassenname Schauspieler sein. Fantastisch. Nun, wenn wir wieder hierher kommen, haben wir keine Besetzung für diese Show verfügbar. Lass uns etwas anderes versuchen. Wir haben ein sehr großes Bild. Wisse, was hier ist. Wir werden uns gleich damit befassen, aber Sie können das jetzt sehen, unsere Besetzung ist gestylt. Sieht ziemlich cool aus. Gehen wir jetzt weiter. Gehen wir hier zur Detailkomponente. Details werden in diesem DetailWrapper angezeigt. Nichts wirklich Besonderes hier in der Details-Komponente, anstelle von div können wir einfach DetailsWrapper anwenden. Gehen wir zurück und sehen uns die Details an. Nichts wirklich Besonderes, nur zusätzlicher Spielraum hier. Kommen wir zurück zu den Tauchgängen. Jetzt haben wir hier Jahreszeiten. Lassen Sie uns das alles kopieren. Gehen wir zu den Jahreszeiten. Unten importiere ich , wieder Stil aus gestylten Komponenten. Wir haben SeasonSwrapper. Dies ist im Stil von div, SeasonWrapper. Lass es uns so benutzen. Was haben wir dann drinnen? Warum wurde es nicht benutzt? Weil ich das S vergessen habe. Wir haben hier auch SeasonList. Lassen Sie uns das für dieses Div verwenden, wenn wir das Markup zuordnen. Hier drinnen stylen wir auch saisonale Artikel. Dann bestehen wir die linke Klasse, dann bestehen wir die rechte Klasse. Unser Saison-Item wird dieser Div sein, den wir kartografieren. Der Nachname wird ein Saisonelement sein, wie es in der Dateikomponente definiert ist. Artikel der Saison Dann haben wir die Klasse verlassen und die Klasse schreiben. Aber hier haben wir das folgende Markup, was bedeutet, dass wir Staffeln und Folgen anzeigen möchten. Sehen wir uns auf der linken Seite und den Rest auf der rechten Seite an. Wir können Staffeln und Folgen in Div. zusammenfassen. Direkt in das Div können wir den Klassennamen von left eingeben. Dann geben wir dem Div den Klassennamen von right. Das Premierendatum und das Enddatum der Staffel, wir können sie vielleicht in das starke Etikett stecken , um es gewagt zu machen. Lassen Sie uns versuchen zu sehen, was wir am Ende haben. Jetzt haben wir das, mal sehen. Linke und rechte Seite sind genau so, wie wir sie hier definiert haben. Wir sehen hier keine Kühnheit, aber jetzt sehen wir sie, weil wir sie haben. Lassen Sie uns das Markup überprüfen. Großartig. Unsere Daten sind jetzt fett gedruckt, weil sie sich innerhalb des starken Tags befinden. Perfekt. Lassen Sie uns jetzt weitermachen. Wir haben hier auch ShowCard. Das wird endlich interessant. In ShowCard unten werde ich diesen Aktionsbereich und den StarBTN-Abschnitt platzieren . Lassen Sie mich wie gewohnt den Stil aus gestylten Komponenten importieren. Das erste, was ich hier tun möchte, ist das Folgende. Wenn wir zu unserer App zurückkehren und uns die Zusammenfassung ansehen, die wir hier entfernen, erhalten wir, wie Sie sich erinnern, rohes HTML. Wir ersetzen alle HTML-Tags, HTML-Zeichen. Aber es sieht so aus, als würde es einfach ohne Grund herausgeschnitten. Am Ende können wir nur drei Punkte hinzufügen , um es benutzerfreundlicher zu gestalten. Wir können entweder eine Zeichenkettenvorlage wie diese anwenden und am Ende können wir drei Punkte hinzufügen. Aber um es, sagen wir, weniger ausführlich zu machen, können wir es einfach mit dem Plus-Operator verketten und es wird genau das gleiche Ergebnis liefern, aber es sieht viel besser aus, denke ich. In diesem Fall passt es besser. Wenn wir jetzt hinschauen, sehen wir am Ende drei Punkte, was großartig ist. Lassen Sie uns nun die gestylten Komponenten verwenden, die wir hier haben. Zuallererst haben wir keine, sagen wir, gestylte Komponente die unseren Marker umschließt, die, sagen wir, Stile für die Karte bereitstellt , nur für etwas Bestimmtes wie Action-Section und StarBTN. Aber wir haben diese Komponentendatei im gemeinsamen Stil namens searchCard.jsx erstellt und darin haben wir eine Suchkarte und einen Suchbild-Wrapper. Lassen Sie uns diese beiden in ShowCard verwenden und wir werden diese beiden später in der Schauspielerkarte verwenden. Ich werde von Common SearchCard importieren. Ich werde angeben, dass ich SearchCard importiere und SearchImageWrapper importiere. Jetzt wird SearchCard das Wrapping-Div sein. Dann ist das Div, das das Bild umschließt tatsächlich searchImageWrapper. Dieser ActionSection hier wird das Div sein , das unseren Aktionsbereich definiert Lesen Sie mehr in den StartMe-Schaltflächen. Dann haben wir hier auch StarBTN, das ist ein Button-Element im Stil, das ist dieses. Lassen Sie uns jetzt versuchen, es zu benutzen. Mal sehen, wie unsere Karten gerade aussehen. Sie können sehen, dass sie nicht schlecht aussehen. Alles scheint gültig zu sein, aber wir haben hier, sagen wir, kein Symbol. Das Symbol, das wir zuvor erstellt haben, ist dieses StarIcon. Dies ist nur ein gestyltes Div mit diesem spezifischen CSS-Attribut, sagen wir Clippath. Lass uns versuchen, es zu benutzen und schauen wir uns an, wie es aussehen wird. Anstatt die Texte isStarred unStar Me und Star Me zu verwenden. Ich werde das kommentieren. Darin werde ich die StarIcon-Komponente übergeben, aber ich muss sie auch aus dem normalen StarIcon importieren. Großartig. Lassen Sie uns jetzt sehen. Jetzt haben wir hier den Stern , der mit der CSS-Eigenschaft clip path erreicht wird. Aber du kannst sehen, wenn ich darauf klicke, wenn ich versuche, die Show zu starten, passiert nichts. Wir müssen es irgendwie aktiv machen. Wir müssen die Benutzer wissen lassen , dass diese Show beginnt. Zuvor verwendeten wir Conditional Rendering, Star me und Unstar me. Aber jetzt, da wir gestylte Komponenten haben, können wir dynamische Stile sehr einfach anwenden , indem wir die Zeichenketteninterpolation innerhalb gestylter Komponenten verwenden . Ich übergebe einfach diese Funktion und spezifiziere. Wenn wir props.active an die Sternsymbolkomponente übergeben haben , wenden Sie bitte diese gelbe Farbe an. Andernfalls tragen Sie bitte diese grauweiße Farbe auf. Was wir hier tun müssen, ist, dass wir die aktive Requisite hier einfach an die Sternsymbolkomponente übergeben , die isStarred sein wird. Wenn isStarred auf true gesetzt ist, active prop den Wert true, was bedeutet, dass es innerhalb der Style-Komponente verwendet wird , um die gelbe Farbe auszuwählen. Wenn es falsch ist, wird es hier die graue Farbe sein. Lass es uns versuchen und sehen. Ich speichere alles. Jetzt können Sie sehen, dass es tatsächlich gelb ist , weil diese Show jetzt in den Hauptrollen aufgeführt ist. Wenn ich darauf klicke, werden die Stile geändert. Ich klicke noch einmal darauf, bumm, die Show ist in den Hauptrollen. Ziemlich genial. Cool. Wir sind hier mit ShowCard fertig. Gehen wir nun zu unserem Gast über. Hier haben wir auch unsere letzte Komponente hier in guests showMainData. Lass uns eigentlich alles von hier kopieren. Wo ist es? Es ist einfach weggeflogen. Kommen wir zurück zu ShowMainData. Unten haben wir hier tatsächlich viele Komponenten. Gehen wir nach oben und lassen Sie uns sehen. Zuerst haben wir MainDataWrapper. Dies wird das Div sein , das alles umschließt, also Klammer öffnen, Klammer schließen. Bum, wir haben es. Dann haben wir den Bildumbruch und dann haben wir im Inneren Bildtextstil, was bedeutet, dass wir das Markup hier ein wenig ändern müssen. Wir werden einen zusätzlichen Div-Wrapper für das Image-Tag hinzufügen und className für das Div wird image-wrap sein. Cool. Nun, dieser Div hier , der den Rest des Markups umschließt, wird dieser Datenabschnitt sein, den wir hier haben. Lass es uns benutzen. Großartig. Jetzt haben wir auch die Überschrift und wir haben auch eine Zusammenfassung und die Genres. Unsere Überschrift wird das Wrapper für H1 Div und Span sein. Es ist ein bisschen zu abstrakt, aber die Überschrift wird hier nur das h1-Tag sein, das div- und vielleicht das Startsymbol , das wir hier noch nicht verwendet haben. Lass mich h1 und div hier einpacken. Wir haben Headline, die jetzt den Titel hat , die das Div mit Bewertung haben, aber innerhalb des Divs können wir auch sagen StarIcon hinzufügen. Lassen Sie mich hier rating.average verwenden und je nach unserem Stil haben wir das Span-Element in Dive, sodass wir es tatsächlich in eine Span einwickeln können. Dann können wir hier das StarIcon verwenden, das wir von Common StarIcon importieren werden. Wir rufen einfach die StarIcon-Komponente auf und geben an , dass sie immer aktiv ist. Wir werden immer die gelbe Farbe haben. Irgendwann wird das Markup so aussehen. Lass es uns versuchen und das Ergebnis sehen. Am Ende haben wir hier diesen gelben Stern , der neben der Bewertung immer gelb sein wird. Cool. Es sieht nicht schlecht aus. Hier haben wir auch eine Zusammenfassung und die Genres. Die Zusammenfassung wird nur das gestylte Div und die Genres auch das Div im Stil haben; lass es uns benutzen, oder das umschließende Div oder vielleicht auch nicht. Genres werden nur das Div sein , das die Methode.map löscht. Lass es uns versuchen zu sehen, und jetzt schau dir einfach unsere Seite an, wie schön es ist. Es ist vollständig responsiv. Sie können versuchen, die Größe des Fensters zu ändern und auf Ihrem Handy darauf zuzugreifen. Es wird auf allen Geräten gut aussehen. Geh zurück zur Startseite, wir haben diese Seite gestylt. Wir haben fast alles gestylt, aber wir vermissen ein paar Dinge. Sie können zum Beispiel sehen, dass diese Kartenliste , sagen wir, überhaupt nicht gestylt ist. Wir wollen ein Netz haben. Mal sehen, welche Dinge wir hier nicht gestylt haben. Wir haben Show Grid nicht gestylt, also kehren wir zu ShowGrid zurück. Hier verwenden wir für dieses Div die wiederverwendbare, von uns erstellte Komponente namens FlexGrid. Ich verwende einfach dieses FlexGrid in ShowGrid und lasse mich all diese Komponenten schließen , weil wir viele Dateien geöffnet haben. Ich gehe zurück zu ShowGrid. Hier verwende ich FlexGrid und importiere es aus /common/FlexGrid. Fantastisch. Ich gehe zurück auf die Seite und du siehst, dass alles gut aussieht. Es ist vollständig responsiv und sieht gut aus. Was ist jetzt mit Schauspielern? Lass mich nach Schauspielern suchen. Man kann sehen, dass Schauspieler nicht gestylt sind , weil wir sie komplett vergessen haben. Lass uns das reparieren. Wir gehen hier zu Schauspielern. Für ActorCard importieren wir diese gemeinsame SearchCard-Komponente von Common SearchCard wird searchCard sein und alles in eine SearchCard wickeln wenn wir in die SearchCard-Datei schauen. Wir haben hier auch searchImageWrapper, also verwenden wir für das Div, das das Bild-Tag umschließt searchImageWrapper, das ebenfalls aus Common SearchCard importiert wird . Mal sehen, vielleicht müssen wir von hier aus je nach Stil etwas ändern , aber ich denke nicht, dass wir das nicht tun müssen. Wir müssen das FlexGrid auch tatsächlich verwenden , um aus unseren Karten ein Raster zu erstellen. Wir gehen zu ActorsGrid und verwenden wie zuvor nur FlexGrid aus dem gemeinsamen FlexGrid importiert wurde. Jetzt sieh dir das an. Es sieht toll aus. Schauspieler sind gestylt, Shows sind gestylt, alles sieht toll aus. Wir haben dieses StarIcon, aber wenn wir zur Starred-Seite gehen, sehen wir auch , dass alles gut aussieht da wir in der Starred-Komponente innerhalb der Starred-Seite die wiederverwendbare ShowGrid-Komponente verwenden. Lass uns den Rest sehen. Was haben wir hier? Auf anderen Seiten haben wir auch nur ein paar Dinge verwendet. In Starred verwenden wir zum Beispiel diese leeren Divs ohne Stile. Wir können sie durch eine textsensorische Komponente ersetzen , die sich in einem gemeinsamen Ordner befindet. Dies ist auf der Starred-Seite. Anstatt nur div zu zeigen, wurden keine Shows in den Hauptrollen gezeigt. Wir werden TextCenter verwenden und dieses TextCenter muss aus Components/Common/TextCenter importiert werden . Einfach so. Anstelle dieses Div verwenden wir TextCenter, es zeigt unser LadetextCenter. Überall ist TextCenter. Das Gleiche, was wir wahrscheinlich tun werden. Lass mich sehen. In JSX zu Hause zeigen wir, anstatt dieses Div und div keine Ergebnisse anzuzeigen, sondern nur TextCenter IntelliSense, das aus dem normalen TextCenter importiert wurde, keine Ergebnisse TextCenter, und ich denke, das ist es. Lass mich sehen. Wenn ich nach Hause gehe und etwas völlig Kauderwelsch tippe, haben wir definitiv keine Ergebnisse. Wir werden diese Nachricht hier haben, keine Ergebnisse. Wenn wir zu Markiert gehen und den Speicher hier leeren und die Seite aktualisieren, wird die Meldung Keine Sendungen wurden mit Sternen markiert angezeigt. Schließlich ist unsere Anwendung jetzt vollständig gestylt. Wir haben alles und wir haben uns um jede Seite in der App gekümmert . Großartig. Lassen Sie uns jetzt alles hier begehen. Würde es erlauben? In diesem Video war es eine lange Reise. Die Commit-Nachricht wird gestylt, die gesamte Anwendung gestylte Komponenten verwendet. Fantastisch. Im nächsten Video werden wir der App nur ein paar, sagen wir, kleinere Stilelemente hinzufügen . Um es noch interaktiver zu gestalten, wird das interessant sein. Wir sehen uns dort. 87. 31 Styling der App p3: Hallo, herzlichen Glückwunsch zum Styling der gesamten App. Jetzt haben wir alles vorbereitet. Wir können jedoch ein paar Teile verbessern, sodass es meiner Meinung nach etwas besser aussieht. Zuallererst möchte ich erwähnen, dass, wann immer wir nach Karten suchen, diese einfach bei uns auftauchen. Wäre es nicht schön, etwas Animation bereitzustellen , wenn diese Elemente erscheinen, zum Beispiel eine Einblendanimation. der NPM-Registry finden Sie das Paket React Fade In, das nur eine Komponente ist , die Sie importieren. Sie spezifizieren es genauso wie wir gestylte Komponenten verwenden. Sehr ähnlich und dann bietet es Animationselemente für seine Kinder. Sie verblassen und sie verblassen mit der Verzögerung. Dieses Paket ist sehr einfach zu verwenden, es ist jedoch immer noch ein Paket. Ich meine, für einen so einfachen Anwendungsfall benötigen wir möglicherweise überhaupt kein Paket. Sie können es einfach installieren und denken nicht darüber nach, CSS zu schreiben, aber weniger Pakete haben Sie, desto besser, weil es weniger Abhängigkeiten in Ihrer App hat. Zuerst wollte ich dieses Paket verwenden, aber dann habe ich beschlossen, dass wir tatsächlich nur ein sehr kleines CSS-Markup schreiben können nur ein sehr kleines CSS-Markup , das einen sehr ähnlichen Effekt erzielt. Wenn wir hier zum Kern zurückkehren und die MD-Datei mit drei Punkten gestalten, finden Sie hier das, sagen wir, erweiterte Flags-Grid MD-Datei mit drei Punkten gestalten, finden Sie hier das, sagen wir, , das wir bereits in Common Flex Grid jsx mit dieser Animation und den Keyframes haben . Lassen Sie mich das alles kopieren und einfach ersetzen. Jedes Mal, wenn die Flex-Grid-Komponente montiert wird, wird diese Fade-In-Animation angezeigt, die durch diese Keyframes definiert wird. Es wird einfach die Kapazität von Null auf Eins bringen und wir werden einen sehr ähnlichen Effekt erzielen wie React Fading, aber ohne die Verzögerung. Lass es uns versuchen und sehen. Wann immer ich jetzt nach Schauspielern oder Serien suche, genau wie immer, wenn ich irgendwo die Flex-Grid-Komponente verwendet habe , werden Sie sehen, dass diese Fade-In-Animation im Spiel ist, egal ob sie für Serien ist, ob sie für Schauspieler ist, ob sie auf der Startseite ist. Sehr ähnlicher Effekt, jedoch ohne jegliche Abhängigkeit. Sie sollten auch bedenken, dass Sie sich in Zukunft, wenn Sie etwas von npm installieren wollen, wenn Sie etwas von npm installieren wollen, zuerst eine Frage stellen sollten. Brauchst du diese Abhängigkeit wirklich oder kannst du sie selbst machen? Das ist sehr wichtig , wenn Sie an echten Projekten arbeiten wollen . Großartig. Nun, das nächste, was ich hinzufügen möchte, ist, dass, wann immer wir eine Show beginnen, unser Stern, den wir hier haben, einfach gelb wird. Das ist nicht schlecht, aber wir können es benutzerfreundlicher machen und wir können, sagen wir, eine Animation bereitstellen, wenn wir mit einer Schaltfläche beginnen, wenn wir diese Show starten, der Stern tatsächlich, sagen wir, irgendwie animiert wird. Wenn wir hier darauf zurückkommen, finden wir das auch unter Styling Teil drei MD, die Karte JSX mit verbesserter StarBTN-Style-Komponente zeigen. Gehen wir zu den Shows, zeigen wir die Karte. Hier haben wir das StarBTN, wenn wir es vergleichen. Hier definieren wir eine weitere Klasse namens Animate und wir haben hier etwas Neues. Kopieren wir es und schauen wir uns an, was wir haben. Zuallererst definieren wir die Animate-Klasse, die auch Animationen hat, wie sie durch diese Keyframes definiert sind, aber wir haben hier auch diese Interpolation und wir haben hier ein Sternsymbol, was sie bewirkt. Sie wissen, dass wir innerhalb des CSS-Markups, innerhalb der gestylten Komponente, ähnlich wie bei SAS die Verschachtelung von Elementen spezifizieren können . Hier habe ich das Startsymbol interpoliert und das bedeutet, dass alles, was ich hier interpoliert habe, tatsächlich auf vorhandene gestylte Komponenten als Referenzgetriebe aufgelöst wird . In dieser Animate-Klasse haben wir, wann immer dieses Element StarBtn die Animate-Klasse hat, innerhalb dieses Elements starBTN wann immer dieses Element StarBtn die Animate-Klasse hat, innerhalb dieses Elements starBTN unser Symbol verschoben. Wann immer es StarBtn gibt, eine aktive Klasse, wird eine animierte Klasse haben, bitte stylen Sie die Sternsymbolkomponente, die darin verwendet wird. Auf diese Weise können wir beschließen, den Symbolstil gezielt zu starten. Dieses Element, wann immer StarBTN eine Klasse hat. Lass es uns versuchen und sehen. Wir möchten der StarBtn-Komponente den Klassennamen animieren, wenn die Show gestartet wird. Was nur angeben wird, wann die Show gestartet wird, bitte fügen Sie die Animate-Klasse an. Lass es uns versuchen und sehen. Kehren wir zu unserer Anwendung zurück und Sie haben gerade diese Animation gesehen. Immer wenn ich auf die Show klicke, wird sie jetzt vergrößert und verkleinert. Es funktioniert. Sieht soweit gut aus, aber wenn wir zur Startseite gehen und wenn ich die Seite aktualisiere wird immer noch dieselbe Animation angezeigt und ich habe nichts getan. Das liegt daran, dass beim Einhängen der Komponente diese Animate-Klasse hinzugefügt wird, weil unsere Show bereits begonnen hat und wir die Animation sehen. Das ist nicht schlecht, aber das ist nicht gerade das Verhalten , das wir erreichen wollen. Wir wollen die Animation nur ausführen, wenn die Komponente tatsächlich gestartet wurde, nicht wenn die Komponente montiert wird. Um das gewünschte Ergebnis zu erzielen, werden wir einen neuen Hook namens use ref einführen . Was ist das? Lassen Sie uns es zunächst aus React importieren. Dies ist einer der integrierten Hooks, die Sie während Ihrer zukünftigen Entwicklerkarriere benötigen. Was ist das für ein Haken? Use ref ist nur ein Hook , den du so aufrufst und dieser Hook gibt dir eine Referenz zurück. Eine Referenz, die Sie dann angeben, oder sagen wir , diese Referenz einem Element zuordnen . Lass es uns versuchen und sehen. Zum Beispiel möchten wir diesem StarBTN eine Referenz geben. Nennen wir diese Referenz einfach so StarBTN ref. Damit wir diese Referenz verknüpfen können, haben wir gerade den Hook aufgerufen unsere StarBtn-Ref-Variable erhalten, jedoch noch keinem dieser Elemente zugeordnet ist. Um das zu tun, müssen wir an StarBtn, eine Requisite, eigentlich ein Attribut namens ref übergeben StarBtn, eine Requisite, eigentlich ein , und an diese Referenz geben wir die StarBtn-Referenz an. Sie können Ref einfach an Ihre benutzerdefinierten Komponenten übergeben , sagen wir. Wenn ich das habe, lass mich zum Beispiel den App-Titel sehen, den ich im Hauptlayout verwende Ich kann nicht einfach die Referenz übergeben und dann etwas anderes angeben. Ref wird nur an die zugrunde liegenden nativen HTML-Elemente übergeben . Wenn Sie Referenzen an Ihre benutzerdefinierten Komponenten weitergeben möchten, müssen diese ordnungsgemäß behandelt werden, und darüber werden wir in Zukunft sprechen . Aber vorerst beschränken wir uns auf native Elemente, da StarBTN im Grunde nur ein natives HTML-Element ist, denn unter dem Haken ist es immer noch nur ein Button. Es ist eine Komponente, die von der Styled Components Library erstellt wurde und Referenzen ordnungsgemäß verarbeitet. Was auch immer wir hier übergeben, wir werden im Grunde zum nativen HTML-Element der Schaltfläche weitergeleitet . Wir übergeben ref als StarBtnRef. Nun, was können wir damit machen? Warum sollten wir das tun? Lassen Sie uns versuchen , den onClick-Handler hier zu überarbeiten , den wir an StarBtn übergeben. Anstatt eine Funktion zu übergeben , die onStarmeClick aufruft, erstellen wir eine Funktion namens handleStarClick, die wir hier erstellen werden. HandleStarClick inside, das onStarmeClick aufruft und die ID hineingibt. Lassen Sie uns aber auch StarBtnRef auf der Konsole protokollieren und sehen, was wir haben. Wenn wir eine Konsole öffnen, , wenn ich hier klicke sehen wir jedes Mal, wenn ich hier klicke, das Objekt mit nur einer Eigenschaft namens current. Wann immer Sie eine solche Referenz erstellen, haben Sie immer ein Objekt, egal was passiert, mit dem aktuellen Schlüssel. Sie können sehen, dass die aktuelle Eigenschaft auf das Button-Element verweist , auf das HTML-Element namens Button, nicht auf Button 2, sondern nur auf das darunterliegende Button-Element. Dies entspricht beispielsweise dem Schreiben von document.getElementById. Wenn Sie ein Element anhand der ID abrufen, ist dies das Äquivalent. Wann immer Sie in React direkt mit der DOM-API auf das zugrunde liegende Element zugreifen müssen , anstatt document.getElementById, document.getElementByClassName mit etwas anderem verwenden, würden Sie Referenzen verwenden und dann starbtnRef.Current verwenden und dann Ihr Element abrufen. Ich speichere es, starbtnRef.Current. Nochmals, ich klicke auf den Button, du wirst sehen, dass ich jetzt dieses Element habe, was bedeutet, dass ich hier einfach alles verwenden kann, was ich will, und mit der DOM-API damit spielen kann. Es ist jedoch wichtig, Elemente zu verknüpfen und die Referenz zu übergeben. Denn wenn ich das nicht mache, meine Referenz leer. Lass es mich versuchen und sehen. Ich aktualisiere die Seite. Ich klicke, jetzt gibt mir mein StarBtnRef.Current undefined , weil jetzt meine Referenz leer ist. Es war mit nichts verbunden. Sie nicht, das ref-Attribut zu übergeben , wenn Sie ref verwenden Vergessen Sie nicht, das ref-Attribut zu übergeben , wenn Sie ref verwenden. Da jetzt starbtnRef.Current auf das zugrunde liegende DOM-Element zeigt, können wir die DOM-API verwenden, um unsere Klassennamenliste zu manipulieren. Hier erstelle ich einfach eine Variable namens, sagen wir starBtnElement. Es wird starbtnRef.Current sein. Zuallererst kann unser Strom, wie Sie gerade gesehen haben, undefiniert sein, also werden wir hier einfach einen Safe-Check durchführen. Wenn starbtnRef.element falsch ist, beenden Sie bitte diese Funktion. Andernfalls fahren wir fort und sagen, wenn die Show mit den Sternen markiert ist, in diesem Fall bitte wie folgt vor. Mir ist gerade aufgefallen, dass es Start statt Stern heißt. Lassen Sie mich es in StarBtnElement umbenennen. StarBtnElement.ClassList.remove (animiert). rufen wir star.btnElement.ClassList.Add (animate) auf. Zunächst einmal stimmt die Logik hier nicht. Lassen Sie uns zunächst sehen, ob das funktioniert, und dann werden wir das besprechen. Immer wenn ich klicke, kannst du sehen, dass meine Sendung mit den Hauptrollen gespielt wird und ich sehe die Animation nur , wenn ich hier klicke. Aber wenn ich zu den Sternen zurückkehre, habe ich immer noch diese Animation. Das liegt daran, dass ich diesen ClassName hier verwende. Lass mich es entfernen. Versuchen wir es jetzt und sehen es uns an. Derzeit läuft keine Animation. Lass mich zurück zur Homepage gehen. Aber wenn ich versuche, die Show zu starten, kann man sehen, dass die Animation da ist. Warum verwenden wir diese Logik hier? Wenn diese Funktion ausgeführt wird, hat isStarred immer noch den vorherigen Status. Lesen Sie es einfach, da der Code hier geschrieben ist. Unsere Show ist derzeit in den Hauptrollen zu sehen. Wenn wir darauf klicken, möchten wir keine Animation ausführen. Wenn unsere Sendung gerade als Star markiert ist und wir sie nicht mehr als markiert markieren, entfernen wir die Animate-Klasse. Wir wollten hier keine Animation laufen lassen. Wenn unsere Sendung jedoch derzeit unstarred ist, diese andere Bedingung ausgelöst. In diesem Fall fügen wir die Animate-Klasse hinzu, um die Animation bereitzustellen. Auf diese Weise können wir mithilfe der DOM-API des useRef-Hoops Klassennamen direkt manipulieren, und des useRef-Hoops Klassennamen direkt manipulieren, sagen wir, unbedingt mithilfe der DOM-API, anstatt die ClassName-Schnittstelle zu verwenden , die uns React zur Verfügung stellt. Einfach so können wir Animationen hinzufügen und haben den neuen Hook namens useRef kennengelernt. Um es kurz zusammenzufassen UserRef kann als Referenz für zugrunde liegende native HTML-Elemente verwendet werden , falls Sie Zugriff auf die DOM-Schnittstelle dieses Elements erhalten möchten , etwa so. Lass uns alles zur Bühne hinzufügen und lass uns festlegen. Erstens haben wir das React Fade-In-Paket nicht verwendet. Wir verwenden unser einfaches CSS, um einen sehr ähnlichen Fade-In-Effekt zu erzielen. Anstatt dann nur className zu verwenden , um Animationen für das Starelement bereitzustellen , verwenden wir den useRef-Hook, um Zugriff auf das zugrunde liegende DOM-Element zu erhalten . Dann verwenden wir diese DOM-API, ClassList-Eigenschaft des DOM-Elements, um die Animate-Klasse hinzuzufügen und zu entfernen , um unbedingt Animationen hinzuzufügen oder zu entfernen, die in unserer gestylten Komponente definiert ist. Jetzt können wir das übernehmen und sagen, FlexGrid eine Animation hinzugefügt. Nehmen wir an, FlexGrid wurde eine Einblendanimation hinzugefügt. StarBtn-Animation hinzugefügt, oder sagen wir, eine Skalenanimation zu StarBTN hinzugefügt. Fantastisch. Das war's für heute. Wir sehen uns im nächsten. 88. 32 Bereitstellung auf Github-Seiten: Hallo. In diesem Video werden wir Box Office endlich einsetzen, sodass wir am Ende eine öffentlich zugängliche URL haben , die wir mit unseren Freunden teilen können. Im vorherigen Projekt, in Tic Tac Toe, haben wir einen Dienst namens Search.SH verwendet Dieses Mal werden wir etwas Neues ausprobieren. Das Hosting, das wir verwenden werden, wird GitHub Pages sein. Warum GitHub Pages und nicht Search? Zuallererst sind sie sich sehr ähnlich, beide werden verwendet, um statische Dateien zu hosten, aber wir wollen erkunden, wir wollen neue Dinge ausprobieren, wir wollen Alternativen sehen. Am Ende können Sie vergleichen, was Ihnen besser gefällt, GitHub Pages oder Search oder vielleicht sogar etwas anderes. Lass uns gehen. Zunächst navigieren wir zur Dokumentation zur Create React App. Wenn wir auf „Get Started“ klicken, können wir links nach dem Abschnitt Bereitstellungen suchen. Im Deployment-Bereich können wir nach GitHub Pages suchen. Was wir tun werden, werden wir einfach dieser einfachen schrittweisen Anleitung folgen . Als erstes werden wir aufgefordert, package.json zu öffnen und das Homepage-Feld für Ihr Projekt hinzuzufügen. Lass uns das machen. Ich kopiere einfach die Homepage, öffne package.json, irgendwo in package.json werden wir die Homepage hinzufügen. Aber hier müssen wir ein paar Dinge ändern. Zuallererst mein Benutzername.github.io. Mein Nutzername muss durch deinen Nutzernamen auf GitHub ersetzt werden . Ich nehme meins. Meine App muss durch deinen Repository-Namen auf GitHub ersetzt werden . In meinem Fall wird es eine Box-Office-App sein. Irgendwann wird die URL für mich so aussehen. Sehr ähnlich, muss auch für dich sein. Ich speichere package.json, ich komme zurück zum Tutorial. Sehen wir uns Schritt Nummer 2 an. Dann müssen wir ein Paket namens gh-pages installieren und dann ein Deploy-Skript zu package.json hinzufügen. Lassen Sie uns zuerst die Abhängigkeit installieren. Ich kopiere einfach den Befehl. Ich werde meine App beenden und dann den Installationsbefehl ausführen. Schauen wir uns während der Installation was wir zum Verpacken von.json benötigen. Wir müssen zwei weitere Skripts hinzufügen, Deploy und Pre Deploy. Kopieren wir sie. Kehren wir zu package.json zurück. Inzwischen haben wir die Abhängigkeit bereits installiert. Gehen wir zu den Skripten und fügen wir am Ende Predeploy und Deploy hinzu. Wir brauchen keine Pluspunkte , die kopiert wurden, wir speichern und hier, was wir sehen. Wir haben das Deploy-Skript definiert und dann haben wir Predeploy. Nehmen wir an, Npm ist intelligent genug, um zu verstehen, dass Predeploy vor dem Deploy-Skript ausgeführt werden muss. Wann immer wir also das Deploy-Skript ausführen , wird Predeploy ausgeführt. Predeploy erstellt die App, der Anwendungs-Build wird im Build-Ordner erstellt, und dann geben wir an, dass Sie den Build-Ordner hier bereitstellen, sodass sich der Build, den Sie in Zeile 35 sehen, auf den Build-Ordner in unserem Projektstammverzeichnis bezieht. Wenn wir dann im Tutorial weiter gehen und Sie die Bereitstellung stattdessen auf einer GitHub-Benutzerseite durchführen, beachten Sie, dass dies nicht unser Fall ist. Der dritte Schritt besteht darin, einfach npm run deploy auszuführen. Lass uns versuchen, das zu tun. Jetzt können wir npm run deploy ausführen. Sehen wir uns die Ausgabe an. Zuerst sehen wir npm run build, das kommt aus dem Predeploy-Skript, dann haben wir die gh-pages minus den Befehl build, und jetzt heißt es veröffentlicht, aber wir haben keine URL, wohin müssen wir gehen? Die Homepage, die wir in package.json angegeben haben, ist eigentlich die URL, die wir besuchen müssen , um auf unsere App zuzugreifen. Kopieren wir diese URL. Öffnen wir es in einem neuen Tab. Aber sobald wir hier navigieren, werden wir sehen, dass es nicht gefunden wurde, es ist 404. Was passiert also? Lassen Sie uns das untersuchen. Wenn wir zu unserem Repository zurückkehren, gibt es eine Sache, die ich zuvor nicht erwähnt habe GitHub Pages ist nur für öffentliche Repositorys kostenlos verfügbar . In meinem Fall ist das Repository privat. Es ist hier in der oberen linken Ecke mit Privat markiert Um GitHub Pages kostenlos nutzen zu können, muss ich sicherstellen, dass dieses Repository öffentlich ist. Gehen wir zu den Einstellungen und ändern in den Einstellungen die Sichtbarkeit unseres Repositorys von privat auf öffentlich. Wir gehen zur Einstellungsseite, wir scrollen nach unten und hier unter Gefahrenzone ändern wir die und hier unter Gefahrenzone Sichtbarkeit des Repositorys, wir ändern es auf öffentlich. Ja, ich möchte es veröffentlichen. Ja, ich bin mir sicher. Möglicherweise werden Sie auch nach Ihrem Passwort gefragt, das ist in Ordnung. Jetzt wurde mein Repositorium öffentlich. Wenn wir jedoch erneut versuchen, auf die URL zuzugreifen, ist sie immer noch dieselbe und wurde nicht gefunden. Wir müssen das Hosting anweisen, wir müssen GitHub Pages anweisen , dass wir unsere App jetzt veröffentlichen möchten. Zuallererst, wie funktioniert es? Wenn wir hier zur Repository-Hauptseite gehen, werden zwei Zweige angezeigt, die jetzt verfügbar sind. Bisher war es nur einer. Wenn wir jetzt auf diese beiden Zweige klicken, sehen wir hier die Filiale von gh-Pages. Wenn wir auf diesen Zweig klicken, sehen Sie alle Dateien , die wir im Build-Ordner haben. Im Grunde genommen hat der Deploy-Befehl hier, was er gemacht hat, diesen Build-Ordner verwendet , einen neuen Zweig in unserem Repository erstellt und alle Dateien aus dem Build-Ordner in den gh-pages-Zweig auf GitHub hochgeladen . Das Hosting von GitHub Pages funktioniert so , dass es einen Ihrer Zweige in Ihrem Repository benötigt und alle Dateien, die sich hier befinden, auf den GitHub-Servern gehostet werden. Auf diese Weise können wir Dateien hosten, die sich in unserem Repository befinden. Um GitHub Pages so zu konfigurieren , dass das Hosting auf diesen bestimmten gh-pages-Zweig dieser Dateien verweist, müssen wir erneut die Einstellungsseite unseres Repositorys aufrufen. Auf der linken Seite suchen wir nach dem Abschnitt Seiten, und hier geben wir an, dass, okay, die Quelle für unser Deployment von einem Zweig aus bereitgestellt wird. Dies ist die Standardeinstellung, das sollten Sie vorerst haben, und für den Zweig geben Sie an, dass Sie unsere Dateien vom gh-pages-Zweig aus hosten möchten . Wir klicken auf „Speichern“ und direkt danach wird die Bereitstellung ausgelöst. Jetzt dauert es ein paar Minuten, ein oder zwei Minuten, um all Ihre Dateien aus dem gh-Branch in Ihrem Repository auf das Hosting zu übertragen. Wenn wir hier zu Aktionen gehen , dem Tab Aktionen in Ihrem Repository, sehen Sie hier nun diesen einen Workflow-Lauf. Wenn Sie darauf klicken, sehen Sie den Fortschritt Ihres Einsatzes. Sobald es fertig ist, sehen Sie hier eine grüne Markierung. Das bedeutet, dass Ihre App hier unter dieser URL veröffentlicht wird . Lass uns warten, bis es fertig ist und dann melde ich mich bei dir. Jetzt scheint es, dass unsere App bereitgestellt wurde. Man kann sehen, dass alles grün ist. Jetzt habe ich auch diese URL hier gesehen. Wenn ich darauf klicke, sehe ich das. Zuallererst ist meine Anwendung wie zuvor unter derselben URL verfügbar , die Sie auf der Homepage angeben, unter dem Homepage-Schlüssel in package.json. Aber wenn wir darauf zugreifen, sehen wir Not Found. Warum ist das so? Die Sache ist, dass es tatsächlich bereitgestellt wurde, aber aus irgendeinem Grund heißt es nicht gefunden, und es kommt definitiv aus unserer Anwendung, denn wenn wir das Markup untersuchen, ähnelt es unserer Anwendung, dem, was wir in index.html haben, unserem Skelett. In der Öffentlichkeit haben wir dieses Skelett. Es gehört uns. Wir haben den gleichen Kopf, wir haben alles dasselbe. Aber was ist passiert? Die Sache ist, wenn wir zum Tutorial in der Create React App-Dokumentation zurückkehren , es enthält diesen Hinweis namens Notes zum clientseitigen Routing. Das Problem ist, dass das GitHub-Hosting nicht wirklich für die Verarbeitung von clientseitigen Anwendungen konfiguriert ist , um keine Single-Page-Apps zu verarbeiten , die clientseitiges Routing verwenden. Weitere Informationen finden Sie hier in der offiziellen Dokumentation. Wir werden etwas namens HashRouter von React Router verwenden . Dies ist eine der hier angebotenen Lösungen . Lass uns das machen. Wir kehren zur App zurück, wir Open Source, App.jsx. Hier verwenden wir BrowserRouter, der aus React Router dom importiert wird. Stattdessen können wir etwas namens HashRouter verwenden , und das war's. Der Rest wird auf React Router dom sein. Dafür werden wir keine zusätzlichen Schritte benötigen. Um zu verstehen, was es tut, lassen Sie uns zuerst den lokalen Entwicklungsserver erneut ausführen , npm run start. Das haben wir jetzt. Zuallererst ist unsere App jetzt, obwohl sie lokal bereitgestellt wird, unter dem Präfix /box-office-app verfügbar, unabhängig davon, welches Präfix wir auf der Homepage im Paket JASON angeben . Create React-App ist intelligent genug, um zu verstehen, dass wir sie unter dem App-Präfix für die Kinokasse bereitstellen können . Deshalb wird es hier aufbewahrt. Wenn Sie jedoch Apps unter einem Präfix bereitstellen, müssen Sie dies als Ihre Basis-URL betrachten. Was ich damit meine, wenn wir suchen, zeigt zum Beispiel, zeigt zum Beispiel, wenn wir hier den Mauszeiger auf read more bewegen, gehen wir zu dieser Seite /show/show ID. Wenn wir auf GitHub-Hosting sein können, sieht unsere URL wie folgt aus : /box-office-app/show/show ID. Aber wir werden dieses Präfix nicht haben, genau wie wir es hier auf dem lokalen Host haben. Es wird problematisch sein , da unsere Seite sonst nicht gefunden wird. Was ich damit meine ist, dass wir zuerst die App bereitstellen und Sie werden sie selbst sehen, und dann werden wir das mit einer sehr kleinen Ergänzung zu unserem bestehenden Code beheben . Ich führe das Deploy-Skript einfach erneut aus. Es erstellt erneut meine App und veröffentlicht sie dann erneut auf GitHub Pages. Wenn wir auf der Registerkarte Aktionen zum Repository zurückkehren, wird erneut ein Workflow ausgeführt. Wir warten einfach, bis es eingesetzt ist , und dann checken wir aus. Es ist jetzt im Einsatz. Kommen wir zurück zur App. Wenn wir zu unserer App zurückkehren, sehen wir immer noch nicht gefunden. Aber wenn ich aktualisiere, haben wir jetzt die Anwendung. Es sieht vollkommen in Ordnung aus. Wenn Sie sich jedoch die URL ansehen, haben wir jetzt diesen Hash hier. Es wird verwendet, um das clientseitige Routing ordnungsgemäß zu handhaben , wenn wir es auf GitHub Pages bereitstellen. Aber wir haben noch ein weiteres Problem, das ich gerade erwähnt habe, mit dem Link, mit dieser Schaltfläche „Mehr lesen“. Wenn ich auf diese Schaltfläche klicke, sehen Sie, dass wir zu /show/show ID navigieren. Wir haben kein App-Präfix für die Kinokasse und aus diesem Grund haben wir 404. Um das Problem zu lösen, müssen wir zuerst verstehen, warum es passiert. Lass uns mehr lesen und markieren. Das werden Komponenten, Shows, Showcard sein. Hier verwenden wir ein einfaches Ankertag, das auf /show/show ID zeigt. Das ist in Ordnung und es wird funktionieren. Es funktioniert, wenn unsere App unter der Route und nicht unter dem Präfix bereitgestellt wurde . müssen wir irgendwie in Ordnung bringen. Eine naive Lösung besteht darin, das Präfix, das Sie hier haben, manuell einzugeben. Es wird funktionieren, aber das ist keine gute Lösung. Wir müssen uns irgendwie automatisch für das Präfix entscheiden, das wir hier haben. React Router kümmert sich darum. In der Vergangenheit haben wir die Link-Komponente, die wir von React Router verwendet haben , durch diesen Ankercheck ersetzt React Router verwendet haben , durch diesen Ankercheck da wir diese Link-Komponente nicht wirklich benötigten. Aber jetzt werden wir es wieder zurückbekommen. Ich werde den Link von React Router dom importieren. Dann verwende ich statt des Ankertags wieder einen Link, noch einmal. Anstelle von href gebe ich to an und lasse das Feld Ziel und die Beziehungsattribute leer. Auf diese Weise haben wir immer noch den gleichen Link wie zuvor, aber diesmal kümmert sich die Link-Komponente von React Router dom um das Präfix. Es wird automatisch zur richtigen URL weitergeleitet. Versuchen wir nun erneut, das Bereitstellungsskript auszuführen, die App erneut bereitzustellen und das Endergebnis zu sehen. Wir sehen uns, sobald es eingesetzt ist. Ich habe noch eine Minute gewartet. Hier ist mein dritter Einsatz, erst vor einer Minute veröffentlicht wurde. Ich werde zu meiner App zurückkehren. Ich werde mich erfrischen. Ich suche nach Sendungen und wenn ich jetzt auf Read More klicke, wurde meine URL jetzt korrekt aufgelöst da sie jetzt von der React Router-Bibliothek verarbeitet wurde. Einfach so konnten wir unsere App bereitstellen. Glückwunsch. Kehren wir nun zu unserem Code zurück und lassen Sie uns alles bestätigen. Zunächst haben wir die Bibliothek gh pages installiert, um sie auf GitHub Pages bereitzustellen. Das Homepage-Feld im Paket JSON gibt an, Das Homepage-Feld im Paket JSON wo genau die Anwendung bereitgestellt wird. Auch hier stellen wir den Build-Ordner bereit, der durch den Befehl npm run build erzeugt wird. Jetzt ersetzen wir auch den Browser-Router durch Hash-Router, da GitHub Pages das clientseitige Routing nicht richtig handhabt. Eine Möglichkeit, dieses Problem zu beheben, besteht darin, den Hash-Router zu verwenden wie in der Dokumentation zur Create React-App vorgeschlagen. Dann haben wir auch ein einfaches Ankertag wieder auf die Link-Komponente von React Router dom geändert ein einfaches Ankertag wieder auf die Link-Komponente von , da wir uns auf das Präfix festlegen müssen , sobald unsere App auf GitHub Pages bereitgestellt ist. Lass uns alles zur Stage hinzufügen und dann Commit und sagen wir Deployment, die App auf GitHub Pages bereitstellen, HashRouter verwenden, Link statt nativen Ankertag verwenden. Cool. Ich schiebe alles auf den Master und gehe zurück zu meinem Repository, nur Fälle, um sicherzustellen, dass alles bereitgestellt wird. Meine letzte Änderung vor 10 Sekunden. Ich habe eine zweite Filiale namens gh pages. Immer wenn Sie npm run deploy ausführen, aktualisiert es GitHub Pages und aktualisiert Dateien, die auf Ihrer URL gehostet werden und die Sie verwenden können, um sie mit Ihren Freunden zu teilen. Eine weitere einfache Sache, die ich hier hinzufügen möchte , ist, dass wir tatsächlich diese URL verwenden können , auf der sich unsere Anwendung befindet. Besuchen wir es einfach noch einmal. Ja, es ist in der Tat hier. Wir können diese URL zu unserem Abschnitt Über uns auf der Repository-Seite hinzufügen . Ich klicke hier auf das Einstellungssymbol. Unter Website füge ich den Link hinzu und klicke auf Änderungen speichern. Jetzt bumm, es erscheint hier. Dies dient nur dazu, dass Sie in Zukunft problemlos auf Ihre Anwendung zugreifen können . Das war's für heute, wir sehen uns im nächsten. 89. 33 PWA (Progressive Web App): Hallo nochmal. Im letzten Video haben wir die Kinokasse endlich in der Live-Umgebung eingesetzt. Dieses Mal werden wir über Servicemitarbeiter sprechen. Wie Sie sich erinnern, haben wir im allerersten Video, als wir dieses Projekt erstellt haben, den Servicemitarbeiter, Registrierung von Servicemitarbeitern sowie den Registrierungspunkt für Servicemitarbeiter auf dem Register, und ich habe Ihnen gesagt, dass wir später darüber sprechen werden. Jetzt ist die Zeit gekommen. Dieser Servicemitarbeiter wird benötigt, um unsere Bewerbung zu erstellen, um die Kinokasse bei Progressive Web App zu erstellen. Was ist eine progressive Web-App? Eine progressive Webanwendung ist einfach jede andere Webanwendung, jede andere Website, die einer Liste bestimmter Dinge folgt . Wenn die Website-DevUp-Anwendung diese Liste von Optionen erfüllt, wird diese Website zu einer progressiven Web-App. Das bedeutet, dass die Anwendung offline verfügbar wird. Die Anwendung kann als echte mobile Anwendung installiert werden , unabhängig davon, ob Sie sich auf dem Desktop oder auf einem Mobilgerät befinden. Die Frage hier, welche Optionen machen eine Website zu einer progressiven Web-App? im Chrome-Browser Wenn Sie im Chrome-Browser zu den Chrome-Entwicklertools wechseln diesen Abschnitt auf der rechten Seite erweitern, können Sie zum Lighthouse-Abschnitt wechseln. Lighthouse ist ein integriertes Tool im Chrome-Browser. Es ermöglicht uns, die Leistung einer Website zu bewerten , indem wir die Geschwindigkeit, die Ladezeit und einige verschiedene Metriken messen . Hier unter Kategorien haben wir diesen progressiven Web-App-Check. Lassen Sie uns dorthin gelangen und dann auf Analyze Page Load klicken und sehen, was passieren wird. Es wird nur ein paar Sekunden dauern, bis die Website überprüft wird, und jetzt haben wir , dass wir fast alles perfekt grün haben, aber wir sind an keinem davon wirklich interessiert. Wenn ja, können Sie einfach nacheinander vorgehen, verschiedene Abschnitte erweitern und lesen, was verbessert werden kann, was geändert werden kann. Vielleicht müssen Sie nichts ändern , aber ganz unten haben Sie den PWA-Bereich, die Progressive Web App. Eine Liste der Dinge, die Sie hier sehen, ist im Grunde das, was die Website befolgen muss, um eine progressive Webanwendung zu werden. Zuallererst haben wir hier nicht ein paar Dinge. Unsere Anwendung ist nicht installierbar Um unsere Anwendung installierbar zu machen, müssen wir einen Servicemitarbeiter vorstellen. Was ist ein Servicemitarbeiter? Servicemitarbeiter, es ist eigentlich einfacher, wenn ich es visualisiere. Wir haben die Website hier. Unsere Website hier links. Dann haben wir auf der rechten Seite ausgehende Anfragen. Einfach so. Lassen Sie uns das vielleicht selbst überprüfen, also gehen wir zum Netzwerk-Tab und wenn wir die Seite aktualisieren, sehen wir eine Liste von Anfragen. Dies ist also, dass unser Browser eine Anfrage an den GitHub-Seitenserver stellt , um Index-HTML abzurufen, um JavaScript-CSS-Dateien vom Hosting-Server abzurufen. Ein Servicemitarbeiter ist nur ein Drehbuch. Es befindet sich im Browser, irgendwo im Browser, außerhalb unseres Anwendungsdienstmitarbeiters und was es tut, es fängt einfach all diese Anfragen ab, ausgehende Anfragen und macht etwas damit. In unserem Fall ist der Service Worker nur ein Proxy, der all diese ausgehenden Anfragen abfängt und sie in den Cache-Speicher des Browsers legt . Wenn also das nächste Mal auf diese Dateien zugegriffen wird , verwendet der , verwendet der Servicemitarbeiter den zwischengespeicherten Speicher ruft all diese Anfragen ab, und ruft all diese Anfragen ab, alle abgerufenen Dateien zuvor aus dem Cache-Speicher und stellen sie unserer Webseite zur Verfügung. Auf diese Weise kann unsere Anwendung offline verfügbar werden, was bedeutet, dass jede Anfrage, die gesendet wird, vom Servicemitarbeiter abgefangen wird. Es überprüft den Cache und wenn diese Anfragen im Cache vorhanden sind, werden sie vom Servicemitarbeiter aus dem Cache bedient. Um es kurz zusammenzufassen: Ein Service Worker ist nur ein Skript, das sich irgendwo im Browser befindet. Es ist nur ein Proxy , der ausgehende Anfragen vom Browser abfängt . So etwas. Wenn wir zu unserer Anwendung zurückkehren, sehen wir, dass wir hier eine Service Worker JS-Datei haben. Dies ist das Skript selbst, der Service Worker selbst, das im Browser außerhalb unserer Anwendung ausgeführt wird . Diese Datei, die Sie hier sehen befindet sich irgendwo im Browser. Aber die Frage ist, wie können wir damit umgehen? Wie wir damit eigentlich etwas anfangen können. Bevor wir diese Frage beantworten können, haben wir hier die Arbeitsbox. Was sind das und wenn wir in das Paket Json schauen, haben wir viele Workbox-Abhängigkeiten. Dies sind im Grunde nur Bibliotheken , die es uns ermöglichen, irgendwie, einfach eine Logik in das Service Worker-Skript zu schreiben. Sie können sehen, dass dieses Skript von der Create React-App und der hier geschriebenen Logik automatisch generiert wurde dass dieses Skript von der Create React-App und der hier geschriebenen Logik Es fängt einfach alle Anfragen ab und legt sie in den Cache-Speicher. müssen wir nicht wirklich viel nachdenken. Wir werden hier nicht unsere eigene Logik für Service Worker schreiben , wir werden bestehende Logik verwenden, und es wird ausreichen, alles zwischenzuspeichern , und das Wordbox ist nur eine Reihe von Funktionen, die wir importieren und verwenden, um das zu erreichen. Da diese Datei von der Create React-App generiert wurde, werden wir sie nicht ändern, wir sind nicht daran interessiert. Das wird wieder ausreichend sein. Jetzt haben wir auch eine Registrierung für Servicemitarbeiter. Damit der Browser versteht, dass wir dieses Service Worker JS irgendwie verwenden wollen, müssen wir es im Browser registrieren , denn wenn wir es einfach als Teil unserer Anwendung platzieren, passiert nichts, also müssen wir diesen Service Worker irgendwie in unserer Anwendung registrieren und diese Service Workerregistrierung hat hier zwei Funktionen. Die erste Funktion heißt Register, die von hier exportiert wurde, und zweite Funktion heißt Unregister. Auch hier wird all diese Logik von der Create React-App automatisch generiert und reicht für unseren Anwendungsfall wieder aus. Die Registrierungsfunktion registriert Service Worker JS, wenn unsere Anwendung ausgeführt wird registriert Service Worker JS, wenn unsere Anwendung , und die Funktion zum Aufheben der Registrierung Registrierung vorhandener Service Worker in unserer Anwendung auf. Wenn wir in den Index jsx schauen, haben wir hier alles als Service Worker Registration aus Service Worker Registration eingegeben Service Worker Registration aus Service Worker . Das bedeutet, dass wir unter dem Importobjekt für die Registrierung von Servicearbeitern Importobjekt für die Registrierung von Servicearbeitern zwei Funktionen haben, registrieren und abmelden, und die ganze Zeit hieß es für uns die Registrierung aufheben weil wir nicht an Service Worker interessiert waren. Um einen Servicemitarbeiter zu registrieren, müssen wir die Registerfunktion aufrufen. Wenn Sie jedoch Register verwenden, funktioniert es in beiden Umgebungen, wenn Sie lokal entwickeln und wenn es live bereitgestellt wird um beispielsweise GitHub-Seiten zu hosten. Aber da es Caching verwenden wird und die Caching-Strategie hier aggressiv ist, bedeutet das, dass alles zwischengespeichert wird . Ich schlage uns also zuerst zu überprüfen, ob wir uns gerade in der lokalen Entwicklung befinden Wir wollen diese Punkt- und Registerfunktion nicht nennen. Aber wenn wir uns in einer Live-Umgebung befinden, dann bitte ja, die Registerfunktion aufgerufen. Wie können wir das überprüfen und wie können wir endlich sehen, wie das funktioniert? In der Anwendung haben wir Zugriff auf etwas namens process.env. Dies ist nur eine Reihe von Umgebungsvariablen , auf die wir Zugriff haben. Umgebungsvariablen sind Variablen, die global von der Umgebung festgelegt werden , in der unser Code ausgeführt wird. Lassen Sie uns versuchen, process.env auf der Konsole zu protokollieren, und wenn ich Punkt eingebe, habe ich hier Intellisense, ich habe Node ENV. Wenn ich mit dem Mauszeiger fahre, können Sie tatsächlich sehen, dass es drei potenziell unterschiedliche Werte hat: Entwicklung, Produktion und Test. Aber in unserem Fall werden wir trotzdem log js stornieren, um zu sehen. Nehmen wir die aktuelle ENV an, und vorerst werden wir die Registrierung trotzdem aufheben. Ich werde den lokalen Entwicklungsserver ausführen, und ich werde auch das Problem beheben, dass der Prozess nicht definiert ist, das von ESLint kommt , weil Protest etwas ist das auf der JS-Seite des Knotens ausgeführt wird, nicht von JavaScript, das im Browser ausgeführt wird , also müssen wir den ESLint verstehen lassen , dass wir auch in der Umgebung von node.JS laufen, nicht nur innerhalb der Browser. Node true, dieser Knoten ist wahr Wir lassen ESLint verstehen, dass wir uns gerade in der Node-JS-Umgebung befinden . Dies wird nichts bewirken außer dass nur dieser Fehler behoben wird. Das war's. Ich führe meine App lokal aus. Wenn ich zur Konsole gehe, sehe ich, dass aktuelle ENV der Entwicklung entspricht. Was ich hier ausführen werde, um den Build-Befehl zu erstellen, um den Produktions-Build für diesen variablen Knoten ENV zu erstellen, wird bei der Erstellung festgelegt . Wenn wir also den lokalen Entwicklungsserver verwenden, ist dies ein Entwicklungs-Build. Die App ist gebaut, aber direkt unter der Haube, das sehen wir nicht. Grund sehen wir, dass der Knoten ENV auf Entwicklung gesetzt ist, da dies unser Entwicklungs-Build ist und diese Variable wiederum während der Build-Zeit gesetzt wird. Wenn wir den Befehl build ausführen, wird der Knoten ENV in unserer App auf Produktion gesetzt und wir können diese Variable verwenden , den Service Worker zu registrieren oder die Registrierung aufzuheben. Lass uns versuchen, das zu tun. Wir werden hier eine einfache Bedingung hinzufügen. Wenn process.env.node ENV gleich Produktion ist, rufen Sie in diesem Fall bitte die Registrierung von Servicemitarbeitern an und registrieren Sie sich. Cool. Versuchen wir nun, die Anwendung erneut bereitzustellen. Sobald es bereitgestellt ist, werden wir sehen, wie sich alles geändert hat. Wir sehen uns in einer Sekunde dort. Hallo nochmal. Jetzt ist unsere Anwendung bereitgestellt. Mein erster Deployment-Workflow hier. Jetzt kehren wir zu unserer Anwendung zurück, und wenn wir sie aktualisieren, wurde jetzt etwas geändert. Zuallererst haben wir dieses Installationssymbol hier in der Suchleiste, aber wir werden es gleich berühren. Wir sind an der Registerkarte Bewerbung hier interessiert. Wenn wir hier zum Abschnitt Service Worker gehen, haben wir jetzt service-worker.js. Diese service-worker.js wurde erneut durch diese Registerfunktion registriert , die aus der ServiceWorkerRegistration-Datei importiert wird . Das ist die Registerfunktion, klicken Sie auf die "service-worker.js“, die auf der box-office-apps/service-worker.js verfügbar ist. Es ist Register, dieser Service Worker im Browser, als auf unsere Anwendung zugegriffen wurde, und jetzt wird dieser Service Worker ausgeführt, was bedeutet, dass der Service Worker jetzt aktiv ist und alle ausgehenden Anfragen abfängt und sie im Browser zwischenspeichert . Sie können sehen, dass, wenn ich es erneut aktualisiere, meine Dateien, zum Beispiel dieser Index-HTML, von ServiceWorker bereitgestellt werden, genau wie die übrigen Dateien hier. Lass mich „Cache leeren und Hard Reload“ starten. Mach es nochmal. Eigentlich hat sich nichts geändert, aber die App wird immer noch von ServiceWorker aus bedient. Wenn ich mich nicht irre, ist es hier irgendwo im Cache-Speicher. Sie können es im Cache-Bereich auf der Registerkarte Anwendung sehen . Unter Cache-Speicher sehen Sie nun, wo sich die Box Precache befindet, Dateien, die im Cache gespeichert werden. Einfach so können wir den Leuchtturm betreiben. Befehlen Sie erneut und sehen Sie, was wir derzeit für die Checkliste für progressive Web-Apps haben. Lass uns gehen. Wir haben meine App geprüft. Nur ein paar Sekunden, wir gehen ganz nach unten und sehen jetzt, dass die Progressive Web App jetzt installierbar und nicht wirklich optimiert ist . Nun, es ist eigentlich optimiert, aber wir haben hier nur einen Punkt. Manifest hat kein maskierbares Symbol, aber das werden wir im nächsten Video beheben, wenn wir das Symbol, den Namen unserer App und einige weitere Dinge anpassen den Namen unserer App . Im Moment können wir sehen, dass unsere Anwendung installierbar ist. Das Symbol, das wir hier in der oberen Ecke der Suchleiste sehen , können wir darauf klicken und unsere Anwendung installieren , als wäre es eine native App. Wenn Sie ein Mobilgerät verwenden, das Popup auch angezeigt, sobald Sie auf Ihre App für ein Mobilgerät zugreifen. Sie werden das Popup sehen, in dem steht, Hey, Sie können diese Website tatsächlich als Anwendung installieren. Wenn Sie auf „Installieren“ klicken, wird die Website zu Ihrem Startbildschirm hinzugefügt, als wäre die Website zu Ihrem Startbildschirm es eine native Anwendung. Wenn ich jetzt zu meinem Desktop zurückkehre, habe ich hier diese App namens Create React App Sample. Moment hat es diesen seltsamen Namen weil dies in der Manifestdatei angegeben ist , die wir im nächsten Video anpassen werden. Aber die Sache ist, dass dies jetzt eine Anwendung ist, sie ist installierbar. Wenn ich darauf klicke, können Sie sehen, dass es jetzt nicht in einem Browser geöffnet wird. Es öffnet sich in einem eigenen Fenster als wäre es eine native echte Anwendung. Es wird genauso funktionieren wie zuvor. Ziemlich cool. Sie können sehen , dass der neue Tab tatsächlich im Browser geöffnet wurde . Das ist die Sache mit progressiven Web-Apps. Idealerweise sollten Sie nichts in neuen Tabs öffnen, sondern den aktuellen Tab verwenden und nur, sagen wir, eine Seite für die Navigation verwenden, ohne neue Tabs zu verwenden. Aber jetzt haben wir immer noch die Anwendung, die als native App läuft. All dies wurde durch den Einsatz von ServiceWorker erreicht , der uns die grüne Checkliste für progressive Web-Apps gab . Zusammenfassend lässt sich sagen, dass eine progressive Web-App nur eine Webanwendung ist, die einer bestimmten Liste von Dingen folgt. Zum Beispiel muss es über einen Service Worker verfügen, die Anwendung muss etwas Caching verwenden, damit sie offline verfügbar ist. Dann muss es auch über HTTPS und ein paar andere Dinge, die Sie in Lighthouse finden, bereitgestellt werden. Versuchen wir es noch einmal. Was haben wir noch hier? werden mehrere Tabs geöffnet. Lass mich es auffrischen. Was willst du? Analysieren Sie das Laden der Seite. Schauen wir uns die Liste einfach schnell noch einmal an. In der Liste haben wir, lassen Sie mich sehen, die Themenfarbe, konfigurierten benutzerdefinierten Begrüßungsbildschirm, das Touch-Symbol, das spezifische Viewport-Tag und das Manifest, um das wir uns sehr bald kümmern werden, Servicemitarbeiter. All diese Dinge machen eine Website, progressive Web-App, einfach so einfach. Ein weiteres Mal ist der Service Worker, als Proxy im Browser registriert wurde , um die Anfrage abzufangen , das Herzstück des Ganzen. Nur als Servicemitarbeiter konnten wir diesen installierbaren Abschnitt hier erreichen. Unsere Anwendung wurde jetzt sowohl installierbar als auch offline verfügbar. Ich denke, es war ziemlich klar was Progressive Web App genau ist, was Service Worker ist und wie alles ungefähr funktioniert. Lassen Sie uns endlich zu unserer Anwendung zurückkehren und die Änderungen, die wir vorgenommen haben, bestätigen. Zuerst haben wir Eslintrc bearbeitet, sodass wir die Datei process.env ohne Warnungen oder Fehler verwenden können , und wir überprüfen das. Wenn wir uns in der Erstellungsphase befinden, verwenden Sie bitte ServiceWorkerRegistration.register. Dadurch wird die Datei service-worker.js im Browserkontext registriert . Cool. Lassen Sie uns diese Änderungen vornehmen. Aktivieren Sie den Servicemitarbeiter in der Produktionsumgebung. Ich aktualisiere mein GitHub-Repository und das war's vorerst. Im nächsten Video werden wir uns mit dem Problem befassen , das wir in Lighthouse gesehen haben, sodass es zu 100 Prozent grün sein wird. Wir sehen uns dort. 90. 34 Fixierung der Basis-URL zum korrekten Auflösen von Bildern auf Github-Seiten: Hallo zusammen. Im letzten Video haben wir diese coole progressive Web-App namens Box Office erstellt . Aber hier ist ein Problem, das ich tatsächlich übersehen habe, und es geht wieder um die Basis-URL in unserer App. Wenn Sie bemerkt haben, dass Sie nach bestimmten Sendungen suchen und diese kein Bild haben, versuchen wir, dieses nicht gefundene Bild als PNG anzuzeigen. Alle unsere Dateien werden jedoch unter dem Box Office-App-Präfix auf GitHub Pages-Hosting bereitgestellt . Dieses Bild kann jedoch nicht geladen werden, da Sie sehen können, dass es immer 404 ist , weil es in dem Pfad, den wir zu laden versucht haben, nicht existiert . Wir haben das Präfix nicht angegeben. Wie können wir das tatsächlich beheben? Wenn wir zu unserer App zurückkehren und Bild suchen, das nicht gefunden wurde, geben wir es einfach so an. Nur ein statischer spezifischer Pfad. Aber da wir das Präfix haben, müssen wir es irgendwie verstehen. Eine Möglichkeit , das zu beheben, besteht darin , das Bild nicht im öffentlichen Ordner zu verwenden, sondern darin , das Bild nicht im öffentlichen Ordner zu verwenden, es tatsächlich im Quellordner abzulegen und es dann so zu verwenden, als wäre es, sagen wir, ein Modul. Dann wird es von der zugrunde liegenden Webpack-Konfiguration verarbeitet und der Basispfad wird automatisch aufgelöst. Das Gleiche wie wir es mit dem Ankertag und der Link-Komponente gemacht haben . Nun, zumindest ist die Idee dieselbe. Ich werde das nicht gefundene Bild einfach irgendwohin verschieben, sagen wir in den Bibliotheksordner, das PNG-Bild nicht gefunden. Anstatt jetzt überall auf das nicht gefundene Bild-PNG zu verweisen , importiere ich einfach das nicht gefundene Bild aus der Bibliothek, nicht gefundene Bild-PNG. Vielleicht nenne ich es nicht gefundene Bildquelle und spezifiziere es einfach so. Dann kopiere ich diesen Import und mache überall den gleichen Import. Hier, das habe ich gerade auch in der Besetzung gemacht. Lassen Sie mich hier den richtigen Pfad sehen. Wir gehen einen Ordner zurück, den zweiten Ordner, die Bibliothek, das PNG-Bild wurde nicht gefunden. Wir geben die Bildquelle nicht gefunden an, genauso wie wir es innerhalb des Showrasters tun werden. Importiert keine Bildquelle von. Wir gehen wieder zurück, zurück zur Bibliothek, nicht gefundenes PNG-Bild, keine gefundene Quelle und dasselbe. Endlich werden wir das in showMainData tun. Keine Bildquelle aus der Bibliothek gefunden, kein PNG-Bild gefunden. Lassen Sie uns nun versuchen, die App erneut bereitzustellen, und lassen Sie uns sehen, wie sich das genau in unserem endgültigen Code widerspiegeln wird. Wir sehen uns in einer Minute, sobald dieser Code bereitgestellt ist. Jetzt wurde die Anwendung erfolgreich bereitgestellt. Kommen wir zurück zu unserer App. Lassen Sie uns nun die Seite aktualisieren. Unsere letzte Suche war „Hallo“. Wir suchen wieder danach. Dieses Mal sehen wir auch nicht gefunden. Warum ist das so? Das Problem ist, dass unser aktuelles Image, unser vorheriges Bild, von Service Worker bereitgestellt wird. Es wurde nicht aktualisiert. Es wird aus dem Cache bereitgestellt, was bedeutet, dass wir den Cache leeren müssen , um die Updates zu sehen. Ich klicke mit der rechten Maustaste auf die Schaltfläche Aktualisieren der oberen linken Ecke und klicke auf „Cache leeren“ und „Hard Reload“. Alternativ kann ich zur Registerkarte „Anwendung“ gehen, zu „Speicher und auf „ Seitendaten löschen“ klicken. Es löscht den gesamten Cache im Browser speziell für diese Website. Lassen Sie mich auf „Seitendaten löschen“ klicken. Dann erfrische ich mich einfach. Dann suche ich nach „Hallo“. Dieses Mal wurde unser Antrag erfolgreich gelöst. Sie können sehen, dass wir anstelle der tatsächlichen URL dieses Base-64-Datenbild sehen. Was ist das? Da uns unser Image von der Create React-App zur Verfügung gestellt wurde , die zugrunde liegende Webpack-Konfiguration darum gekümmert. In der Dokumentation der Create React-App wurde irgendwo erwähnt, dass, wenn das Bild eine geringere Größe als den bestimmten Schwellenwert hat , die Datei zu verarbeiten und die Datei im öffentlichen Ordner bereitzustellen. Das Bild wird in das Base-64-Format konvertiert und dann, sagen wir, Inline. Diese, sagen wir, eine lange Zeichenfolge steht für unser Bild, nicht als Datei, sondern als Zeichenfolge. Ziemlich cool. Jetzt sieht alles gut aus soweit. Im nächsten Video werden wir der Anwendung, wie versprochen, den letzten Schliff geben. Wir werden benutzerdefinierte Symbole und benutzerdefinierte Namen verwenden, damit unsere Anwendung perfekt ist. Wir sehen uns dort. 91. 35 Finale Note: Hallo zusammen. In diesem Video geben wir unserer App endlich den letzten Schliff. Wir werden Symbole erstellen, wir werden Titel ändern, damit die Anwendung endlich perfekt ist. Lass uns gehen. Aber bevor wir das tun, lassen Sie uns die Änderungen vornehmen, die wir im vorherigen Video vorgenommen haben. Wie Sie sich erinnern, haben wir im vorherigen Video unser Problem mit dem Bild behoben. Lassen Sie uns schnell alles zur Bühne hinzufügen und dann alles bestätigen, indem wir sagen das Bild aus der Öffentlichkeit verschoben wurde oder das nicht gefundene Bild einfach zur Quelle verschieben und es dann importieren , anstatt es aus dem öffentlichen Ordner bereitzustellen. Ziemlich lang, aber es lohnt sich. Dann schiebe ich alles auf Master und lass uns endlich zu unseren Icons zurückkehren. Zunächst müssen wir uns für ein Symbol entscheiden , das wir hier in der Registerkarte verwenden werden. Wenn wir zu dem Gast zurückkehren, den wir für die Kinokasse haben, haben wir hier dieses Geldsymbol , das ich für uns vorbereitet habe. Wir können dieses Symbol einfach hier herunterladen. Ich werde es in den Ordner Downloads legen. Dann müssen wir eine Reihe von Symbolen generieren, die wir im öffentlichen Ordner platzieren werden. Im Moment haben wir diese grundlegenden Reaktionssymbole , die wir jetzt ersetzen können, aber zuerst müssen wir diesen Satz von Symbolen generieren. Normalerweise entscheiden Sie sich zuerst für ein Symbol , das Sie verwenden möchten. Es kann zum Beispiel deins sein. Es ist nicht zwingend erforderlich, dieses spezielle zu verwenden. Wenn Sie Ihre haben, können Sie sie gerne verwenden. Wir gehen zu Resources.md. Hier unten finden wir diesen Favicon-Generator , den ich für uns hinterlassen habe. Wir gehen auf diese Seite. Wir klicken hier, wir laden das Bild hoch, das wir für das Icon-Set verwenden möchten. Wir laden herunter. Im Ordner Downloads haben wir jetzt dieses favicon_io. Es ist im Archiv. Im Moment werde ich alles in einen Ordner extrahieren. Dies ist die Reihe von Symbolen , die ich irgendwann habe. alles werden wir nicht nutzen. Wir werden diejenigen wiederverwenden, die bereits im öffentlichen Ordner vorhanden sind . Ich öffne einfach den öffentlichen Ordner hier. Anstelle von logo192 von React verwende ich einfach das , das ich hier habe. Ich kopiere es. Ich ändere den Namen. Ich lösche den vorherigen. Ich benenne diesen um. Dann mache ich dasselbe mit diesem Logo. Ich lösche es. Ich verschiebe den in der gleichen Größe hierher. Ich gebe ihm den gleichen Namen. Favicon wird komplett ersetzt. Das war's. Inzwischen ist alles bereit. Wenn wir zu manifest.json gehen, verweisen wir hier auf all diese Symbole. Diese Symbole werden verwendet, wenn Ihre Anwendung auf dem Startbildschirm installiert wird. Was auch immer Sie hier angeben , diese Manifestdatei weist Progressive Web App an, diese Informationen zu verwenden. Wenn wir hier beispielsweise React-App als Kurznamen angeben, sehen die Benutzer dies, wenn sie Ihre Anwendung auf dem Startbildschirm hinzufügen . Wir haben keinen langen Namen für unsere App. Wir verwenden nur Box Office für den Kurznamen und Box Office für den regulären Namen. Symbole bleiben hier, aber wenn wir zu unserer Anwendung zurückkehren und uns an unseren vorherigen Lauf für Lighthouse erinnern , hatten wir dieses Problem mit dem maskierbaren Symbol. Schauen wir uns noch einmal an, was genau wir da hatten. Auch hier betreibe ich Lighthouse outdate. Es dauert hier ein paar Sekunden. Wir gehen ganz nach unten und sehen, dass unsere Anwendung installierbar ist. Alles ist gut, aber wir haben kein maskierbares Symbol. Wir gehen hierher. Sie lesen hier über maskierbare Symbole. Dies ist ein neues Format. Im Grunde müssen wir nur ein weiteres Symbol zu manifest.json hinzufügen und angeben, dass es den Zweck eines maskierbaren Symbols hat. Wir können diesen Maskable.app Editor verwenden , um ein vorhandenes Symbol in ein maskierbares Symbol zu konvertieren. Vielleicht lassen Sie uns das schnell machen. In der rechten Ecke klicke ich auf die Schaltfläche Hochladen und gebe unser Symbol an. Nun, es sieht so aus, aber ich wollte, sagen wir, einen weißen Hintergrund haben , damit unser maskierbares Symbol so aussieht. Cool. Dies wird unser maskierbares Symbol sein. Das wird unser Problem mit dieser Checkliste in Lighthouse lösen. Wir klicken auf Exportieren. Nehmen wir an, es wird die maximale Größe sein. Wir laden herunter. Im Ordner anzeigen. Dies wird ein maskierbares Symbol sein, das wir in den öffentlichen Ordner legen werden. Ich verschiebe es hierher, und jetzt müssen wir das maskierbare Symbol angeben. Das ist in meinem manifest.json und sag, dass maskable_icon.png, die Namen müssen übereinstimmen, vom Typ sein wird, lass mich sehen. Wo ist es? Wo sind diese Informationen über maskierbare Symbole? Hier. Es wird einen maskierbaren Zweck haben. Wir kommen zurück, wir spezifizieren den Zweck maskierbar. Wir sparen. Das ist es. Jetzt wird unsere Anwendung überall erstaunlich gut aussehen, mit unseren eigenen Titeln, mit unseren eigenen Symbolen. Lassen Sie uns alles noch einmal bereitstellen. Warte, entschuldige mich. Ich bin auf den falschen Weg gegangen. Ich wollte zuerst alles bereitstellen. Npm run deploy. Warten wir jetzt einfach ein paar Minuten und wir sehen uns, sobald die Anwendung bereitgestellt ist. Die Anwendung wurde erfolgreich bereitgestellt. Gehen wir zurück zur App und sehen uns das Endergebnis an. Bevor wir das tun, bevor wir die Seite aktualisieren, löschen wir einfach den Speicher erneut, um alle Caches zu löschen, was auch immer wir im Browser gespeichert haben, Cache leeren und aktualisieren. Jetzt können Sie sehen, dass wir hier unser benutzerdefiniertes Symbol haben , benutzerdefinierte Titel. Alles wird jetzt so verwendet, wie wir es in der Manifestdatei angegeben haben . Sie können tatsächlich unter dem Tab Bewerbung hier auf Manifest klicken und verschiedene Informationen zu Ihrer Bewerbung sehen . Lassen Sie uns nun sehen, wie es aussehen wird, wenn es zum Startbildschirm hinzugefügt wird. In einem der vorherigen Videos haben wir, als wir einen der Servicemitarbeiter ihn registriert haben, hinzugefügt und ihn registriert haben, unsere App zum Startbildschirm hinzugefügt. Sie können jedoch sehen, dass es hier nicht aktualisiert wurde. Lassen Sie es uns tatsächlich ausführen und zuerst deinstallieren und erneut installieren. Was ich tun werde, ich klicke hier einfach auf drei Punkte. Klicken Sie auf Uninstall Create React App Sample. Überprüfe die Markierung. Löschen Sie auch Daten aus Chrome. Jetzt ist es weg. Ich werde zu meiner Anwendung im Browser und sie noch einmal installieren. Installieren Sie Box Office. Installiere. Jetzt, bumm. Ich gehe wieder zu meinem Startbildschirm zurück, in meinem Fall ist es der Desktop. Jetzt habe ich meine Box Office-Anwendung, die wie jede andere App auf meinem Computer aussieht. Wenn ich darauf klicke, haben wir immer noch alles beim Alten. Ich würde sagen, das ist es. Jetzt erstellt ihr diese tolle Anwendung, die offline funktioniert, die installierbar ist und mit den verschiedenen dynamischen Daten von APIs arbeitet . Du hast viele Konzepte gelernt. Ich würde sagen, Sie haben Ihr React-Wissen damit erheblich erweitert, aber jetzt ist es soweit. Aber bevor wir diesen beenden, lassen Sie uns tatsächlich alle unsere hinzugefügten Symbole übernehmen. Ich werde alles zur Bühne hinzufügen. Ich werde alles begehen. Nehmen wir an, es wurden benutzerdefinierte Symbole hinzugefügt und manifest.json aktualisiert. Lassen Sie uns alles in den Master-Branch verschieben , damit die Änderungen im GitHub-Repository übernommen werden . Das ist es. Herzlichen Glückwunsch dazu. Im nächsten Video werden wir zusammenfassen, was wir genau mit der Box Office gelernt haben. Wir sehen uns dort. 92. 36 Zusammenfassung: Hey, ja. In diesem Video werden wir alles zusammenfassen, was wir bisher an Box Office gelernt haben . Jetzt haben wir diese tolle progressive Web-App, die offline funktioniert, die installierbar ist, die mit API funktioniert und sie sieht einfach cool aus, nicht wahr? Lass uns vielleicht zu unserer Commit-Historie gehen und das schnell durchgehen. Zuallererst verwenden wir als Tool, sagen wir als Boilerplate für die Erstellung von Kinokassen, sagen wir als Boilerplate für die Erstellung von Kinokassen, die Create React App, die die zugrunde liegende Webpack-Konfiguration verwendet, die wir mithilfe des React-Scripts-Pakets verwenden. Jetzt weißt du, was React-Skripte sind. Jetzt wissen Sie, was Create React App ist, was bedeutet, dass Sie wissen, wie man mit Create React Boilerplate arbeitet . Wir haben auch Prettier und ESLint verwendet, aber das ist nichts Neues. Sie kennen diese Tools bereits. Lass uns sehen. Wir haben von React Router erfahren, weil wir, wie Sie wissen , standardmäßig und in React , standardmäßig und in React keine integrierte Lösung für das Routing in unserer Anwendung haben . Bei React dreht sich alles um Rendern, aber es geht nicht um eine so einfache Navigation. Aus diesem Grund haben wir eine Bibliothek namens React Router verwendet , um die Navigation innerhalb unserer Anwendung zu erreichen . Lass uns sehen. Nach React Router haben wir dann verschiedene Funktionen hinzugefügt, um mit dynamischen Daten zu arbeiten, um mit der API zu arbeiten. Wir haben die integrierte Browser-API namens „Fetch“ verwendet . Um Daten von der API abzurufen, haben wir viele wiederverwendbare Funktionen erstellt , die wir in unserer gesamten Anwendung verwenden, und sie sehen sehr einfach aus. Wir behandeln alle potenziellen Addierer innerhalb von Komponenten, falls etwas schief geht. Wir behandeln Fehler richtig, indem wir Try-Catch-Blöcke in unseren Komponenten verwenden . Wir haben auch herausgefunden, dass wir, wenn wir Daten abrufen wollen, wenn die Komponente gemountet wird, wenn wir einige Interaktionen auf der Seite ausführen, anstatt „useEffect“ zu verwenden, eine Bibliothek zum Abrufen von Daten verwenden können . In unserem Fall haben wir die React Query-Bibliothek kennengelernt , mit der wir Daten abfragen können, wenn die Komponente gemountet wird oder wir eine Suche auf der Seite durchführen. Jetzt kennen Sie sich mit Bibliotheken zum Abrufen von Daten aus. Bibliotheken zum Abrufen von Daten sind in modernen React-Anwendungen ein Weg . Es gibt empfohlene Methoden, um mit Daten zu arbeiten , da mit dem Wachstum Ihrer Anwendung immer mehr Anforderungen gestellt werden. Bibliotheken zum Abrufen von Daten werden uns helfen , all das mit Leichtigkeit zu verwalten. Jetzt, wo ich auch „useEffect“ erwähnt habe, wissen Sie jetzt, was „useEffect“ macht „useEffect“ können wir eine Nebeneffektfunktion ausführen Nebeneffektfunktion Wenn sich etwas in der Komponente ändert, haben wir eine Reihe von Abhängigkeiten in useEffect. Lass es mich hier im Code finden. Wir haben hier eine Reihe von Abhängigkeiten, und wenn sich etwas innerhalb der Rate ändert, wenn sich der Wert ändert, führen wir diese Nebeneffektfunktion aus. Ganz zu schweigen davon, dass wir zusätzlich zu „useState“, „useReducer“ und „useEffect“ auch unsere eigenen benutzerdefinierten Hooks erstellt useState“, „useReducer“ und „useEffect“ auch unsere eigenen benutzerdefinierten Hooks haben. Diese benutzerdefinierten Hooks sind wie alle anderen Hooks, aber mit zusätzlicher Logik. Jetzt wissen Sie, dass Sie für den Fall, dass Sie eine wiederverwendbare Logik für integrierte Hooks erstellen müssen , einfach einen benutzerdefinierten Hook erstellen und die gesamte Logik hineinlegen. Schließlich wird es wiederverwendbar. Wir haben auch mit dem Browserspeicher gearbeitet, wir haben mit dem Sitzungsspeicher gearbeitet, wir werden mit lokalem Speicher arbeiten. Sie wissen, dass Sie jetzt Daten im Browser persistieren können . Dies ist natürlich kein Ersatz für eine Datenbank. Wenn Sie jedoch Informationen wie die Sucheingabe oder Benutzereinstellungen irgendwie speichern müssen , können Sie diesen Speicher problemlos verwenden. Mal sehen, was wir sonst noch hier haben? Kommen wir zurück zur Commit-Historie. Hier haben wir auch diese dynamischen Seiten erstellt. Dies ist auch Teil von React Router, aber jetzt kennen Sie das Konzept dynamischer Seiten. Sie erstellen eine Vorlage oder ein Skelett und dann holen Sie sich den dynamischen Parameter aus der URL, in unserem Fall war es show ID Wenn ich also nach einer Show suche, gehe ich zur Seite innerhalb der URL anzeigen, wir haben die Show-ID, die wir in der Komponente abrufen , und dann verwenden wir diese Show-ID, um Daten abzurufen. Auf diese Weise können wir dynamische Seiten erreichen. Jetzt kennen Sie dieses Konzept. Mal sehen, was wir auch hier haben? Nochmals „useQuery“ über Query-Daten, andere anfängliche Logik mit benutzerdefinierten Hooks, das haben wir besprochen, wir haben auch gestylte Komponenten installiert. Eine CSS- und JS-Runtime-Lösung für das Styling von Komponenten. Jetzt können Sie entscheiden, was für Sie besser ist. Verwenden Sie entweder gestylte Komponenten oder etwas sehr Ähnliches oder verwenden Sie die traditionelle Methode mit CSS-Dateien. Denn jetzt kennen Sie die Nachteile, jetzt wissen Sie, was die Vorteile sind und Sie sind derjenige, der entscheidet, was Sie verwenden werden. Ich persönlich bevorzuge die traditionelle Art , Apps zu gestalten, und ich bin kein großer Fan von CSS und JS. Außerdem fügen wir diese Fading-Animation als Ersatz für das von mir erwähnte Paket React-fade-in hinzu. Ich habe es nur einmal erwähnt, aber darauf habe ich nicht viel Wert gelegt. Wir benötigen weniger Abhängigkeiten in unseren Anwendungen. Je weniger Abhängigkeiten desto besser, da Sie weniger Dinge verwalten müssen. Ich denke, es macht Sinn, und Sie werden sich in Zukunft an diese Regel halten , weil es zu Ihrem eigenen Besten sein wird. Wir haben auch progressive Web-Apps kennengelernt. Was ist die Progressive Web App? Es ist nur eine Webanwendung, die einer bestimmten Liste von Dingen folgt , zum Beispiel benötigen Sie benötigen eine Service-Worker-Datei, sie muss über HTTPS bereitgestellt werden, sie muss diese Manifestdatei haben , und wenn die Anwendung, die Website, all diese Anforderungen erfüllt, wird sie zu einer Progressive Web App. Es ist wie eine betitelte Website und der Titel ist Progressive Web App. Die Anwendung wurde aufgrund des Servicemitarbeiters offline verfügbar . Jetzt wissen Sie, dass Service Worker ein Skript ist , das irgendwo im Browser außerhalb unserer Anwendungskontexte läuft und alle Anfragen, alle ausgehenden Anfragen, ausgehenden Anfragen, und etwas mit ihnen macht. In unserem Fall verwenden wir Service Worker, um alle ausgehenden Anfragen zwischenzuspeichern. Die Anwendung funktioniert offline, sobald sie irgendwo auf dem Startbildschirm installiert ist. Ganz am Ende haben wir unsere eigenen benutzerdefinierten Icons hinzugefügt, indem wir die mir generierten [unverständlichen] Symbole verwendet haben, die ich mit Ihnen geteilt habe , aber das ist nicht wirklich wichtig, Sie können jeden Generator verwenden, aber die Sache ist jetzt, dass Sie den gesamten Ablauf sehen können, wie die Anwendung von Grund auf erstellt wird , bis hin zum Design und einigen Änderungen in der Zukunft. So etwas. Herzlichen Glückwunsch, Sie haben einen sehr guten Job gemacht. Für den Moment ist das alles. Wir sehen uns im nächsten. 93. Was ist Firebase?: Hey, willkommen in der neuen Sektion hier. Wir werden über zurück in Lösung für unser endgültiges Projekt reden. Wann immer wir eine einzelne Seite App erstellt haben, um mit der Datenbank zu kommunizieren, würden wir normalerweise unseren eigenen AP I Server erstellen oder einen vorhandenen verwenden. Moderne, kleine oder mittelgroße Anwendungen nicht unbedingt direkt zurück und von nackten Knochen selbst die meiste Zeit, die sie tun, aber es hängt von der Art der Anwendung ab. Wäre es nicht schön, wenn wir hinten eine Obstruktionsschicht hätten? Und so brauchen wir es nicht selbst einzurichten und uns mehr auf die Anwendung zu konzentrieren? Nun, Feuerbasis kann uns helfen, das zu erreichen. Es wird als Service-Lösung winkt, die uns die Abstraktionsschicht um den Rücken gibt und es tut. Noch mehr Firebase ist Emma Bile und Web Platform, die auf der Google Cloud Platform aufgebaut ist. Es bedeutet, dass es zusammen mit jedem Google-Cloud-Dienst verwendet werden kann. Von nun an brauchen wir uns keine Sorgen über die Erstellung unserer eigenen AP-I-Datenbank Wartungsdatei zu machen, alles bereits da ist und auf uns wartet. Also in unserem Code, anstatt eine Anfrage an ein A P I zu senden, um Daten abzurufen. Wir würden nur eine Bibliothek verwenden, die Funktionen bereits ziemlich gut für uns hat. Wie bekommen Sie dieses Dokument von I t und diese Funktion wird mit der Datenbank interagieren. Es hat wirklich Zeit singen Unterstützung und schnellere Abfragen. Und es ist auch gut dokumentiert, was wirklich wichtig ist zu verstehen. Bachir. Welche Feuerbasis ist im nächsten Video, sondern wird durch Feuerbasis Dienste gehen und wir werden versuchen sie zu bewerten. Wir sehen uns dort. 94. Übersicht über Firebase Services: Hey, lasst uns schnell die Feuerbasis und ihre Dienste erkunden. Für dieses Video habe ich feuerbasiertes Dashboard aus unserem letzten Projekt hier eröffnet. Wir können jeden Dienst, den wir innerhalb eines Firebase-Projekts verwenden, überwachen und verwalten. Wir könnten mehrere APS verwalten. Es kann mehrere Runden-APs geben, und das wird dieselbe Datenbank teilen. Oder wenn wir Android-, IOS- und Web-Anwendungen hätten , könnten wir alle von einem einzigen Dashboard auf der linken Seite verwalten. Innenseite Seitenleiste. Unter entwickeln können Sie eine Liste von Haupt-Firebase-Diensten sehen. Lasst uns eins nach dem anderen gehen. Eine Syndization. Mit dem Service sind wir in der Lage, sich anzumelden und Benutzer über unsere Anwendungen hinweg zu authentifizieren. Das ist wirklich cool, denn, sagen wir, wenn wir mit Google auf der Website schauen und später in die Android-Anwendung mit dem gleichen Konto schauen, werden die Daten die gleichen sein. Es gibt viele verschiedene Zeichen und Methoden für uns zur Verfügung, und die Sache ist, dass sie alle konfigurierbar sind. Es waren nur ein paar Klicks. Dieser Service ist abgeschlossen. Es hat ein Mail-System integriert, das alle E-Mail-Verifizierungen und Vertiefungen verarbeitet. Wir brauchen Sie nur die Vorlage von der E-Mail anpassen. Außerdem unterstützt es SMS-Verifizierung, die auch wirklich cool ist. Dann geht die Datenbank. Firebase hat zu Datenbasis für jetzt Fire Store und riel Zeitdatenbank gefragt. Sie beide sind Jason-basierte keine Fortsetzungs-Datenbanken mit Unterstützung für Echtzeit-Updates. Was ist der Unterschied und welche zu verwenden? Es hängt von vielen Faktoren ab, aber hier gibt es drei Hauptunterschiede. Erstens, Preismodell Feuerladen wird pro Vorgang berechnet. Lesen, Schreiben, Löschen oder Aktualisieren. Dies ist nicht gut für Hochfrequenz-Daten schreibt Echtzeitdatenbank hat dafür besser geeignet da es für Speicher und Bandbreite berechnet wird, was der perfekte Anwendungsfall für so etwas wie eine untergeordnete Anwendung ist. Zweite Abfragen. Fire Story gibt uns erweiterte und zusammengesetzte Abfragen im Vergleich zu Echtzeit-Datenbank So Echtzeit-Datenbank hat wirklich schlechte Abfrage-Builder, aber es ist gut genug, um nicht zu komplizierten Datenbankstrukturen zu verwalten. Dritte Struktur sie beide Jason basierte Fire Store hat Dokumente, Sammlungen und Untersammlungen, die Datenbank robuster machen. Echtzeit-Datenbank ist nur ein großes Jason-Objekt. Deshalb hat es Eigenart sehr Unterstützung und die meiste Zeit müssen wir ein k ein dupliziertes Daten für unser Projekt de normalisieren . Wir werden Echtzeit-Datenbank verwenden, weil wir eine Menge von Faried und Schreiboperationen haben. Und wir brauchten keine komplexen Abfragen. Wenn es keine Chat-Anwendung wäre, hätte ich den Fire Store erreicht, da es anspruchsvollere Abfragen und Datenbankstruktur hat . Außerdem sind wir nicht darauf beschränkt, auf Lee eine Datenbank zu verwenden. Wir können sowohl Feuerladen als auch Echtzeit-Datenbank in einer einzigen Anwendung kombinieren. Dann haben wir Lagerraum. Nichts zu Besonderes. Hier drüben. Hier Bubble Porter, Benutzerbilder und Audio-Dateien Firebase Hosting hier. Wir werden unsere Website bereitstellen. Es unterstützt nur statische Dateien. Wenn wir also eine serverseitige Rendering-Anwendung haben, wird dieses Hosting nicht funktionieren. Cloud-Funktionen in unserer Anwendung waren auch in der Lage, benutzerdefinierte zurück zu schreiben und den Server letzte Cloud-Funktionen zu informieren , die aus dem Mantel aufgerufen werden können. Wir werden nur eine bereitstellen, die Benachrichtigungen an Benutzer sendet. Wir werden mehr über Server sprechen zuletzt, wenn wir in das Thema Maschine zu bekommen. Lauren, erhalten erstaunliche Tool, das maschinelles Lernen Dienstprogramme wie Bilderkennung und die anderen bietet . Aber leider ist es nur für IOS und Android APS an der Unterseite verfügbar. Wir haben noch andere Dienste. Sie alle sind ergänzend und werden für die Überwachung und Analyse von eingesetzten Anwendungen verwendet. Wir können die Leistung von unserer Website aus verwalten, wie schnell sie niedrig ist und einige andere Metriken. Wir können sogar Firebase Analytics integrieren, was im Grunde Google Analytics ist, aber als Firebase-Dienst umschlossen ist, und ganz unten haben wir Dienste beschränkt, um Benutzer für unser Projekt zu engagieren. Wir werden nur Firebase Cloud-Messaging verwenden, die es uns ermöglichen, Echtzeitbenachrichtigungen an Benutzer zu senden , wenn der Browser dafür unterstützt. Und das ist es im Grunde. Dies war auf hohem Niveau Überblick aus Kamin. Aber was ist mit der Sicherheit? Ist es sicher genug? Wir werden herausfinden, dass in den nächsten Medien sehen Sie dort. 95. Firebase: Hey, mal sehen, wie sicher Firebase iss. Da wir keinen serverseitigen Code haben, greifen wir von Client-Seite auf die Datenbank zu. Wie werden wir irgendwelche sensiblen Daten offenlegen? Ja und nein. In Kamin Datenbanken sind über öffentliche Euro zugegriffen. Dies ist ein Teil des Konflikts. Nehmen wir an, wir haben einige Daten innerhalb der Datenbank. Wir haben öffentliche Ihre el No. Einen auch. Und wenn Random Person versucht, auf den Ural zuzugreifen und wir die Datenbank nicht geschützt haben, kann diese Person alle Daten erhalten, ob sie öffentlich sein soll oder nicht, um unbefugten Zugriff zu verhindern, ihre Sicherheitsregeln. Diese Regeln definieren, wie auf Daten zugegriffen werden kann und von wem. Das bedeutet, dass das Sicherheitsniveau davon abhängt, wie gute Sicherheitsregeln geschrieben werden. Es ist eine gute Praxis, die Datenbank standardmäßig nach unten zu schauen und dann nur Regeln. Wie wir Code schreiben, gelten Sicherheitsregeln für Lee für Sie Kunden. I Wenn wir ein benutzerdefiniertes Backend mit Cloud-Funktionen schreiben, gelten diese Regeln nicht, wenn die Anwendung wächst. Manche Leute finden es schwer zu schreiben, um Rituale zu suchen. Aus diesem Grund nutzen sie Cloud-Funktionen und führen Server selbst bei der Validierung durch. Dasselbe gilt für Cloud-Speicher. Wir haben öffentliche, die krank sind und Regeln standardmäßig. Zugriff auf den Speicher ist nur von angemeldeten Benutzern möglich. In den meisten Fällen funktioniert es gut. Aber es bedeutet nicht, dass, wenn wir ein Bild hochladen, das wir teilen möchten, dieses Bild gesperrt wird. Jede hochgeladene Datei kann öffentliches Europa haben. Alles klar, das ist es für die Sicherheit. Ich hoffe, es war umfassend und prägnant. mit Was istmitder Preisgestaltung? Ist Firebase frei? Das werde ich im nächsten Video rausfinden. Wir sehen uns dort. 96. Firebase: Hey, mal sehen, ob wir etwas bezahlen müssen, um die Feuerbasis zu benutzen. Wie für draußen, gibt es zwei Pflanzen zur Verfügung. Spark and blaze gezündet Plan ist völlig kostenlos und es kommt mit ein paar Einschränkungen. Polizeiplan ist Pay, wie Sie gehen Modell. Beide von ihnen haben sehr Generäle freakier Und selbst wenn Sie abonniert sind Blaze Plan, es sei denn Ihre APP hat eine Menge von aktiven Benutzern, Sie werden nichts für uns bezahlen, um sicherzustellen, dass wir nicht bekommen aufgeladen Spark-Plan ist Ordnung. Mit den jüngsten Aktualisierungen Ihrer Feuerbasis und Google Cloud, um Cloud-Funktionen nutzen zu können ,müssen wir den Blaze Plan für unser Projekt aktivieren. Mit den jüngsten Aktualisierungen Ihrer Feuerbasis und Google Cloud, um Cloud-Funktionen nutzen zu können , Aber keine Sorge, aber wir werden darauf eingehen, wenn wir mit Cloud-Funktionen beginnen. Bis dahin, Funkenplan ist unsere Wahl Für weitere Details, navigieren Sie bitte auf die Preisseite zu Avala alles selbst. Alles klar, ich schätze, das ist alles, was ich für die Feuerbasis in der Produktion abdecken wollte. Im nächsten Video werden wir Finalist angefangen, unser Projekt zu bauen. Wir sehen uns dort 97. Projektübersicht: Hey, willkommen in der neuen Sektion. Hast du eine Pause gemacht? Denn jetzt werde ich Ihnen zeigen, wie unser abschließendes Projekt aussehen wird, als wir uns jetzt zum ersten Mal auf der Website engagiert haben. Aber wir werden die Anmeldeseite sehen. Von hier aus. Wir können entweder mit Facebook oder Google fortfahren. Lassen Sie uns Google wählen. Dann werde ich nach dem zweiten Konto wählen und dann bin ich in der App. Auf der linken Seite kann ich sehen, dass Board neue Chatroom Bottoms erstellen und Chatrooms auflisten, die auf der rechten Seite verfügbar sind . Wenn ich auf entweder aus Chatrooms klicke, werde ich seine Nachrichten und ein paar andere Dinge sehen, die wir nur in einer Sekunde behandeln werden. Beginnen wir zuerst mit Dashboard Wenn ich also von hier aus darauf klicke, kann ich mein Konto verwalten. An der Spitze kann ich sehen, dass ich jetzt mit Google verbunden bin, und ich kann auch mein Konto mit Facebook verknüpfen. Wenn ich also auf einen Link zu Facebook klicke, wird es mich bei Bedarf zur Eingabe meiner Phrasebook-Anmeldeinformationen auffordern. Und gerade jetzt bin ich mit dem Sprachführer verbunden. Es bedeutet, dass das nächste Mal, wenn ich mit Facebook schauen, um App zu kaufen, Ich werde mit diesem Konto verknüpft werden. Ich werde am Ende mit dem gleichen Konto, dann habe ich einen Spitznamen und ich kann von hier aus bearbeiten. Wenn ich also auf die Schaltfläche „Bearbeiten“ klicke, kann ich es ändern. Also lassen Sie es ein wenig ändern, und wenn ich auf sicher klicke, wird es aktualisiert. Außerdem kann ich mein ometer bearbeiten, wenn ich auf Select New Avatar klicke, und wenn ich dieses Bild wähle, werde ich in der Lage sein, es ein wenig auf Entwicklungszustand hinzuzufügen. Und dann klicke ich auf un hochgeladen und mein Al Atar wird aktualisiert. Und von hier aus kann ich mich auch abmelden. Als nächstes haben wir neue Chatroom Schaltfläche erstellen. Also lassen Sie uns in Europa Namen angeben, sagen wir, whoa und Beschreibung wird Whoa sein! Wenn ich darauf klicke, erscheint es hier drüben, und der Chatroom wird vorerst komplett leer sein. Lassen Sie uns also den ersten Chatraum auswählen, weil er bereits mit einigen Nachrichten gefüllt ist. Also, was haben wir hier? Also, bei jeder Nachricht, wenn wir sie drauf haben, können wir das wie Button sehen. Es wird Ihnen zeigen, wie viele diese bestimmte Nachricht halb mag. Also, wenn ich darauf klicke, Ich werde die Zehe entfernen, wie wenn ich wieder in klicken, wie zu dieser Nachricht hinzugefügt werden. Und wir können auch sehen, ob dieser Benutzer online oder offline ist. Also, wenn wir sie in diesem Kreis haben, können wir sehen, dass dieser Benutzer an diesem bestimmten Tag zu dieser bestimmten Zeit offline war. Und das ist mein Konto. Deshalb bin ich momentan online. Auch, würden Sie hier haben, wenn wir auf Benutzer Spitzname Global Sea Motile Fenster mit seinem von einem Auto . Es ist voller Name Mitglied seit diesem Datum. Also, wenn dieser Benutzer der Anwendung beigetreten ist und auch wir können Admin-Berechtigung von diesem Benutzer steuern , wenn wir derzeit ein Administrator von dieser Gruppe sind, werden wir einen Blick auf die Administratorberechtigung nur in einem Moment nehmen. Also, was haben wir sonst noch? Alle Nachrichten sind also in Datumsangaben aufgeteilt. Sie sind nach Datumsangaben gruppiert. So können Sie heute sehen, ich schicke diese Nachricht ist gestern gab es diese Nachrichten und so eine auch wir haben Paginierung aus. Nachricht ist es bedeutet, dass wir nicht alle unsere Nachrichten aus der Datenbank absenken. Wenn wir den Chat eine Last nur sehen, sagen wir 15 Nachrichten. Und dann, wenn wir auf mehr laden klicken, werden wir mehr Nachrichten sehen, die in unsere Anwendung geladen werden. In Ordnung, damit wir normale Textnachrichten an unseren Tschad senden können. Dann sind wir auch in der Lage, Dateien zu senden. Wenn ich also auf die Schaltfläche „Anhang“ klicke, werde ich diesen Sterblichen sehen. Dann klicke ich auf Upload. Ich kann auch normale Dateien auswählen. Assim juckt. Also werde ich diese Datei auswählen, dieses Bild, dass ich es öffnen werde. Es wird hier erscheinen, dass ich klicken werde, senden Sie zum Chat. Und wie Sie sehen können, wenn ich eine normale Datei schicke, Ich bestätige Laden Sie es, indem Sie einfach auf diese Ihre out klicken. Wenn es sich um ein Bild handelt, wird es hier angezeigt. Und wenn ich darauf klicke, werde ich die Vorschau sehen. Und auch, Ich werde diese Ansicht ursprünglichen Boden haben. Und wenn ich darauf klicke, wird das Original im neuen Wasserhahn geöffnet. Außerdem sind wir in der Lage, Audiodateien zu senden. Wenn ich also auf diesen Button hier drüben klicke, wird die Aufzeichnung gestartet und ich kann das sehen. Hier drüben bedeutet es, dass es momentan in meinem Mikrofon aufgenommen wird. Wenn ich also noch einmal auf diesen Button klicke, wird meine odio-Nachricht gespeichert. Das war gerade jetzt Rekord. Und ich werde es spielen können, wenn es vom Browser unterstützt wird. Alles klar, was haben wir sonst? Also oben können wir Raumnamen sehen, wir können Broadcast-Nachricht sehen. Und dieser blaue Knopf hier drüben, sie sind verwandt, aber wir werden einen Blick in einen Moment werfen. Darauf können wir auf Zimmerinformationen klicken, um die Beschreibung aus diesem Chatraum zu sehen. Und auch, wenn wir ein Admin außerhalb dieser Gruppe sind, sind wir in der Lage, diesen Aiken zu sehen. Wenn wir also darauf klicken, können wir es hinzufügen. Rauminformationen wie Name und Beschreibung. Also, wenn ich wieder auf die Schaltfläche Bearbeiten klicke, kann ich für jeden Namen, den ich will. Und dann bin ich in der Lage, es zu speichern, und es wird erfolgreich aktualisiert. Alles klar, also jetzt, über Broadcast-Nachrichten. Was sind das? Lassen Sie mich Ihnen zuerst zeigen, wie die Zugeständnisberechtigung kontrolliert werden kann. Also lassen Sie mich tatsächlich in diese App von meinem Telefon aus schauen, und ich werde Admin-Berechtigung entfernen. Also jetzt bin ich drinnen in der App, und Sie können sehen, dass der Status geändert wurde. Und jetzt sehe ich das grüne Dunkel. Ordnung, also werde ich Admin-Berechtigung für dieses Konto entfernen, das Sie jetzt sehen können. Also, was werde ich tun? Ich klicke auf mein Profil und ich klicke auf Zimmer Zulassungsberechtigung, aber von meinem Telefon. Also jetzt habe ich Admin-Berechtigung entfernt. Und jetzt kann ich nur diesen Benachrichtigungsknopf und Zimmerinformationen haben. In Ordnung, jetzt werde ich mir die Erlaubnis geben, und Sie können sehen, dass es aktualisiert wird und alles in Echtzeit ist. Also, was passiert hier? Also zunächst einmal diese Benachrichtigungsschaltfläche, So bedeutet es, dass ich möchte abonnieren oder abbestellen von Benachrichtigungen, die ich von erhalten zugibt aus diesem Chatraum. Also jetzt bin ich abonniert. Und wenn ich meine Meinung ändere, werde ich abonnieren, und ich werde überhaupt keine Nachrichten erhalten. Also, was sind das für Benachrichtigungen? Dies sind Echtzeit-Benachrichtigungen, die vom Browser auf dem Gerät angezeigt werden. Es sind also diese Berechtigungen oder Benachrichtigungen, dass, wenn ich auf diesen Boden klicke, ich Benachrichtigungen hier sehen kann und jetzt sind sie erlaubt. Also, was wird passieren? Lassen Sie mich eine Benachrichtigung von meinem Telefon an alle Benutzer in diesem Chatraum senden. Also jetzt, von meinem Handy, werde ich auf Broadcast-Nachricht hier klicken. Ich werde Titel und Nachricht angeben, und dann werde ich eine Nachricht veröffentlichen. Also lasst uns sehen, was passieren wird. Also ich Steidl, Ich werde wählen, Sagen wir Web taub und für Nachricht, Ich werde Hallo vom Telefon tippen und dann Nachricht veröffentlichen. Und wie Sie jetzt sehen können, habe ich diese Webhälfte aus diesem Raum. Ich helfe hallo von meinem Handy. Und auch ich habe diese Benachrichtigung in Fenstern. Also was? Es bedeutet, dass, wenn ich gerade auf der Website bin, ich diese Art von Benachrichtigung erhalten, dass ich schließen kann, wenn ich sagen, außerhalb des Browsers oder ich einfach den Browser vollständig schließen. Und wenn ich eine Benachrichtigung erhalte, lassen Sie mich eine andere senden und ja, ich kann sehen, dass ich immer noch eine Benachrichtigung in Windows oder in Ihrem Betriebssystem haben werde , wenn es unterstützt wird. Also das ist, was unsere riel Zeit Nachrichten auf diese Weise können Sie nicht, wenn ich Ihre Benutzer, um sie zu engagieren . Das ist also ziemlich viel über unsere Anwendung, eine Menge Dinge zu decken und ich werde es so umfassend wie möglich machen. Ich denke, Sie werden es genießen. Und ich werde dich im nächsten Video sehen. Wir werden loslegen. Wir sehen uns dort. 98. Chat-App Updates kommen!!: Hallo Leute. In diesem Video möchte ich auf bevorstehende Updates für die Chat-Anwendung hinweisen. Beide Projekte, Tic-Tac-Toe und Box Office, wurden aktualisiert, aber Updates für Chat-Anwendungen stehen noch aus. Um den Übergang von Box Office-Updates zu älteren Versionen der Chat-Anwendung so reibungslos wie möglich zu gestalten, gibt es dieses Video. Was wir tun werden, wir werden die Vorlage verwenden , die ich für uns vorbereitet habe. Wir haben diesen Repository-Chat-App-Starter. Der Link wird in den Ressourcen mit Ihnen geteilt, sodass Sie darauf zugreifen können. Du landest auf dieser Seite, gehst zu dieser Seite, dann musst du auf den grünen Code-Button klicken, dann klickst du auf „Zip herunterladen“. Dann gehst du zu dem Ort, an dem du die Zip-Datei heruntergeladen hast, und entpackst sie. Ich schnappe mir einfach den Ordner. Ich habe es zum Herunterladen bereitgestellt und hier habe ich das Projekt. Dann gehe ich zu VS Code. Ich öffne diesen Ordner als Projekt in VS Code. Hier, dieser und ich sehe das. Hier findest du das Starterprojekt. Sie haben alle benötigten Abhängigkeiten wie den Sass-Compiler, die RSuite-Bibliothek installiert , Umleitungen sind wichtig. Dann haben wir den React-Router und die Firebase-Bibliothek installiert. ESLint und Prettier sind beide hier konfiguriert. Darüber müssen Sie sich keine Sorgen machen. In der Quelle haben Sie hier Stile. Basis-App mit React Router einer älteren Version, die in Chat-Anwendungsvideos verwendet wird. Sie haben alles konfiguriert, Stile importiert, Sie sind fertig. Das einzige, was Sie tun müssen, ist zuerst Git hier zu initialisieren. Du tippst git init ein, dann fügst du alles zu Stage hinzu, dann bestätigst du das. Gleich danach müssen Sie dieses neue Git-Projekt mit Ihrem GitHub-Repository verknüpfen . Du gehst zum GitHub-Repository, erstellst ein neues Repository, dann erhältst du die Repository-URL und dann machst du git remote, fügst den Ursprung und die Repository-URL hinzu, du kopierst, wenn du ein neues Repository hier auf GitHub erstellen willst . Gleich danach müssen Sie Abhängigkeiten installieren. Wie Sie sehen können, gibt es keinen Ordner für Knotenmodule. Das einzige, was Sie tun müssen, ist einfach npm install einzugeben, und es werden alle im Paket Jason aufgeführten Abhängigkeiten installiert . Danach bist du startklar. Sie müssen das Startskript verwenden , indem Sie npm run start ausführen und mit der Entwicklung fortfahren. Der Rest bleibt gleich. Schauen Sie sich einfach die Chat-App weiter und alles wird in Ordnung sein. Das war's. Wir sehen uns dort. 99. Das Projekt erstellen: Hey, willkommen. Im Moment werden wir unsere schützen wie zuvor verwenden, wir werden erstellen Reaktor-App verwenden und in Ihrem Projekt zu erstellen, müssen wir Ordner von jedem öffnen, um unser Projekt in das Terminal zu setzen. Also von meinem Terminal, werde ich ausführen und p x erstellen reagieren, und dann den Namen des Ordners , der Chad App sein wird. Und dann werde ich NPM verwenden, weil ich Garn auf meinem System installiert habe. Und jetzt wird das EU-Projekt für uns geschaffen. Warten wir, bis alles fertig ist. In Ordnung? Scheint, als wären wir fertig. Nun öffnen wir den V-Code. Und von hier aus öffnen wir unseren neuen Ordner. Also, was haben wir drinnen wie zuvor? Unter Quelle haben wir unsere anfänglichen Dateien für Paket Jason. Wir haben unsere Skripte und so weiter. Lassen Sie uns also unsere anfängliche Säuberung durchführen, damit wir keine ap CSS benötigen. Dann brauchen wir auch nicht all das in unserer App-Komponente. Also lassen Sie uns es aufräumen, wie dies führt, um diesen Klassennamen zu löschen, wir werden nur Hallo setzen. Wir werden Tillett Logo und Import für uns. Ja. Hat abgelegt, dann brauchen wir AP Test GS nicht als vier Index CSS. Nun, wir brauchen es eigentlich nicht auch, dann für den Index? Ja, lassen Sie uns den Straßen-Modus entfernen, weil wir Fehler erhalten, wenn wir andere Bibliotheken verwenden. Es ist völlig normal. Dann entfernen wir Index CSS und lassen Sie uns Service-Worker für jetzt kommentieren, genau so, dann brauchen wir kein Logo SVG. Wir brauchen keine Tests und wir sind hier fertig. Was machen wir jetzt? Wir werden andere Abhängigkeiten installieren, und wir werden sie aus dem Ordner Assets erhalten. Also lassen Sie uns diesen Ordner öffnen und Gerüst öffnen. Doug Jason. Also von hier aus werden wir Kommentare kopieren, um Abhängigkeiten zu installieren. Kopieren wir also die erste Zeile und lassen Sie sie einfach so in unser integriertes Terminal . Nun, während es installiert wird, lassen Sie uns Prediger und ausgezeichnete Konfigurationsdateien erstellen. Also für exzellente, wird es, ja, ja, Land RC sein. Und für Prediger wird es schöner, RC, RC, und lassen Sie uns sie auch von unserem Gerüst in Jason-Akte kopieren. Also für ja, gelehnt haben wir das. Legen wir es hier und speichern Sie es. Und für jedes Jahr haben wir das alles klar. Also, ja, Fusseln und Prediger sind Don, lassen Sie uns unser NPM-Skript anpassen. Also lasst uns das alles kopieren und hineinlegen. Paket Jason, innerhalb dieses Skriptabschnitts unten, genau so. Und auch haben wir das klare Skript, um den Rechnungsordner zu löschen. Also, kurz bevor wir unsere gebauten Let uns und PM produzieren, Ron Clear wie ein gestorben. In Ordnung, also sind wir fertig mit Skripten. Was haben wir sonst noch in der Disc-Entfaltungsdatei? Wir haben eine andere Zeile für Installationsabhängigkeiten, was Notizen ist. Ass sind Anzug reagieren Router und Reaktor für stumm. Lass es uns kopieren. Und lassen Sie mich erklären, was passieren wird. Also für unser Style-System werden wir SAS mit Ihnen verwenden. Ich Bibliothek genannt sind hier, und wir können einen Blick auf unseren Anzug werfen, wenn wir nicht auf seine offizielle Dokumentation messen. Was ist also eine Y-Bibliothek? Es ist eine Bibliothek, die uns bereits ziemlich finden Komponenten gibt, die wir verwenden können. Und das ist es im Grunde. Wir werden sehen, dass, wenn wir anfangen, es zu verwenden, ziemlich einfach ist und es unsere Entwicklungsgeschwindigkeit erhöht. wirst du sehen. In Ordnung. Und wann immer wir sehen, dass unser Anzug nicht genug für unsere Fälle ist, werden wir verwenden sagt Ok. Außerdeminstallieren wir, installieren wir, reagieren Router und reagieren Rotterdam Alles in Ordnung, so dass es im Grunde ist. Aber eine Sache zu tun ist auch, diesen Stile-Ordner für unser Projekt zu kopieren. Also, was ist das für Stile Ordner? Also kommt es mit Assad aus vordefinierten Klassen. Also lassen Sie uns tatsächlich diesen Ordner kopieren. Also werde ich diesen Ordner kopieren. Dann werde ich diese Datei in ah öffnen, im Datei-Explorer enthüllen, dann in Wunden. Ich werde diesen Stile-Ordner einfügen und schauen wir uns mal an. Was haben wir drinnen? Also haben wir unsere Hauptdatei, die im Grunde unser Index CSS ist oder nur unsere Hauptdatei für Stile hier definieren würde, sagen wir, wirklich ein paar Off-Klassen, die wir verwenden werden. Es wird Sie sehen und sie Sie sind wirklich einfach. Nichts zu kompliziert. Dann haben wir Dienstprogramm und Sie Einrichtung Farben, die wir in Maine CSS importieren. So können wir jetzt unsere Dateien verwalten. Also, für das Dienstprogramm hier haben wir Klassen, die Bootstrap-Dienstprogrammklassen ähnlich sind, also werden wir sie viel in unserem Code verwenden. Also, bitte schauen Sie sich sie an. Sie sind nicht so schwer zu verwalten. Ich habe keine Utility-Farben. Dies sind grundsätzlich Klassen für Farben. Nichts zu Besonderes hier drüben. Und dann haben wir außer Kraft gesetzt, wie er SS. Also in diesem Jahr bin ich Bibliothek sicher, dass es für Desktop-Anwendungen gedacht ist. So einige von ihren Komponenten sind nicht wirklich gut, um auf mobilen Geräten angezeigt und sie für mobile Bildschirme anzupassen. Ich habe ein wenig ihr CSS modifiziert, ich überschreibe ihre Klassen ein wenig. Jetzt sehen sie auch auf mobilen Geräten gut aus. Das ist nur, um alles gut zu machen. Die Polizei schaut sich das alles an. Es ist sehr einfach. Stellen Sie sicher, dass Sie wissen, was passiert. Also in Abdel Gs, was wir tun müssen, müssen wir es importieren. Also lasst uns importieren. Ah, wir sind Styles Haupt-CSS genau so. Und auch müssen wir unseren Anzug und Fortschritt konfigurieren. Also, wenn wir zu ihrer offiziellen Website navigieren und wenn wir zu den ersten Schritten gehen und wenn wir auf Verwendung in Kreta klicken , reagieren App von hier, können wir sehen, dass wir auch ihre Standard-CSS-Lösungen importieren müssen kopieren Sie diese Codezeile und setzen Sie es, bevor wir unsere wichtigsten Stile einfach so importieren. Also jetzt sind wir bereit, mit unserem Konflikt für Sie zu gehen. Ich Eine Sache, die hier zu tun ist, tatsächlich unser Projekt zu verbinden, um Hilfe zu erhalten. Also lassen Sie uns das integrierte Terminal öffnen und alle unsere Dateien festschreiben. Also zuerst werden wir alles dem Bühnenzustand hinzufügen, und dann werden wir Commit bekommen. Sagen wir, so etwas wie das Gerüst. Im Moment gehen wir Teoh auf. Wir bekommen ihn Konto. Dann werden wir ein Repository erstellen. Dann werden wir seine Chat-App nennen. Machen wir es privat, und wir werden ein neues Repository erstellen Direkt danach können wir diesen Befehl unten kopieren. Ferne am Ursprung. Lasst uns das kopieren und in unser Terminal hineinschreiten. Jetzt werden unsere lokalen Dateien mit diesem Remote-Repository assoziiert und wir müssen unsere lokalen Änderungen online schieben , um sie zu bekommen. Lassen Sie uns verwenden Push Ursprung Senf. Und jetzt schauen wir uns an, so dass alles bereitgestellt wird. Wenn wir die Seite aktualisieren, wird unser Projekt online sein. Also haben wir alles. Chraidi. Und im nächsten Video werden wir anfangen zu bauen. Wir sehen uns dort 100. Das the erstellen und konfigurieren: Hey, in diesem Video werden wir ein neues Firebase-Projekt erstellen und unsere Anwendung bearbeiten. Lass uns gehen. Also lasst uns Google öffnen. Und hier lasst uns Feuerbasis eingeben. Dann lass uns zuerst dein L öffnen und wir landen auf Feuerbasis. Offizielle Webseite. Da Fire Base Teil von der Google Cloud-Plattform ist, verwaltet Google alles. Das bedeutet, dass wir kein neues Konto erstellen müssen. Wenn wir ein Google-Konto haben, was meiner Meinung nach jeder tut, dann werden wir unser Google-Konto mit Firebase Project verknüpfen. Also lassen Sie uns auf Erste Schritte klicken und hier klicken wir auf Neues Projekt hinzufügen. Dann werden wir neue Projektnamen angeben, die Chat-Web-App sein wird. Lassen Sie uns sagen, dann klicken Sie auf Weiter. Dann lassen Sie uns Google Analytics deaktivieren. Wir brauchen es nicht wirklich. Und warten wir ein paar Minuten, bis unser Projekt erstellt ist. Okay, gut. Scheint, als wäre das Projekt fertig. Lasst uns weitermachen. Dann landen wir auf der Feuerbasis Armaturenbrett. Also von hier werden wir alles verwalten. Und wie Sie sehen können, sind wir derzeit auf dem Funkenplan, so dass es bedeutet, dass wir für nichts in Rechnung gestellt werden. In Ordnung, jetzt müssen wir unsere Webanwendung zu unserem Firebase-Projekt hinzufügen. Klicken wir also auf diese Schaltfläche „Einstellungen“ und wählen Sie dann Projekteinstellungen. Dann, hier unten, werden wir unsere APS von hier sehen. Lassen Sie uns auf diese Laboranwendung klicken, und dann lassen Sie uns den Namen für unsere App eingeben, die sein wird, Nehmen wir an , einfach chatten und lassen Sie uns nicht Firebase-Hosting einrichten. Klicken wir auf Registrieren. Es wird auch ein paar Sekunden dauern, und jetzt ist unsere Anwendung bereit. Klicken wir auf, Weiter zu beraten. Jetzt müssen wir Dienste einrichten, die wir innerhalb unserer Anwendung verwenden werden. Also zuerst, lassen Sie uns Datenbank einrichten. Also lasst uns darauf klicken. Und auf dieser Seite sind wir in der Lage, entweder Cloud Fire Store oder Echtzeit-Datenbank, so stellen Sie sicher, dass Sie nicht verwenden Cloud Fire Store. Sie verwenden eine Echtzeit-Datenbank hier unten, also lassen Sie uns klicken, Datenbank erstellen und wählen Sie Start im gesperrten Modus, damit alle unsere Regeln nach unten gesucht werden . OK, also lassen Sie es uns aktivieren, und es dauert ein paar Sekunden, nur um eine neue Datenbank für uns zu erstellen. Alles klar, es ist erledigt. Jetzt müssen wir auch Speicher für unsere App einrichten. Also lasst uns darauf klicken und dann loslegen. Es wird uns um Regeln bitten. Klicken wir auf „Weiter“. Dann müssen wir den Standort für unsere Lagerung auswählen. Es ist sehr wichtig und es beeinflusst diese Geschwindigkeit wirklich, also wählen Sie einfach die nächste zu Ihnen. Für mich ist es wohletwas wohl mit Europa. Also wähle ich Europa West drei aus. Dann klicke ich auf Dung und es dauert ein paar Sekunden, um eine neue Geschichte für uns zu erstellen. Warten wir. Okay, perfekt. Scheint, als wäre der Speicher fertig. Unsere letzte Sache ist es, die Authentifizierung für unsere Anwendung einzurichten. Also lassen Sie uns hier auf Authentifizierung klicken. Wir haben keine registrierten Benutzer. Für jetzt, lasst uns auf Sign and Method klicken, und von hier aus können wir alle Signierungsanbieter sehen, die wir verwenden können. Wir werden keine E-Mail verwenden, und Passwort wird nur Google und Facebook verwenden. Also zuerst, lasst uns darauf klicken. Und dann lasst uns einfach so aktivieren klicken. Also lassen Sie uns Unterstützung und E-Mail auswählen und dann öffentlichen Namen projizieren. Lassen Sie uns vielleicht sagen, etwas wie Chat, App und lassen Sie uns auf sicher klicken, und danach wird es alles automatisch konfigurieren. Wir müssen uns um nichts kümmern. Google Sinan ist bereits aktiviert. Und was ist mit Facebook? Loggen Sie sich ein Also lasst uns darauf klicken. Und von hier haben wir keine automatische Konfiguration. Wir müssen es manuell machen. Also lasst uns hier auf aktivieren klicken. Wir müssen APP, Idee App Geheimnis ausfüllen . Und wir müssen das benutzen. Umleiten Sie Ihre l Also, was müssen wir in Google tun? Wir müssen Facebook-Entwickler eingeben. Dann gehen wir zu Facebook für Entwickler. Und hier auf dieser Seite oben, werden wir auf meine APS klicken und von hier aus werden wir auf Create APP klicken, können ausgewählt. Und dieser Spielname wird so etwas wie Charts sein, die gerade geweint wurden. Alles klar, dann lassen Sie uns auf Create app I d. Dann lassen Sie uns Sicherheitsüberprüfung durchgeführt und ah waren Facebook-Anwendung erstellt werden . Also von hier, was wir tun müssen, müssen wir zu den Einstellungen gehen, dann gehen Sie zu grundlegenden Und hier finden wir unsere App I d und up Geheimnis. Rufen wir p App I d und dann Tempo es hier drüben. Dann müssen wir auch unsere App geheim machen. Lassen Sie uns auf Show klicken und nennen wir es auch und fügen Sie es hier in Feuerbasis. Und wir müssen das auch hinzufügen. Leite dein l hierher, lass es uns kopieren. Dann speichern wir unsere Änderungen. Und hier unter Prokes, lasst uns auf Pluszeichen klicken. Wenn wir also darauf klicken, müssen wir Facebook auswählen. Schauen Sie und klicken Sie auf Einrichten. Und dann müssen wir wählen, dass wir in der Lage, auf Web anmelden, dann Website Ihre l. Ich weiß nicht. Setzen Sie einfach etwas, das wirklich keine Rolle spielt. Eigentlich, nein, wir brauchen das nicht. Lassen Sie uns auf Einstellungen klicken, weil wir bereits Facebook haben. Logan daran Es war nur ein schneller Start von Facebook-Team. Also hier für diese gültigen Redirect Ihre andere müssen wir diese Ihre l hinzufügen, die wir auf Feuerbasis haben . Also stellen Sie sicher, dass es hier ist. Also, jetzt ist es editieren. Klicken wir auf Änderungen speichern. Und jetzt ist unsere Facebook-Anwendung bereit. Also lasst es uns retten. Und jetzt unsere Facebook in konfigurieren Sie es und wir konfigurieren es alles innerhalb Firebase Website . Jetzt können wir es tatsächlich zu unserem Code hinzufügen. Also lasst uns zurück zu V s Code und von hier. Öffnen wir zuerst unser Terminal. Ich denke, wir müssen Global Seelye von der Feuerbasis installieren. dazu Geben SiedazuNPM install Dash G Firebase Tools ein und installieren Sie es. Ich habe es bereits auf meinem Rechner, also werde ich es danach nicht zweimal installieren. Wenn wir diese Feuerbasis Werkzeuge haben, müssen wir Feuerbasis eingeben und das ist alles. Danach wird es Sie auffordern. Autorisieren Sie sich, füllen Sie bitte die Anweisungen aus. Und danach, wenn ich diesen Befehl ausführe, werde ich dieses Licht in der Arbeit sehen. Also bin ich bereit, fortzufahren. Ja. Dann muss ich Dienste auswählen, die ich initialisieren möchte. Also brauche ich nur Datenbank. Also navigiere ich mit Pfeilen und ich wähle mit Raum und auch ich brauche Hosting Onley. Diese beiden wählen keinen Speicher aus. Also dann drücke ich Enter Dann wähle ich ein bestehendes Projekt verwenden und dann werde ich Chat-Web-App auswählen , die ich gerade erstellt habe. Ich habe ausgewählt, welche Datei für spätere Abfallwalzen verwendet werden soll. Lassen Sie uns einfach eingeben als das öffentliche Verzeichnis, das ich anstelle von öffentlich verwenden möchte. Lassen Sie uns Typ gebaut und dann möchte ich meine App als eine einzelne Seitenanwendung konfigurieren. Das ist wahr. Also lasst uns klicken. Ja, und der eingebaute Index HTML existiert bereits über, oder? Ja. Ich will, dass du überschreibst. In Ordnung, jetzt. Feuerbasis ist assoziativ. Nehmen wir an, unser Remote-Projekt, das wir gerade erstellt haben, dass eine mit unserem lokalen Projekt verbunden ist, können wir Firebase Jason Fire Besar See sehen, die unser Projekt I d als innerhalb der Datenbankregeln enthält . Wir haben unsere Datenbankregeln und innerhalb der Firebase Jason haben wir unsere lassen Sie uns sagen, Projektbeschreibung. Also für Datenbankregeln aus dieser Datei für das Hosten bereitgestellt werden, haben wir Öffentlichen Ordner , der erstellt wird. Dann haben wir Dateien ignorieren, die wir nicht auf Firebase-Hosting bereitstellen und auch neu schreibt. Weißt du noch, als wir versuchten, unser Projekt auf Hip Hop hochzuladen? Also, wenn wir die Seite aktualisieren, wurden wir nicht gefunden. Das liegt daran, dass wir eine einseitige Anwendung haben und Firebase dieses Problem löst, indem wir nur alle Routen schreiben und es für einzelne Seiten Rap konfigurieren. Wir werden also keine Probleme damit haben. Alles klar, das war's. Jetzt können wir tatsächlich Bibliothek in unser Projekt installieren. Also, lassen Sie uns einfach PM install firebase eingeben. Und warten wir, bis es fertig ist. In Ordnung, wir haben Firebase als Bibliothek installiert. Nun, was wir unter Quellordner tun müssen, lassen Sie uns in Ihrem Ordner erstellen, dass wir MISC nennen und hier werden wir eine neue Datei Firebase Punkt gs erstellen. Hier werden wir unsere Feuerbasis in unserer App konfigurieren. Also denken wir zuerst, dass wir tun müssen, müssen wir zurück auf die Website gehen, dann wieder zurück zu den Projekteinstellungen. Und wenn wir von hier nach unten scrollen, können wir diesen Firebase-Konflikt finden. Also lasst uns das kopieren. Und hier werden wir einen neuen wertvollen lassen Sie uns sagen, nur ständigen Konflikt zu schaffen und lassen Sie uns es einfach so einfügen, dass jetzt fähig ist. Importieren Sie auch Firebase-Bibliotheken. Also werden wir Import Fire Base von Firebase App eingeben. Es ist wichtig, nicht aus Firebase zu importieren, da es die gesamte Bibliothek und die gesamte Bibliothek wirklich, wirklich großist wirklich, wirklich groß und alle Dateien daraus hinzugefügt werden. So stellen wir sicher, dass wir nur Firebase-App importiert haben, dass das, was wir tun müssen, müssen wir feuerbasis dar initialize app nennen und innen müssen wir unsere Konfliktdatei stimmen Also lassen Sie uns dick kommen . Und jetzt gibt dies für initialize App als eine Instanz aus Feuer basierte Anwendung zurück. Also lassen Sie uns es in ein wertvolles lassen Sie es uns zuweisen, sagen wir, einfach App einfach so. Und wir sind bereit, jetzt zu gehen. Mit dieser App wertvoll, sind wir bereit, Firebase-Dienste wie bis ab ab native Bienen zugreifen, Fire Store-Funktion, Messaging all das. Also, aber das ist, was wir im nächsten Video tun werden, wie wir gemacht werden. Die eine Sache, die ich tun möchte, bevor wir dieses Video beenden, möchte ich unsere Änderungen verpflichten, um Hilfe zu erhalten. Also lasst uns bei Punkt vergessen Dann werden wir setzen, Commit bekommen und wir werden sagen, dass das initialisierte Firebase-Projekt So etwas. Alles klar, Perfect. Wir sehen uns im nächsten. 101. Seiten erstellen - private und öffentliche Routen: Hey, jetzt haben wir Firebase in unserem Projekt initialisiert. Beginnen wir mit dem Erstellen des Projekts selbst. Das erste, was ich tun werde, werde ich mein Terminal öffnen und ich werde ausführen und PM Run beginnen , Server zu entwickeln. Aber kurz bevor ich diesen Kommentar ausführe, werde ich neue Datei erstellen, die dot e n v dot local ist und ich werde es in das Root-Verzeichnis und hier Rivalen beruhigen Browser zu keiner. Dies soll verhindern und PM Ron beginnt die Anwendung sofort in meinem Browser zu starten. Also hasse ich dieses Verhalten wirklich. Wenn es Ihnen gefällt, machen Sie diesen Browser nicht. Keine Sache. Also, jetzt werde ich diesen Befehl ausführen und ich muss manuell zum Browser gehen und auf lokalen Host 3000 zugreifen . Also hier werde ich die hallo Nachricht sehen, die ich in Abdel Gs angegeben habe, wenn das Risiko entfaltet das Projekt. Nun, was wir tun müssen, müssen wir zuerst unsere Seiten definieren. Aber wir haben nicht initialisiert reagieren Rotor, wenn Risiko entfaltet die App so lässt navigieren zu Index togs und hier zu initialisieren Reactor wird Browser-Rotor von React Router stumm importieren und dann müssen wir unsere App-Komponente um den Browser wickeln, Drehkomponente. Und jetzt sind wir in der Lage, es zu benutzen. Okay, gut. Lass uns gehen. Teoh Abdel Gs und hören, welche Routen wir definieren werden. Lassen Sie uns zuerst den Schalter verwenden. Runter hier, Def. Also werde ich Schalter von React ruder als innerhalb des Schalters setzen. Die Leute definieren die Route. Und welche Routen sollten wir hier setzen? Nun, wir werden ein paar Routen zu finden haben, und einer von ihnen ist die Signatur Seite und die Homepage. Und die Sache ist, dass wir nicht in der Lage sein, auf die Homepage zugreifen, bis wir in der APP angemeldet sind . Also müssen wir eine Art von Privatforelle definieren, die nur Zugang sein kann, wenn wir angemeldet sind . Also, was wir tun, das erste, was Leute tun, wird neuen Ordner auf der Ressource erreichbar Namensseiten erstellen . Hier werden wir zwei neue Komponenten erstellen, die unsere Seiten darstellen werden. Zuerst wird ein Anmeldeseite Zeichen sein und sie ist hier. Ich werde Gerüst und Sie Komponente mit der Snipper-Erweiterung. Und lassen Sie uns einfach so einloggen. Dann werde ich eine andere Komponente erstellen, Holmdel Gs und ich werden genau das Gleiche tun. Und ich werde jetzt ein gerechtes Zuhause nennen. Wie können wir diese Zeilen hier definieren? Wir können Route setzen und dann können wir das erste Zeichen setzen, so dass diese Route definiert ist. Aber was ist mit zu Hause? Wie können wir es privat machen für diese wird eine andere Komponente erstellen. Wir werden es private Route nennen und es wird diese Routenkomponente imitieren, die von React Router kommt . Aber es wird verbessert und es wird gegen einen Zustand überprüfen. Also unter Wunden, lassen Sie uns neue Ordnerkomponenten erstellen Hier werden wir neue Datei private Route einfach so setzen. So wird es diese Routenkomponente imitieren. Also, wie ist diese Routenkomponente zu befrieden? Welche Probleme gehen wir? Was Kinder einen Weg machen. Also müssen wir Pfad angeben. Also für die Unterzeichnung wird es nur signieren. Also jetzt über den privaten Rauer. Also lassen Sie uns definieren, wie wir es verwenden werden. Es wird also eine private Route im Inneren sein. Wir müssen eine Komponente oder nur Kinder gießen, die wir rendern möchten. Es wird unsere Homepage sein, genau so und für Requisiten. Wir müssen auch spezifiziert, dass wir diese Komponente nur auf Schrägstrich rendern. Okay, jetzt im privaten Weg. Wir wissen, dass alles, was wir an diese privat gereiste Komponente als Requisiten übergeben, tatsächlich irgendwie zu dieser Routenkomponente umgeleitet werden wird . Also hier werden wir alles strukturieren und es hineinlegen. Sagen wir, Route Requisiten. Das einzig richtige, was wir brauchen, um daraus zu bekommen, sind die tatsächlichen Kinder, die wir rendern wollen. Also lasst uns d Struktur Kinder und alles andere wird unter Route Requisiten verfügbar sein. Und wir müssen eine einfache Bedingung hier drüben gießen. Sagen wir es vorerst. Da wir kein Profil haben, erstellen wir einfach den Stier unschätzbar wertvoll Lassen Sie uns sagen Profil und setzen Sie ihn auf false. Und jetzt, was wir tun werden, werden wir fragen, ob unser Profil auf Narren gesetzt ist. Wenn wir kein Profil haben, dann werden wir zurückkehren und Ihre Komponente, die wir nicht verwendet haben, bevor es umgeleitet werden wird , die auch von React Rotor-Paket kommt. Und diese Umleitung wird im Grunde umgeleitet, um Pass anzugeben. So erhält es nur eine Requisite, die zu und dafür angeben wird. Also, wenn wir keine Zeichen und Daten haben. Wenn wir kein Profil haben, werden wir zur Unterzeichnung umleiten. In Ordnung. Ziemlich einfach. Nun, wenn diese Bedingung keinen Platz einnimmt, dann würden wir normalerweise unsere Komponente verwenden, die wir als Kinder übergeben. Anstatt dieses def zurückzugeben, werden wir einfach die Route vom Reaktionsrotor zurückgeben als vier Requisiten. Wir werden alle Requisiten angeben, die wir hier sammeln. Also werden wir sie über diese Routenkomponente mit genau dieser Syntax und innerhalb verbaler Vergangenheit Children einfach so verteilen . Und wenn wir es speichern, schauen wir es uns an. Wenn es jetzt tatsächlich funktioniert, wenn ich versuchen werde, einen Schrägstrich Homepage zuzugreifen, werde ich sofort umgeleitet, weil wir immer falsche Bedingung haben. Es bedeutet also, dass wir immer auf die Anmeldeseite weitergeleitet werden. Wenn ich also gesagt habe, dass es jetzt zu wahr ist, wenn ich versuchen werde, auf die Homepage zuzugreifen, werde ich da sein. Das ist es also. So können wir den privaten Weg machen. Und auch, wenn wir angemeldet sind, wollen wir die Anmeldeseite nicht sehen. Wir möchten auch weitergeleitet werden, sagen wir, auf unser Dashboard oder auf die Homepage. Also, was wir tun können, werden wir eine weitere Komponente erstellen, die wir öffentliche Crowd nennen werden. Also lassen Sie uns öffentliche Route erstellen. Nicht Ja, und lassen Sie uns tatsächlich alles von privaten Weg kopieren. Und hier, lassen Sie uns private Route in öffentliche Route umbenennen. Und hier wird das Ding das nächste sein. Also, wenn wir Profil haben, dann werden wir auf die Startseite umgeleitet werden. Auf diese Weise werden wir, wenn wir angemeldet sind, nicht in der Lage, die Anmeldeseite zu sehen, wo sofort zu Hause weitergeleitet wird. Also ist die Logik irgendwie gleich. Aber es ist jetzt umgekehrt, wie wir tatsächlich Einweg-Menge tatsächlich in der gleichen Weise wie wir unsere private Ich werde verwendet. Also hier, statt nur Route wird schlechte öffentliche Rauer, die wir aus Components Ordner importieren. Jetzt brauchen wir diesen Import vom React Router nicht. Lass es uns retten. Und eigentlich wird nichts geändert, weil wir keine Daten für das Profil haben. Also, das ist es im Grunde. So sind wir in der Lage, unsere privaten und öffentlichen Massen in React Router zu verwalten. Nun lassen Sie uns unsere Änderungen begehen und dieses Video beenden, also werden wir alles bekommen, dann werden wir unsere Nachricht übergeben, die öffentliche und private Routen erstellt wurde. Im nächsten Video werden wir mit dem Erstellen der Anmeldeseite beginnen. Wir sehen uns dort. 102. Anmeldeblatt: Hey, willkommen in diesem Video, werden wir mit dem Bau der Entwurfsseite beginnen. Lass uns gehen. Bevor wir anfangen. Ich möchte nur erwähnen, dass wir den Reaktionsanzug benutzen werden. Du. Warum Bibliothek, die wir installiert haben? Wir werden es sehr nutzen. Bitte öffnen Sie diese Dokumentation bei Ihrem nächsten Schritt, damit Sie immer darauf zugreifen können. Gehen Sie also zur Startseite und klicken Sie dann auf Komponenten. Und hier auf dieser Seite finden Sie alle Komponenten, die diese Bibliothek uns West zur Verfügung stellt. Es ist sehr einfach zu bedienen, und sie alle sind meist intuitiv. Nehmen wir also an, wenn wir von hier auf jeder Unternehmensseite zu Schaltflächenkomponente gehen, können Sie viele verschiedene Beispiele und Anwendungsfälle finden. Und auch, wenn Sie klicken auf zeigte die Quelle, Sie vertrauen, wie diese Komponente in Ihrem Mantel verwendet werden kann. Sie können es immer kopieren und einfügen. Und wenn Sie nur wissen müssen, welche Komponente als Requisiten erhält, können Sie nach unten scrollen und alle möglichen Requisiten anvertrauen, die an diese bestimmte Komponente weitergegeben werden können . Ordnung, also in unserem Code, wenn ich dieses Zeug schreiben werde, werde ich nicht referenzieren Es kann ein paar Mal sein, aber die meiste Zeit, weil es besser intuitiv ist. Ich werde es nicht erklären. Wenn Sie also immer noch nicht wissen, was passieren wird, navigieren Sie bitte zu dieser Dokumentation. In Ordnung, also lasst uns anfangen. So können Sie zu unserem Code navigieren und lassen Sie uns Anmeldeseite öffnen. Und hier werden wir zuerst beginnen, wir werden diese def entfernen, und wir werden Containerkomponente aus unserem Anzug setzen. Sie könnten denken, dass es sehr ähnlich ist, von Bootstrap zu behaupten, weil es Container jemals in dieser Bibliothek ist . Ist es nicht. Es gibt uns nur die Anzeige von Flex. Dann werden wir Grit benutzen. Und in dieser Bibliothek ist großartig so ziemlich wie in Bootstrap. Aber im Gegensatz zu Bootstrap hat es 24-Säulensystem. Im Gegensatz zu Stiefeln, fallen Sie mit 12 Kämmen. Ordnung, also innerhalb des Gitters, haben wir wachsen und innerhalb der Reihe, wir haben Spalte genau so. So wird unser Dickdarm Gesundheit von seinem Maximum mit auf mittleren Geräten sein. Also auf sehr kleinen Geräten, wir gehen zu armen alten 24 Spalten auf Medium und höher. Wir werden jetzt 12 setzen, in dieser Spalte werden wir Panel-Komponente setzen, und es wird uns im Grunde ein paar von klopfen geben. Okay, also drinnen werden wir Def setzen. Und in diesem schwierigen definieren Alter zu Tag, das sagen wird, Willkommen zu chatten Unter wir Pitak setzen, die sagen wird, progressive Chat-Plattform vier Mahlzeit Kämpfe, so etwas. In Ordnung, schauen wir es uns an. Wenn ich die Seite aktualisiere, sehe ich diesen seltsamen, seltsamen Hintergrund. Das ist, weil ich Spalte aus unserem Anzug Leap Karussell importiert habe. Ich wollte das nicht. Dies ist ein wenig schwierig, wenn Sie äußere Intel Essence verwenden, stellen Sie sicher, importiert nur aus unserem Anzug. Wenn ich es jetzt speichere, kann ich sehen, dass es tatsächlich funktioniert hat. jedoch Unser Text istjedochnicht zentriert. Wir wollen es zentrieren, damit wir eine unserer Dienstprogrammklassen verwenden können, die wir im Dienstprogramm schlecht sind, wie hier sagt, und sie sind fast wie Bootstrap, so können wir Klassennamen, Textcenter definieren und es wird Arbeit. jedoch sehen, Wir könnenjedoch sehen,dass unsere Komponente, wenn wir inspiziert , nicht vollständig auf große Geräte zentriert ist. Auf Mobilgeräten ist es jedochOK. Auf Mobilgeräten ist es jedoch Das ist, weil, wenn wir diese 12 Säulensystem anwenden, unser Element ist nicht, Nehmen wir es an. Wir müssen uns bewerben. Versatz. Es ist wieder sehr ähnlich, wie in Bootstrap. Also für 12 Spalten müssen wir Offset von sechs Spalten davor anwenden. Also werden wir einen leeren Offset von sechs Spalten setzen. Und gerade jetzt wird unser großes Element zentriert sein, wie Sie von dieser Polsterung hier sehen können. In Ordnung. Es sieht gut aus unter einem Disney, wenn wir noch einen Def setzen wollen. Und hier werden wir unsere Schaltflächen definieren, mit Google signieren und sich mit Facebook anmelden. Also zuerst werde ich Knopf setzen. Dann, als Requisiten, werde ich passieren. Es wird ein Block-Button sein. Es wird alles mit seinem Elternteil nehmen. Dann werde ich Farbe setzen, und ich werde es auf blau setzen. Und das war's vorerst. Also in diesem Boden werde ich Aiken-Komponente aus unserem Anzug gießen, und wie ich kann, werde ich angeben, dass ich vier Facebook einfach so stützen kann. Und dann werde ich einen einfachen Text setzen, weiter mit Facebook, aber groß geschrieben und das gleiche werde ich für die Unterzeichnung mit Google tun. Ich werde eine Farbe grün angeben. Und anstelle von Phrasebook kann ich Google Aiken angeben und dann mit Google einfach so fortfahren. Nun, was sehen Sie einen Blick? Okay, es scheint gut zu sein, aber wir wollen etwas Marge hinzufügen. Also für Disney, wenn wir Klassennamen und Rand oben drei setzen, so etwas. Okay, sieht gut aus. Jetzt müssen wir es so machen, dass vertikal zentriert. Oder vielleicht an einem gewissen Rand zu den oberen Elementen. Es sieht also schöner aus. Also für diese großartige Komponente, werden wir Klassennamen definieren, und wir werden Rand oben Seite setzen. Dies ist also eine Klasse, die ich in einer der Utility-Dateien definiert habe, so dass es den Elementen nur viel Spielraum gibt. Also, wenn wir es untersuchen, wie Sie sehen können, gibt Margin Top uns 150 Spitzen sonst. Alles klar, also sieht es gut aus. Was ist mit Funktionalität? Wie können wir unsere Unterzeichnung tatsächlich verwalten und schließlich beginnen, diese Facebook- und Google-Wissenschaft hinzuzufügen . Was müssen wir also innerhalb von Firebase gs tun, wo wir unsere Anwendung initialisiert haben? Wir müssen die Bibliothek von der Feuerbasis importieren. Also hier werden wir Firebase einfach so importieren. Dann hier unter App werden wir const in verfügbar exportieren, die nur aus nennen wird und wir app-dot off aufrufen und es wird uns das Objekt geben, das wir verwenden können, um mit der Feuerbasis zu interagieren. Also lassen Sie es uns innerhalb der Unterzeichnung speichern. Wir werden unsere Handler für On Click-Ereignis für Schaltflächen definieren. Also werden wir zuerst auf,sagen wir, Facebook anmelden, und dann werde sagen wir, Facebook anmelden, ich das gleiche für Google auf Google-Signierung tun und ihre Funktionalität ist fast die gleiche. Also werde ich 1/3-Funktion erstellen, die ich innerhalb auf Facebook-Signierung und innen auf Google-Signing aufrufen werde. So werden wir es so etwas wie melden Sie sich mit Provider und Provider entweder als Facebook oder Google. Alles klar, als Argument wird es diesen Anbieter erhalten und dann werden wir einige denken Einsicht. Also innen auf Facebook, loggen Sie sich ein. Wir werden anrufen, melden Sie sich mit Provider und Rubble Pass ein Anbieter wird in einem Moment sprechen, und hier auch mit Provider signieren jetzt, wie wir tatsächlich signieren können, so Inside Signing mit Provider, wir kann einfach tippen und importiert aus unserer Misc Firebase Datei dieses off Objekt, das wir von hier bekommen, wenn wir nur Punkt von Intelligenz setzen. Wir können eine Menge von Dingen sehen, die hier passiert. Wir können auf den aktuellen Benutzer zugreifen. Wir können das Passwort zurücksetzen und anders bestätigen. Wenn wir nur signieren, können wir hier verschiedene Dinge haben. Wir senden in mit E-Mail und Passwort mit Telefonnummer mit Papst bis mit Umleitung. Also viele Dinge, die hier passiert, sind wir daran interessiert, mit Pop-up zu signieren und wenn wir dies innerhalb montiert nennen , müssen wir den Anbieter übergeben und es wird vorausgesetzt, dass wir als Argument erhalten werden . Also werden wir es hier setzen. Also, was ist dieser Anbieter? Also dieses Provider-Objekt, das wir aus der Firebase-Bibliothek importieren müssen , sagen wir , sagen wir, und es ist statisch. Also, was wir hier tun müssen, müssen wir Feuerbasis aus Firebase Slash AP wieder importieren, es ist wichtig, aus Firebase Schrägstrich ap zu importieren Also hier, als Anbieter, werden wir neue Firebase Punkt auth dot facebook übergeben off Provider und wir müssen es nennen wird es uns zurückgeben und Ihr Provider Objekt, das wir als undokumentiert an Dysfunktion und den gleichen Rebellen für Google-Signing übergeben werden. Wir werden neue Feuerbasis absetzen, aber dieses Mal Google aus Anbieter einfach so. Nun, was ist das eigentlich assoziieren? Handler mit Knöpfen. Also für auf Klick-Ereignis für Facebook-Muster werden wir auf Facebook-Signatur setzen und für Google, Google, wir werden auf Klick auf Google setzen, Anmelden einfach so. Alles klar, sieht gut aus. Jetzt ist diese Unterzeichnung mit Pop up, wenn wir jedoch, es ist ein Versprechen. Also müssen wir darauf warten. Lets konvertieren unsere Signierung mit Provider in eine Senkenfunktion und warten auf diese Unterzeichnung mit Pope up. Und dann lassen Sie uns die Ergebnisse in das Ergebnis umsetzbar. Und lassen Sie uns Konsul schauen und sehen. Was erhalten wir, obwohl, obwohl, wenn ich die Seite eröffnete ich Rat aktualisieren, dann kann ich sehen, dass reagiert mit 400 Arkwright. Das ist in Ordnung. Klicken wir zum Beispiel auf Weiter mit Google . In Ordnung, Sie können sehen, dass es tatsächlich etwas tut, und jetzt kann ich eines meiner Google-Konten auswählen. In Ordnung, wählen wir meine Konten aus. Und jetzt können Sie sehen, dass ich hier ein Ergebnis habe. So ist es ein Objekt, das drei verschiedene Objekte zusätzliche Benutzerinformationen hat, so dass wir sehen können, dass dies unser neuer Benutzer ist. Wir können E-Mail Vornamen, verschiedene Ideen bekommen . Wir können ein Bild bekommen, wenn unsere E-Mail verifiziert ist. Also diese Daten kommen von Google und Sie können Anbieter sehen. Das gebe ich Google. Dann haben wir Anmeldeinformationen, verschiedene Zugriffstoken und dann haben wir Benutzerobjekt. Daher stellt dieses Benutzerobjekt derzeit angemeldeten Benutzer dar. Es ist allgemein. Und von hier aus können wir verstehen, ob unser Benutzer eingeloggt ist. Sind wir nicht. Wir werden über dieses Benutzerobjekt in den kommenden Videos ausführlich sprechen. Also jetzt, was wir tun können Wir können tatsächlich zurück zu Firebase Schwächen, Gehen Sie zur Authentifizierung. Hier können wir unsere Authentifizierung neu laden. Nehmen wir an, melden Sie sich in der Datenbank an. Und hier beschränken wir unsere E-Mail mit Provider, wenn es erstellt wurde und erstellt Benutzer I d. Also, vor allem, dies ist keine Datenbank. Dies ist genau wie eine kleine Datenbank in dieser Authentifizierungsbibliothek. Wir müssen immer noch unsere Benutzer innerhalb der Datenbank speichern. Das ist nur zu verfolgen. Wie viele Nutzer haben wir uns in unserer App angemeldet oder so etwas? In Ordnung, also lassen Sie uns jetzt unseren Code etwas ändern und lassen Sie uns unseren Benutzer in der Datenbank speichern. Also zuerst, lassen Sie mich sagen, versuchen, fangen, fangen, schauen Sie hier rüber, weil wir mit Versprechen arbeiten und wir wollen sicherstellen, dass wir immer mit anderen umgehen . Und übrigens, nur um den Benutzer zu benachrichtigen, dass wir derzeit angemeldet sind oder wenn wir irgendwelche Fehler haben, können wir die Alert-Komponente verwenden, die wieder aus unserem Anzug kommt. Wenn wir also einen Fehler haben, rufen wir Alarm auf, und wenn wir Punkt setzen, können wir sehen, dass wir Zugriff auf atter Info und Erfolgs- und Warnmeldungen haben . Also lasst uns für eine Nachricht einreichen. Also als erstes Argument, werden wir Fehler diese Nachricht setzen, und dann müssen wir die Dauer dieser Nachricht von dieser Warnmeldung absetzen. Also lassen Sie uns für Sekunden in angegeben in Millisekunden schlecht. Und wenn wir eingeloggt sind, werden wir wachsam machen. Sagen wir Erfolg. Und dann werden wir mit nochmals „Timeout“ vier Sekunden eingeloggt. In Ordnung. Scheint gut. Nun, was wir mit diesem Ergebnis tun können. Wie Sie sich erinnern, haben wir ein Objekt erhalten. Wir erhielten zusätzliche Benutzerinformationen und erhielten auch Benutzerobjekt. Nun, indem Sie überprüfen, ob zusätzliche Benutzerinformationen Ihr Benutzer ist Wenn unser Benutzer ist, der derzeit signiert wird, ist es ein neuer Benutzer wird es in der Datenbank speichern. Also, wie können wir das tun? Gehen wir zurück zu Firebase Thaci s hier. Wir werden eine andere Bibliothek importieren, die Firebase-Schrägstrich Datenbank sein wird, um mit der Datenbank zu interagieren und ähnlich wie aus. Wir werden const Datenbank ap dot Datenbank einfach so exportieren. So unter dieser Datenbank, wertvoll können wir mit Datenbank interagieren. Lassen Sie uns so von der Insider-Signierung genießen, werden wir Datenbank referenzieren, die wir von Misc Firebase importieren. Dann werden wir Punkt hier setzen. Wir müssen Referenz angeben, die im Grunde Pfad in unserer Datenbank auf dem Ritual speichern unsere Daten ist. Also werden wir unsere Benutzerinformationen unter Schrägprofilen Schrägstrich Benutzer i d speichern. Also lasst uns String-Interpolation öffnen. Und als Benutzer I d. Wir werden Benutzer Punkt referenzieren Wir können E-Mail-Anzeige, Name verzögert und viele andere Dinge im Zusammenhang mit diesem Benutzer haben. Aber wir sind an Benutzer I d interessiert so dass dieser Benutzer ich d wird der gleiche wie dieser Benutzer sein. Ich d in der Authentifizierungsbibliothek. Es wird also so sein, als würden wir einen neuen Benutzer erstellen. Es wurde zur Authentifizierung hinzugefügt, der Benutzer I d automatisch generiert wird, und dann werden wir diesen Benutzer I d verwenden, um den Benutzer in der Datenbank zu speichern. In Ordnung, also jetzt, wenn wir die Referenz haben, können wir einen weiteren Punkt setzen und von hier aus müssen wir die SAT-Methode aufrufen. Und wie Sie aus der Beschreibung sehen können, schreibt es Daten an diesen Datenbankspeicherort. Also, wenn ich es hier nenne, werden wir ein Objekt speichern, weil wir benachbarte basierte Datenwege haben. Also wird unser Objekt so aussehen. Wir werden Name und Name wird Benutzer Punkt Anzeigename sein. Dann werden wir auch erstellt haben, an dem sagen wird, wenn das Konto erstellt wurde. Um also einen richtigen Zeitstempel in unsere Datenbank zu setzen, muss wieder etwas statisches verwendet werden. Lassen Sie uns die Eigenschaft sehen, die aus der Firebase Library kommt. So erhalten wir einen Bericht Firebase Punkt Datenbank Punkt Serverwert Punkt Zeitstempel, und es wird bereinigt Zeitstempel in unsere Datenbank setzen. Ordnung, also dieser Punkt sagte, gibt auch dieses Versprechen zurück. Also, wenn wir etwas mit Datenbank oder was auch immer tun, interagieren wir mit allem. Höchstwahrscheinlich werden wir mit Versprechungen interagieren. Deshalb müssen wir es abwarten und alles wird von diesem catch-Block gefangen und Benutzer wird benachrichtigt. Alles klar, lassen Sie uns das alles retten, denn es scheint wirklich eine Menge zu sein. Klicken wir nun auf, Weiter mit Google. Wählen wir meine E-Mail aus und jetzt bin ich angemeldet. Aber es ist eigentlich ein wirklich seltsam. Das ist wahrscheinlich, weil ich dieses Konto bereits hinzugefügt habe Hier, vielleicht lassen Sie mich es dieses Konto. Und jetzt versuchen wir es noch einmal, weil wir eine Angelegenheit bekommen müssen. In Ordnung, also klicken wir auf, fahren mit Google fort, dann wählen wir unser Konto erneut aus. Und jetzt haben wir die Erlaubnis heute Abend verweigert. Und wir haben das nicht für uns, lassen Sie uns Punkt auf ihre Nachricht setzen. Aber die Sache ist, dass wir die Erlaubnis verweigert haben, und das ist, weil, wenn wir unsere Datenbank öffnen , Ordnung, lasst uns gehen und klicken, Datenbank erstellen. Dann gehen wir zu Regeln. Und hier haben wir standardmäßig die gesperrte Datenbank erstellt. Was auch immer wir versucht haben, mit der Datenbank zu tun, wir werden diese Erlaubnis heute Abend haben, denn, wie Sie sehen können, haben wir Lese- und Rechteberechtigungen gesetzt, um für alle aus unserer Datenbank zu fallen. Um das zu vermeiden, was wir hier tun können, bevor wir diese Regeln sagten , werden wir sagen, dass für Profile , und wir müssen sagen, EBA für unsere Sicherheitsregeln. Und es ist nicht der Standardweg, etwas mit Sicherheit zu definieren, aber es braucht nur Zeit, um sich daran zu gewöhnen. Vertrauen Sie mir, es ist sehr einfach zu arbeiten. So haben wir unseren Profilpfad. Wir müssen nur der Vergangenheit folgen. Also speichern wir unsere Daten unter Profilen Schrägstrich Benutzer i d. Also werden wir es als Objekt setzen. Also haben wir Profile, dann müssen wir einen Schlüssel setzen. Und weil es etwas Dynamisches sein wird, das sich ändern wird, wir ein Dollarzeichen setzen, und dann können wir so etwas wie Benutzer setzen, d. Dies ist nur, um es innerhalb verschachtelten Objekts zu referenzieren. Lassen Sie mich erklären, was ich meine. Also in dieser Vergangenheit werden wir wieder ein anderes Objekt öffnen, und drinnen werden wir einen weiteren Schlüssel setzen, der Dot Leckerbissen und Dot richtig sein wird? Genau das Gleiche, wie wir hier drüben haben. Also für dot Lesen Sie, was wir tun werden. Wir werden verweisen, ob dieser Benutzer i d , den wir von hier erhalten haben. Jetzt geht es wie verfügbar. Wir können es innerhalb dieses Bereichs referenzieren. Nehmen wir an, dass ich gerade hervorgehoben habe. Also, wenn Benutzer ich d das ist, dass man hier in diesem sagen wir, Kontext aus Regeln ist ein globaler wertvoller, auf den wir zugreifen können, so dass wir Daten von Profilen Schrägstrich Benutzer i dlesen können i d . Regeln ist ein globaler wertvoller, auf den wir zugreifen können, so dass wir Daten von Profilen Schrägstrich Benutzer i dlesen können. Wir könnten versuchen, auf gleich uns dot-Benutzer i d zuzugreifen , also bedeutet es eigentlich nur der Besitzer von diesem Dokument. Nur der eigentliche Benutzer kann seine eigenen Daten lesen. Jede andere Person, jeder andere Benutzer wird Zugriff verweigert. In Ordnung, so definieren wir die Regeln für „Nicht behandeln“. Also lassen Sie es uns kopieren und wir werden das gleiche für Punkt Recht anwenden? Also, was wird hier passieren? Wie wird es verstehen, die zwei Jahre unterzeichnet in Nun, lassen Sie uns zurück auf den Code, wenn wir dieses Zeichen in mit Pop Pop nennen. Jetzt ist unser Benutzer intern bei Firebase-Diensten angemeldet. Wenn wir danach versuchen, auf die Datenbank zuzugreifen, wird Firebase es aufheben und dieser Benutzer, den ich d wird der Datenbank bekannt sein und es wird dieser Auth Dot Benutzer i d sein. Und dann werden wir es gegen den Pfad überprüfen, in den wir schreiben. Klicken wir nun auf Veröffentlichen. Okay, Regeln veröffentlicht. Jetzt gehen wir zurück zur Datenbank und tatsächlich, lassen Sie uns kopieren, Visit ALS und lassen Sie uns sie auch einfügen . Datenbankregeln zu Jason. Also sind sie immer da. Richtig? Gehen Sie dann zurück zur Authentifizierung. Lassen Sie uns diesen Benutzer löschen und beginnen wir von vorne. Also werde ich auf klicken, Weiter mit Google. Ich wähle mein Konto und jetzt habe ich keinen Fehler. Jetzt bin ich eingeloggt. Also, wenn ich jetzt zurück zur Datenbank navigiere, kann ich sehen, dass ich Daten habe. Ich habe Profile und dass ich Benutzer habe ich d genau das gleiche wie wir hier haben. So funktioniert es also mit Feuerbasis. In Ordnung, also wenn wir es erweitern, können wir sehen, dass wir unseren Namen haben, gekühlt 16 ist, was mein Name auf Google-Konto ist. Und dann haben wir erstellt, bei denen Millisekunden intern von Feuerbasis gespeichert ist. In Ordnung, jetzt haben wir den Benutzer erstellt und unsere Signaturseite verwaltet. Herzlichen Glückwunsch. Ich schätze, es war nicht zu kompliziert für dich. weil es hier viele Dinge zu decken gibt. Signieren Sie den Zufluss als diese Datenbank als Sicherheitsregeln. Und alles geht auf einmal. Ich weiß, das ist schwer, aber vertrau mir, lass es nach einer Stunde gehen, oder vielleicht eines Tages, wenn du dir das alles noch einmal ansehen wirst . Es wird nicht so kompliziert sein. Alles klar, also lassen Sie uns unsere Änderungen begehen und dieses Video beenden, also werden wir ziehen, alles erreichen, und dann werden wir etwas wie die Seite bearbeiten und unterschreiben und mit Facebook Schrägstrich Go Mädchen. In Ordnung. Perfekt. Im nächsten Video werden wir unser Gespräch mit der Authentifizierung fortsetzen und unsere Benutzerverwaltung beginnen. Wir sehen uns das. 103. Profile – Context und globales Staatliches Management: Hey, in diesem Video möchte ich über Kontext, ein p i und globales Staatsmanagement sprechen . Wenn es darum geht, Benutzerprofile zu verwalten, wie wir dies erreichen können, wissen wir, dass es global die meiste Zeit innerhalb jeder Komponente zugänglich sein muss. Stellen Sie sich eine sehr weniger Komponente in der APP vor. Diese Komponente muss den Benutzernamen anzeigen, der derzeit in Frage signiert ist, wo wir diesen Benutzer genau verwalten. Nehmen wir an, in der APP-Komponente. Um den Benutzernamen zu erhalten, müssen wir ihn durch die Requisiten an jede nächste Komponente den ganzen Weg entlang des Baumes übergeben. Aber das ist nicht cool. Wir haben, wie, 10 Komponenten oben, und jede Komponente spielt eine Rolle darin, dass dies Requisitenbohrungen genannt wird. Wenn einige Wert wird weitergegeben, die Requisiten auf eine Menge von Ebenen tief, das ist nicht gut und sollte vermieden werden, um Probleme kniend zu vermeiden. Es gibt Kontext, ein P I in reagieren. Es führt das Konzept off Provider und Consumer-Provider ist eine Komponente, die alle ihre Kinder mit einem gewissen Wert oder Kontext bietet . Consumer ist eine Komponente, die den Kontext verbraucht und den Wert mithilfe von Kontext abruft. AP I. Wir können einfach unsere Benutzer in Provider-Komponente und dann Verbraucher verwalten. In jeder Komponente. Wir wollen Sondenbohren und Zwischenkomponenten vermeiden. Wir würden Benutzerkontext erstellen und Benutzernamen als Wert setzen. Dann würden wir Komponente um den Benutzer-Provider wickeln. Im Grunde erhalten alle Komponenten Zugriff auf den Benutzerkontext, um ihn innerhalb der Komponente zu konsumieren , wo wir den Kontextwert erhalten müssen, den wir verwenden Context-Hook nennen würden. Auf diese Weise sind wir in der Lage, den Benutzernamen von jedem Ort in unserer App zu erhalten. Es gibt keine Einschränkungen bei der Kontext-Verwendung. Wir sind in der Lage, es überall in der APP-Komponente um die Homepage herum mehrseitige Form und so weiter zu setzen. Alles klar, mal sehen, wie Kontext AP ich an dem Beispiel aus unserer Chat-Anwendung funktioniert. Lasst uns gehen. auf dem Ressourcenordner Lassen Sie unsauf dem Ressourcenordnereinen anderen Ordner erstellen, den wir Kontext aufrufen. Und hier werden wir all unseren erstellten Kontext setzen. Lassen Sie uns neue Datei und mobile Namen erstellen es nicht vielleicht Benutzerkontext, sondern Profilkontext. Ich denke, es ist besser geeignet in unserem Fall, Also lasst uns Profil Punkt Kontext doggy s. Also, was ist unsere Strategie? Wir werden diesen Kontext erstellen und ihn in unsere APP-Komponente einfügen, so dass jede andere Komponente in unserer Anwendung Zugriff darauf erhalten kann. Was müssen wir also tun, um einen Kontext zu schaffen? Wir müssen einfach Create-Kontext aufrufen, der aus dem React-Paket kommt. Also lasst es uns zur Verfügung stellen. Und sagen wir, es wird nur so Profilkontext sein. Jetzt müssen wir einen Provider erstellen, eine Komponente, und das wird alle seine Kinder mit diesem Profilkontext zur Verfügung stellen. Also lassen Sie uns schlecht Export CONST. Profil-Provider. Und es wird eine Komponente sein. Das wird also eine Funktion sein, die genau so ist. Alles klar, was müssen wir jetzt hier an Bord gehen? Was wird zurückkehren? Es wird Profilkontext-Anbieter zurückgeben und dann innerhalb dieses Anbieters brauchen wir Unterstützung all unserer Komponenten, was auch immer wir hineingehen. Es werden also unsere Kinder sein. Dieser Profilanbieter ist nur ein Rapper, also lasst es uns als Requisite hier drüben zerstören und es in die Provider-Komponente einfach so setzen . Alles klar, jetzt, wenn wir es haben oder wir sehen können, muss reagieren im Umfang sein. In Ordnung, lassen Sie mich reagieren. Und manche Leute werden diese Warnung jetzt loswerden, wie wir tatsächlich alles tun können. Da dies also eine Komponente ist, können wir unser Staatsmanagement direkt hier machen. Lassen Sie uns Teoh unsere private Route navigieren, und hier wissen wir, dass wir dies für jetzt setzen. Wir setzen diesen Stier in Wert. Dies fällt nur standardmäßig. Also lasst uns das behandeln und er wird unseren Kontext konsumieren. Also lasst uns das sagen. Sagen wir mal, Bullion. In diesem Kontext werden wir erstellen, Lassen Sie uns Profil sehen und das Profil als verwendeter Zustand, der ,sagen wir, Abul im Wert für jetzt sein wird sagen wir , nur um zu demonstrieren, wie Kontext funktioniert, um an Wert an diesen Kontext zu übergeben, müssen wir es als Requisite setzen, um ihre Komponente hier zur Verfügung zu stellen. Und wir müssen unser Profil einfach so weiterleiten und gehen, um das Profil zu treffen. Lasst uns es einfach nicht so zerstören. Alles klar, wir sind bereit zu gehen. Das ist es. So können wir unseren Kontext jetzt verwalten, um ihn tatsächlich innerhalb unserer App innerhalb unserer Komponente zu verwenden . Wir müssen es hier in App-Komponente nur um Schalter setzen. Also lassen Sie uns eingeben, was wir es Raw-Datei-Provider genannt haben. Und das war's. Und sie werden über Kontext nachdenken, dass es sehr anpassbar sein kann, weil dies nur eine Komponente ist . Nehmen wir an, wenn wir brauchen, um Benutzer mit spezifischen I d zu bekommen. Wir können einfach diesen Benutzer i D als Requisite übergeben, und dann können wir es von Requisiten hier greifen und dann unsere A P I Anruf oder jede andere staatliche Verwaltung im Zusammenhang mit diesem bestimmten Benutzer i Das ist wirklich, wirklich cool, Alles klar, jetzt, da wir alle unsere Komponenten mit Profil-Provider zur Verfügung gestellt haben, ohne es zu verbrauchen. Also, wie sind wir in der Lage, das zu tun? Wie Sie sich erinnern, habe ich erwähnt, verwenden Sie Kontexthook. Also innerhalb unserer privaten Route, Statt dies zu tun, können wir einfach Konstante Profil gleich verwenden Kontext, der aus dem React-Paket kommt und dann innerhalb der Datensätze innerhalb des Elternteils ist, müssen wir den Kontext angeben, den wir erstellt haben. Es wird dieser Profilkontext sein, und es ist wirklich mühsam, Profilkontext jedes Mal zu referenzieren, wenn wir es mit Verwendungskontext nennen . Um das zu vermeiden, können wir einen anderen Hook erstellen, einen Rapper für Profilkontext, um ihn zugänglicher zu machen. Also von Profilkontakten Ja, Datei, wir könnten Const exportieren. Nehmen wir an, Verwenden Sie Profil Hook , der Kontext verwendet wird, Profilkontext einfach so. Und jetzt heißt es, dass man das nicht nennen kann. Oh, entschuldigen Sie mich. Es wird eine Funktion sein, die zurückgibt, was dieser Verwendungskontext zurückgibt. Und dieser Verwendungskontext gibt uns einen Wert zurück. Aus unserem Code können wir einfach das Nutzungsprofil aufrufen und den Verwendungskontext von hier entfernen. Und gerade jetzt wird dieses Profil dieser Wert sein, den wir hier übergangen haben. Also, jetzt können wir überprüfen, ob kein Profil, dann werden wir so umleiten und lassen Sie uns genau das gleiche für das öffentliche Profil tun. Also von hier, anstatt falsch, werden wir verwenden Profil, und das ist es im Grunde. Jetzt habe ich bereits die App gestartet, Also, wenn ich ein frisches hatte, hat sich nichts geändert. Wie Sie sehen können, wenn ich versuche, auf die Homepage zuzugreifen, werde ich weitergeleitet, um sich anzumelden, damit nichts geändert wurde. Aber jetzt verwalten wir unser Profil als ein globaler Staat, auf den wir von jeder Komponente zugreifen können, nicht nur von öffentlichen Crowd. So kann jede Komponente, die sich innerhalb des Profilanbieters befindet, auf ihren Kontext zugreifen. Ordnung, mit dem Verwendungskontext, Hook und wir haben einen Wrapper um den Verwendungskontext mit Profilkontext erstellt , der Profil verwendet wird. So ist es jetzt noch benutzerfreundlicher für uns zuzugreifen. Außerdem ist es sehr wichtig zu erwähnen, dass wir diesen Profilkontext erstellt haben. Oder vielleicht stellen wir uns vor, dass wir so etwas wie Gegenkontext vorgeführt haben. Sagen wir 12345 alles in Ordnung, und in unserer App. Anstatt es so zu verwenden, verwenden wir es mehrmals. Also lassen Sie uns sagen, für die Anmeldeseite haben wir, sagen wir Counter Context Counter Provider wie dies alles in Ordnung, und das gleiche gilt für zu Hause. Also haben wir es so. Wir haben jetzt zwei verschiedene Kontakte. Ihre Definition ist die gleiche, aber sie sind anders. Also, wenn innerhalb Anmeldeseite, lassen Sie uns sagen, versuchen und Zugriff auf Kontext off counter, dann werden wir zu einem bekommen. Nun, Sie, wenn wir versuchen, auf den gleichen Kontext mit dem Verwendungskontext zuzugreifen, haken Sie innerhalb der Homepage ein, erhalten aber einen anderen Wert, weil sie auch unterschiedliche Zustände haben. In Ordnung, also ist es, als würde man Zustände trennen, aber mit einer Definition muss nur darauf hinweisen , dass es anders ist. Also, das ist im Grunde es im nächsten Video, was wir tun werden, wir werden weiterhin mit unserem Profilanbieter arbeiten und Leute haben schließlich unseren angemeldeten Firebase-Benutzer verwaltet . Wir sehen uns dort. 104. Globales Profile mit Kontext: Hey, willkommen in diesem Video. Wir werden unseren angemeldeten Firebase-Benutzer mit Kontext verwalten. AP Ich Lassen Sie uns gehen Im vorherigen Video, wenn wir den Kontext AP kennen lernten wir erstellt Profilanbieter . Also lassen Sie uns jetzt den tatsächlichen Zustand anstelle eines Bullen im Wert verwenden. Lassen Sie uns also false durch null ersetzen. Und lassen Sie uns auch aufrufen, Lassen Sie uns die Satz-Profil-Update-Funktion definieren. Ordnung, dann werden wir Yousef Act benutzen, um Benutzer von der Feuerbasis zu bekommen, wenn die Komponente montiert wird. Also lassen Sie uns Ihre Tatsache nutzen und hören, was wir tun werden. Wir werden den Staat geändert abrufen. Also von Firebase gs, werden wir unser Objekt verwenden. Und wenn wir Punkt setzen, wenn wir auf, wir sehen, dass wir auf beiden Zustand geändert verwenden können. Also hat sich das auf den US-Bundesstaat geändert. Erlauben Sie uns, den aktuell angemeldeten Benutzer innerhalb der Feuerbasis zu abonnieren. Und innerhalb dieses Abonnements sind wir in der Lage, auf off object zugreifen. Also lassen Sie es uns so sagen und für die Analyse. Konsul, loggen Sie das Objekt ab. Nun, wenn wir zurück zur App navigieren, wenn wir unseren Rat öffnen, werden wir dieses Objekt aus sehen. Und wenn wir erweitert es ist genau das gleiche Objekt, wenn wir mit der entweder Facebook oder Google angemeldet . So einfach kann es gemanagt werden. Wenn wir bei der App abgemeldet wären, würden wir dieses Objekt nicht sehen. Das wäre es jetzt. Also ist die Sache, warum wir es gerade sehen? Da Firebase Manager-Sitzungen für uns, müssen wir nicht alles implementieren. Sobald wir angemeldet sind, Autor, Objekt wird automatisch für uns ausgefüllt und für uns verwaltet. Wir müssen nicht alles tun, was wir brauchen, um sich nur anzumelden oder abzumelden, und dann wird das Benutzerobjekt hier sein. Also, wenn wir diese Informationen verwenden, was wir das tun können, anstatt nur Konsul, schauen Sie, wir werden fragen, ob beide Objekte existieren. Wenn es mit einem gewissen Wert gefüllt ist, dann werden wir etwas tun. Andernfalls, wenn dieses Earth-Objekt nicht das Objekt ist, wenn es sich noch befindet, ist der Benutzer nicht angemeldet. Also dieser On-Off Zustand geändert, wird mindestens einmal aufgerufen, wenn die Komponente mountet und wenn wir nicht angemeldet sind, dann wird es gesetzt, um zu wissen, auch wenn wir uns von der Anwendung abmelden, weil dies das Abonnement ist . Es wird von diesem Anruf abgeholt. Back and off Objekt wird so zu wissen sein. Also in diesem sonst werden wir Profil auf jetzt und hier setzen, wenn wir das Objekt haben, das wir aufrufen können, Profil setzen und einige Profildaten setzen, die wir hier definieren werden. So werden unsere Profildaten der nächste sein, der es wird der erste Benutzer I d sein , dass wir von beiden Objekt Punkt Ihr i d bekommen, was wir hier sehen können. Und es wird unseren Benutzer widerspiegeln I d inthe e off viele Bibliothek, die wir auf Feuerbasis gesehen haben. Und auch ich war Benutzer ich d in Echtzeit Datenbank. Dann wollen wir vielleicht auch E-Mail. Also werden wir Objekt-Punkt-E-Mail übergeben, und auch, wir brauchen unsere Daten aus der Echtzeit-Datenbank, also müssen wir es tatsächlich hier bekommen. Also, was wir tun werden, wie wir sehen können, wird Profil bereits erklärt. In Ordnung, vielleicht weniger. Nennen Sie es einfach Daten und die Profildaten. Okay, also hier, um aktuelle Daten aus der Datenbank für diesen Benutzer zu erhalten, müssen wir erneut Datenbank von MISC Firebase aufrufen. Dann werden wir noch einmal die Referenz setzen, wir werden Profile machen. Dann werden wir ausgießen Objekt Punkt Ihre i d Dann wechseln wir Zitate für String contar Population und dann wollen wir Luftzeitabonnement für unseren Benutzerführer gießen. Wenn sich also etwas geändert hat, dann wollen wir darüber informiert werden. Wir wollen nicht alles manuell verwalten. Also mit Echtzeit-Datenbank und mit tatsächlich jeder Datenbank und Feuerbasis, ist es sehr einfach. Also, um Daten nur zu erhalten, wenn wir dot once Methode aufrufen, um ein Echtzeitabonnement auf diese Daten zu setzen, müssen wir es als Funktion und erstes Argument aufrufen. Wir müssen das Ziel angeben, das Ereignis. Sagen wir so auf Wert. Wir wollen diesen Colback ausführen. Also, wenn sich unsere Daten an diesem Pfad innerhalb der Datenbank wie irgendetwas ändern, werden diese Colback wie jedes Mal ausgelöst und wir erhalten einen Snapshot. Also lasst uns Konsul Luck eine Momentaufnahme einfach so machen. Also jetzt sind wir zu Hause, weil wir tatsächlich einige Profildaten bekommen. Und wie Sie sich erinnern, innerhalb der privaten Route gegen das Profil, überprüfen wir innerhalb der privaten Route gegen das Profil,so dass wir die Anmeldeseite nicht sehen. Okay, das ist gut. Unser Datensnapshot hat also Schlüsselknotenreferenz und ein paar andere Dinge und Meta-Daten im Zusammenhang mit diesem Snapshot an diesem Pfad innerhalb der Datenbank. Nun, in der Momentaufnahme haben wir diese Methode. Es wird Snapshot Punkt-Wert Snap Shirt, dunklen Wert genannt . Und es wird uns die Daten aus der Datenbank geben, Informieren Sie sich JavaScript-Objekt. Lassen Sie uns also sagen, Profildaten sind gleich Snapshot, nicht Wert. Und jetzt lasst uns Salak Profildaten wie diese kommen. Schauen wir es uns an. Jetzt. Wenn ich die Seite aktualisieren, kann ich sehen, haben ein Objekt mit erstellter Anzeige und Namen, die sie sieht 16. Genau die gleichen Daten, die wir innerhalb der Datenbank haben. Was müssen wir jetzt tun? Wir können dieses Profil tatsächlich zerstören. Daten schwächen D Struktur, Namen und erstellt, dass so. Und hier können wir dieses Datenobjekt in dieses Abonnement so verschieben, und dann, was wir tun können. Wir können dies auch bei Profildaten hier drüben verschieben. Und für diese Daten können wir Namen setzen und auf genau so erstellt. Also unser Profil am Ende werden wir an Ihrer i D E-Mail erstellt haben. Richtig? Das ist es also. Und jetzt haben wir diesen Datenprofilstatus im Kontext weitergegeben. Also innerhalb unseres privaten Outs müssen wir auch irgendwie verfolgen, wenn wir gerade angemeldet sind. Also müssen wir den Ladezustand setzen, um einen Spinner oder etwas anderes zu setzen. Also lassen Sie uns einen anderen Zustand setzen, den wir nennen, ist geladen und gesetzt wird standardmäßig geladen. Es wird auf „true“ gesetzt werden. Und gleich nachdem wir gesagt haben, dass das Profil, das wir Set nennen, geladen wird und es auf falsch gesetzt wird. Oder wenn wir kein Profil haben, rufen wir Set ist geladen und setzt auch Stürze. Alles klar, jetzt ist das geladen. Wir werden mit unserem Kontext vorbeigehen. Also, anstatt nur Profil innerhalb zu übergeben, werden wir ein Objekt mit dem Ladezustand und auch Profil übergeben. Also, jetzt, innerhalb unserer privaten Route, wenn wir verwenden Profil, erhalten wir ein Objekt mit seinem Profil und Profilobjekten im Inneren. Also werden wir unser Profil von ihm strukturieren und das gleiche Handy tun vier verwenden Profil. Also jetzt, was wir hier tun können, innen privat heraus können wir tatsächlich nutzen Dies ist Senkung. Also lasst uns d Struktur wird geladen und was wir fragen werden. Also werden wir einen anderen, wenn hier drüben, und wir werden fragen, ob unsere Daten geladen werden und wir immer noch keine Profildaten haben. Dann werden wir den Container von unserem Anzug zurückgeben und drinnen legen wir die Gesetzesordnung. Es wird ein Spinner sein, auch eine Komponente aus unserem Anzug, und es wird zentriert sein. Es wird zentriert werden Vertical e Wolf Größe whoops. Off-Größe entspricht M d. Dann wird der Inhalt geladen, und die Geschwindigkeit wird langsam sein. Und lassen Sie es uns bewegen, um es zu vermeiden, dass es ihr geliehen hat. Lassen Sie es uns einfach so nach oben bewegen. Ordnung, das ist also unsere erste Bedingung, und dann müssen wir das auch ändern. Wir werden fragen, ob wir kein Profil haben, und wenn wir keinen Ladezustand haben, dann werden wir umleiten. In Ordnung, also schauen wir es uns an. Jetzt. Wenn wir die Seite aktualisieren, sehen wir den Spinner ziemlich cool, richtig? Und erst wenn wir die Daten bekommen, sehen wir die Homepage. Alles klar, machen wir genau das Gleiche für die öffentliche Menge. Also lasst uns diese Logik kopieren und sie hier rüber stellen. Lasst uns Destructor lädt und wir werden fragen, ob wir geladen haben und wir kein Profil dann werden wir wieder den Ladezustand wie diesen setzen, wenn wir Profil haben und haben, dann werden wir wieder den Ladezustand wie diesen setzen, wenn wir Profil haben und es könnte ein bisschen schwierig sein. Also, wenn wir Profil haben und lädt auf false gesetzt ist, dann werden wir umleiten. Alles klar, das ist es im Grunde. Ich möchte nur, dass Teoh einen weiteren wichtigen Schritt hier macht, weil wir mit Abonnements in reagieren arbeiten . Immer wenn wir mit Echtzeit-Listern auf die Daten arbeiten, verwenden wir ein Abonnement. Wenn wir also ein Abonnement haben, müssen wir es abbestellen, wenn wir es nicht brauchen. So änderte sich das auf der US-Bühne. Wenn Sie sehen können, gibt es Feuerbasis abgemeldet. So gibt es uns eine Funktion, die wir aufrufen müssen, um dieses Abonnement auf Off-Status geändert abzumelden . Also lassen Sie es sagen, sagen wir auf sub und wir werden dies auf sub und unsere Cleanup-Funktion von Yousef handeln abrufen . Also werden wir eine Funktion zurückgeben und hier werden wir abrufen. Also genau so und das gleiche gilt für unsere Datenbank-Referenz hier drüben. Also in dieser Vergangenheit haben wir einen Echtzeit-Zuhörer, der Wert ist, und es ist unser Colback. Wir wollen also sicherstellen, dass wir uns auch von diesem abgemeldet haben. Also hier, sagen wir, in dieser Verwendung der Tatsache, werden wir gießen, einen Benutzer referenzieren. Dann werden wir zuweisen Verwenden Sie eine Referenz auf Datenbankreferenz an diesem Pfad wie folgt und dann Benutzer rau auf Wert. Wir werden diesen Callback ausführen, wenn wir keine Daten haben. Wenn unser Benutzer nicht angemeldet ist, Wenn wir kein anderes Objekt haben, werden wir fragen, ob Benutzer-Ref definiert ist. Dann rufen wir an, benutzen raue Punkt aus, denn wenn ich Punkt hier drüben setze, kann ich anziehen, ich könnte einmal setzen und auch ich kann abschieben und das weg, wie Sie sehen können, löst einen Callback, der zuvor mit an verbunden ist, so können wir. Auf diese Weise können wir diesen Rückruf von diesem Pfad innerhalb der Datenbank abbestellen. Eigentlich, das gleiche werden wir in unserem Cleanup für den Gebrauch Effekt tun. Also dieses, wenn wir uns abgemeldet haben und dieses, wann immer wir die Komponente belegen, also hier werden wir fragen, ob Benutzer Raph, dann werden wir einen Ref Dot aus dieser Benutzerreferenz abbestellen. Alles klar, also ist es im Grunde. Ich hoffe, es war nicht zu verwirrender Grund für mich. Wann? Zum ersten Mal. Als ich es sah, war es das, aber am Ende macht es Sinn. Alles klar, lassen Sie uns unsere Änderungen übernehmen und dieses Video beenden. Wir werden alles erledigen. Dann werden wir alles mit der Nachricht begehen. Etwas wie Mann Alter Benutzer mit Profilkontext Setzen riel time subs so etwas. Alles klar, wir sehen uns im nächsten Video. 105. Anfängen zu den Sidebar und Dashboard zu erstellen: Hey, willkommen. Jetzt, da wir den vollen Signierfluss haben, lasst uns endlich anfangen, unsere Homepage zu bauen. Wir werden von der linken Seite beginnen. Also zuerst werden wir unsere Schaltflächen als Chatroom Liste erstellen und dann gehen wir nach Maine. Shatt-Fenster. Lassen Sie uns also innerhalb von Seiten statt dieses def gehen. Lassen Sie uns unsere Körnung definieren. Also wird es eine große Komponente sein, die fließend sein wird und Klasse Name wird ein Chuan 100 sein. Wir werden es in voller Höhe machen. Dann im Inneren werden wir Element steuern und dann werden wir Säulenelement aus unserer Anzug gießen . Für kleine Geräte werden alle Spalten benötigt, die 24 Spalten sind und von mittleren Geräten ausgehend. Wir werden es so etwas wie acht sagen. Nicht Gesundheit, aber acht. Und in dieser Spalte werden wir Sidebar-Komponente verwenden, aber nicht diejenige, die aus unserem Anzug kommt. Der, den wir selbst erschaffen werden. Lass es uns retten. Und unter Komponenten, lassen Sie uns eine neue Datei erstellen, die wir Sidebar doggy s nennen. Lassen Sie uns es öffnen und fragen Sie einen Ordner nach einem Rappen. Dave, ich werde den Klassennamen auf die volle Höhe setzen und dann ein bisschen nach oben klopfen. Also drinnen werden wir es in zwei Elemente aufteilen. Also werden wir den oberen Teil mit unseren Buttons haben und unten werden wir eine Chatroom Liste haben . Also lassen Sie uns zuerst def für unseren oberen Teil und unten erstellen, weil wir noch kein Geschwätz auf der Liste haben . Lassen Sie uns einfach unten Text wie folgt. Also in diesem verschiedenen wird Dashboard Jonggle gießen, die in einem Moment erstellen und speichern Sie es. Also andere Komponenten. Lassen Sie uns einen neuen Ordner erstellen , den wir den Bericht hier benennen werden. Bubble definierte zwei Dateien. Zuerst wird indizierte Togs sein, was unsere Dashboard-Komponente sein wird, aber wir werden alles verwalten, aber im Moment werden wir es leer halten. Also lassen Sie es uns nennen, Papa Bericht und einfach Hallo Einblick und zweites Element wird Dashboard Jonggle sein. Also hier werden wir unseren Knopf und den Drover selbst definieren. Also zuerst wollen wir das Wickeldiv loswerden. Dann werde ich hier einen Knopf definieren , der unser Tobler sein wird. Nehmen wir an, es wird ein Blockelement sein. Es wird blauen Kragen haben und innen wollten Aiken setzen, die wir aus unserem Anzug importieren. Aiken wird dieses Wort sein. Und dann wird Text Dashboard wie folgt sein. Nun sagen wir eigentlich mit und mal sehen, was haben wir? Also, wenn wir die Seite in der Seitenleiste aktualisieren, wir haben kein Dashboard bis los, Lassen Sie uns importiert. Und auch zu Hause Wir haben keine Sidebar. Lassen Sie uns auch importiert. In Ordnung, schauen wir es uns an. Richtig. Also haben wir Knopf. Aber wenn wir klicken, passiert nichts. Also lassen Sie uns unsere Drover-Komponente auf oder Drover definieren, Element hier neben Button. Ich werde Drover setzen, der aus unserem Anzugpaket kommt und es ist nicht so schließendes Element drinnen. Wir müssen tatsächlich Drover-Elemente gießen, aber wir werden sie in diesem Index Erwachsenen-NGS-Datei definieren. Also für diesen Kampf müssen wir nur diese Show-Eigenschaft definieren und es wird sein Es muss ein Bowline-Wert sein , der anzeigt, wann dieser Drover geöffnet wird. Dann müssen wir auf Höhe Ereignis definieren und dann müssen wir auch die Platzierung definieren. In unserem Fall wird es auf der linken Seite sein oder jetzt müssen wir tatsächlich unsere Handler oder Zustand für unseren Drover definieren . Wir müssen den Überblick über seinen Zustand behalten. Und da wir viele Motels oder Drover in unserer Anwendung haben werden, und wir werden eine Menge der gleichen Logik wieder verwenden, schlug ich vor, eine benutzerdefinierte Hoffnung zu schaffen, dass wir den Modellstatus benennen und es wird nur drei Elemente ist auf der Höhe und auf der Ausstellung geöffnet. Also unter MISC, lassen Sie uns neue Datei benutzerdefinierte Haken GS erstellen. Hier werden wir eine neue Funktion definieren, die unser Haken sein wird , den wir mit Modellstatus benennen werden. Es wird Standardwert erhalten. Nehmen wir an, Standardwert , der auf false gesetzt wird, wenn er nicht definiert ist. Im Inneren wir Zustand definieren, und standardmäßig wird dieser Zustand unser Standardwert sein, den wir als Argument übergeben und auch hier werden wir ein paar Hilfsfunktionen definieren. Sagen wir es. Erste Funktion wird offen sein, und es wird eine umwickelte Verwendung kalt zurück im Voraus um es zu optimieren, und er wird anrufen, sagte ST, und wir werden es auf wahr und das gleiche setzen wir gelten zu schließen. Aber statt wahr, werden wir hier falsch schütten und von diesem Haken werden wir unseren Staat zurückgeben. Vielleicht lassen Sie uns umbenennen es auch offen ist, und das hier Set ist offen. Also von diesem Haken, werden wir zurück ist offen, offen und schließen Helferfunktionen. Und vergessen Sie nicht, den diesjährigen Modellstatus aus benutzerdefinierten Hooks zu exportieren. Ordnung, also in Arab oder Toggle, werden wir diesen Verwendungsmodellzustand verwenden, der uns zurückgibt, ist offen. Dann gibt es uns nah und offen zurück. Also, jetzt können wir es benutzen. Also auf Höhe, werden wir mit unserer eigenen Kleiderfunktion angeben, die wir in der Hook-Show definieren. Es ist ein Bulle im Wert, so wenig angeben ist offen und auch für unsere Schaltfläche. Wenn wir darauf klicken, wollen wir den Drover zeigen. Also für diese Schaltfläche für auf Klick Ereignis, wir werden einfach öffnen angeben. In Ordnung. Und jetzt müssen wir eigentlich etwas in Rover stecken. Es wird dieses Element sein. Also lassen Sie uns Dashboard definieren und Sie werden sehen, dass es von Punkt importiert wird Es bedeutet, dass es aus unserem aktuellen Ordner importiert wird. Also, warum wir Index Gs so setzen? Wenn wir es also in einer anderen Komponente verwenden, sagen wir innerhalb von Seiten und der Art, wie wir es importieren , wird es so sein. Wir werden aus Komponenten importieren. Dieser Bericht gibt keine Dashboard-Index GS an, da er als Index bezeichnet wird. Ja, wir können nur den Ordnernamen angeben, wo dieser Index Punkt gs re Websites und es wird funktionieren. Alles klar, jetzt lassen Sie uns alles retten und schauen wir uns mal an. Wenn ich nun auf das Dashboard klicke, funktionierte es perfekt. Also schätze ich, das war's für dieses Video. Im nächsten Video werden wir fortfahren und unseren Sterblichen ein wenig reaktionsfähiger machen. Denn wenn ich einfach darauf klicke, wenn ich, weißt du, weißt du einfach die Größe des Fensters ändern will, dann siehst du, dass es statisch bleibt. Dies ist kein benutzerfreundliches Verhalten, daher werden wir es später beheben. Aber für jetzt, lassen Sie uns unsere Änderungen zu begehen, und wir werden sagen, starten oder beginnen, die Sidebar-Komponente zu bauen. In Ordnung. Perfekt. Wir sehen uns im nächsten. 106. Responsive Sidebar mithilfe der Media: Hey, willkommen hierbei. Wir werden unseren Job, äh,den wir im vorherigen Video erstellt haben , reaktionsschnell machen äh, . Was ich meine ist, dass jetzt, wenn wir versuchen, unser Element zu inspizieren und wenn wir Drover öffnen, wenn wir die Größe des Fensters ändern, es statisch bleibt. Nun, es reagiert überhaupt nicht, was wir tun können, um das für Drover zu beheben. Es ist diese Sonde verfügbar, die voll ist, was bedeutet, dass Drover wird für den Vollbildmodus verfügbar sein. Lassen Sie uns diese vollständige Eigenschaft überprüfen und mal sehen, was haben wir? Also gerade jetzt, wenn wir es öffnen, wenn wir auf Desktop-Geräten sind, können wir sehen, es ist Vollbild. jedoch Wenn wirjedochauf mobilen Geräten sind, sieht es gut aus. Also, was? Dio schwächen? Im Idealfall möchten wir diese Vollbildschirmeigenschaft nur dann aktivieren, wenn wir auf mobilen Geräten sind . Also müssen wir einige es programmgesteuert gut bestimmen, wir können tatsächlich Medienabfragen verwenden, aber sie sind nur verfügbar und CSS Aber mit Hooks können wir das gleiche Ergebnis programmgesteuert erreichen. Also lassen Sie uns die Asset-Datei den Assets-Ordner öffnen und hier eingeschränkt Medienabfrage gs verwenden. Lassen Sie uns es öffnen und kopieren Sie diesen Haken jetzt Lassen Sie uns diesen Haken auf unsere benutzerdefinierten Schweine dgs und lassen Sie uns importieren eine Tatsache von reagieren. Also, jetzt, was dieser Haken macht es Haken in Fenster viel Medien a p I, und es erlaubt uns, Medienabfragen zu manipulieren. Programmgesteuert werde ich hier nicht in Details eintauchen. Mal sehen, wie es funktioniert. Also werde ich die Datei speichern. Dann kommen wir zurück zu Dashboard Tuggle. Und hier werden wir diesen Gebrauch Media Query Hook nennen und innerhalb müssen wir einen Medien-Breakpoint übergeben . Nehmen wir an, wir werden unsere Eltern leichter öffnen und wir werden Max mit 1992 Pixeln passieren. Und jetzt kehrt dieser Haken bei Bullen zurück, der anzeigt, ob er wahr oder falsch ist. Mit diesem können wir überprüfen,ob wir derzeit auf einem Gerät mit 992 Pixeln sind. Mit diesem können wir überprüfen, Also lass uns arm ist mobil und diesen Bullen werden wir zahnige, volle Requisite passieren . Wenn wir also auf mobilen Geräten sind, werden wir die volle Eigenschaft aktiviert haben. Wenn wir auf Desktop-Geräten sind, wird dies auf Stürze gesetzt und wir werden diese volle Eigenschaft nicht haben, wenn wir sie speichern. Lassen Sie uns zurück zur App jetzt, wenn wir auf mobilen Geräten sind. Wenn unsere Bildschirmgröße weniger als 992 Pixel ist, haben wir unseren vollen Drover und es funktioniert perfekt. Und wenn wir auf Desktop-Geräten sind, haben wir diesen statischen Drover, der nicht geändert wird. Nun, das ist genau das Verhalten, das wir wollten. Also hier sind wir mit unserer Reaktionsfähigkeit fertig. Lassen Sie uns dieses Video beenden und unsere Änderungen übernehmen. Lassen Sie uns alles auf den get setzen und wir werden unser Commit als Edit verwenden Media Query Hook nennen und Drover ansprechbar gemacht. Ok, perfekt. Wir sehen uns in der nächsten. 107. Dashboard - Teil 1: Hey, willkommen in diesem einlösbaren. Weiter bauen unsere Sidebar und wir werden anfangen, genau Dashboard zu bauen. Lass uns gehen. Also zuerst, öffnen wir Index-Togs und hier statt zu besuchen, wenn wir Drover-Elemente verwenden wollen. Da wir also keinen Rapper haben, weil wir ihn innerhalb des Flughafens definiert haben, umschalten diese Drover, werden wir Reaktionsfragmentinformationen wie diese verwenden. Also unser Job, er Elemente werden drover dot nicht über dot Heather Inside Header betitelt. Wir werden Drover Dot Titel bekommen und weil aus V s Code Bark mit React Fragment Jetzt habe ich diese Datenduplizierung, aber das ist in Ordnung. Also als nächstes hatten Sie er wir Drover Dot Körper haben und dann werden wir Drover Dot Footer genau so haben. Also im Körper waren dabei, Benutzerdaten anzuzeigen. Also hier werden wir portieren. Sagen wir h drei Element und dann werden wir sagen,, Hey, Benutzer oder wir haben Profil. Wir haben Punktnamen profiliert. Dieses Profil wird also unser Profil sein, das wir von der Verwendung Profil-Hook erhalten. Das ist unser Kontext. Also rufen wir Nutzungsprofil an und ich habe keine Intelligenz. Also lasst uns Profilkontext öffnen. Und jetzt, wenn ich Intelligenz lege, wird es wichtig für mich sein. In Ordnung. Gut. Also im Körper haben wir Text innerhalb des Titels angezeigt. Wir ziehen nur Dashboard und in der Fußzeile, werden wir Abmelden Button hinzufügen. Also lassen Sie uns Schaltflächenelement hinzufügen. Es wird ein Bloke Element sein. Es wird rote Farbe haben und für unclipped werden wir auf Abmelden angeben und wir werden gegossen Abmelden als Text. In Ordnung, also vielleicht lassen Sie uns einfach einen Klick für jetzt entfernen und lassen Sie uns diese H drei Tack unten löschen . Schauen wir es uns an. Was haben wir als Ergebnis? Wir haben recht. Perfekt. Jetzt haben wir Hass. Sie sieht 16 aus, was unser Benutzername ist. Und dann haben wir abgemeldet Button, aber es hat noch keine Funktionalität, also lassen Sie es uns hinzufügen. Nun, wenn wir uns von der Anwendung abmelden, möchten wir, dass Sie auch dieses Modellfenster schließen. Aber diese enge Funktion rezitiert innerhalb Data Board Togo. Also schlug ich vor, ein Abmelden zu definieren, innerhalb des Dashboard-togo zu funktionieren und es dann an die Dashboard-Komponente weiterzugeben. Also hier werden wir Const auf Abzeichen setzen. Und weil wir diesen offenen Zustand hier drüben haben, jedes Mal, wenn wir ihn öffnen und schließen. Wir werden eine neue Kopie dieser Funktion bei der Abmeldefunktion haben. Also wollen wir diese Kopie behalten. Wir wollen, dass Sie es auswendig lernen. Also werden wir verwenden Rückruf im Voraus und innen würden die nächste Logik setzen. Wir müssen Abmelden aufrufen, was auf dem Eid verfügbar ist. Objekt? Oh, nicht abmelden. Melden Sie sich einfach ab. Und das war's. Das wird sich komplett abmelden. Unser derzeitiger Benutzer. Alles wird von der Feuerbasis verwaltet. Dann müssen wir Alarmbereitschaft setzen, was ein in für Alarmbereitschaft sein wird. Wir werden sagen, abgemeldet. Es dauert vier Sekunden und dann schließen wir auch den Drover. Da es also von unserem benutzerdefinierten Hook stammt, mussten wir es als Abhängigkeit übergeben. Aber das ist in Ordnung. Kleidungsfunktion wird im Gebrauch Modellzustand gespeichert, weil wir es innen setzen. Verwenden Sie CLO zurück, wie Sie sich erinnern. Nein, lasst uns weitergehen. Melden Sie sich beim Dashboard und im Dashboard ab. Lasst es uns verzehren. Melden Sie sich ab. Ist es kapitalisiert? Ja, das ist es. Also vier weiter. Melden Sie sich ab. Klicken Sie auf. Wir werden die Abmeldefunktion anlegen. In Ordnung? Es scheint in Ordnung zu sein. Jetzt schauen wir es uns an. Wenn wir unsere Tafel öffnen, wenn wir jetzt auf Abmelden klicken, sind wir abgemeldet. Und die potenzielle Frage könnte sein, warum wir zur Anmeldeseite weitergeleitet werden. Das liegt daran, dass wir in unserem Kontext das „Aus-Zustand“ geändert haben. Wenn wir uns also abmelden, weil es sich um ein Echtzeit-Abonnement handelt, wird Firebase es abholen. Es wird den Benutzer abmelden, und diese Colback wird ausgelöst. Also, wenn wir kein Objekt haben, rufen wir set profile, um zu wissen. Und wenn wir Profil jetzt oder undefiniert gesetzt haben, wenn wir innerhalb der privaten Route schauen, leiten wir Benutzer um sich anzumelden. Das ist also genau das, was passiert. So haben wir jetzt das komplette Signier- und Abmeldesystem, das nahtlos funktioniert. Alles klar, um zu überprüfen, dass alles funktioniert. Gut. Melden wir uns noch einmal an und ich werde wieder genau das gleiche Konto auswählen. Jetzt bin ich umgeleitet. Ich bin eingeloggt und wieder, ich habe Hass. Sie sieht 16 aus. So perfekt. Es funktioniert so, wie es funktionieren muss. Lassen Sie uns nun unsere Änderungen übernehmen und dieses Video beenden. Wir werden portieren, alles erreichen, dann begehen wir. Gestartet ein Dashboard zu bauen und es Abmelde-Button und Anzeige Benutzername. Alles klar, wir sehen uns in der nächsten. 108. Dashboard – Wiederverwendbare und bearbeitbare Komponenten (Teil 2): Hey, willkommen in diesem Führer waren weiterhin zu bauen, dass Schweinefleisch und verbal eine Komponente erstellen, die wir mehrmals in unserer Anwendung an ein paar Stellen wiederverwenden werden. So wird es eine Eingabe mit den beiden Tasten sein, die während ich zu bearbeitet wurde. Wenn wir es speichern, aktualisieren wir tatsächlich Daten innerhalb der Datenbank. Lass uns gehen. Also zuerst schlage ich vor, die eigentliche Komponente zu erstellen. Also unter Komponenten, lassen Sie uns neue Datei erstellen glaubwürdig in Port für jetzt. Lass es leer sein. Lass uns einfach Hallo hier drüben setzen. Lassen Sie uns zunächst definieren, wie wir es verwenden werden. Öffnen wir die Wortdatei hier unter Hey, Profilname. Lassen Sie uns Teiler von unserem Anzug setzen. Und dann lassen Sie uns Edita ble Import definieren. Also was? Requisiten sollten Einsicht wieder passieren. Also zuerst wir den Anfangswert übergeben, die Eingabe traurig sein wird. Also lassen Sie uns Anfangswert setzen , der Profil dunkler Name sein wird. In Ordnung, dann müssen wir auch auf sichere Funktion definieren und das wird ausgelöst, wenn wir die Eingabe speichern . Also lassen Sie uns sicher anziehen und definieren es hier drüben. Also werden wir auf sichere und diese Callback-Funktion setzen, sie wird den gleichen Wert wie ein Argument erhalten. Lassen Sie uns also neue Daten und lassen Sie uns diese Funktion leer. Außerdem wollten wir vielleicht ein Etikett vor der Eingabe melden, also haben wir die Möglichkeit, eine reaktive Komponente als Requisite an die essbare großzügige Komponente zu übergeben . Also lassen Sie uns so etwas wie Alter von sechs definieren. Vielleicht, lassen Sie uns sagen, es wird Nick Name und Klassenname wird Rand unten sein weil wir etwas Raum zwischen unserem Label und zwischen der tatsächlichen Eingabe hinzufügen wollen. Und auch können wir andere Requisiten übergeben, die Judy Input-Element umgeleitet werden. Also vielleicht können wir auch so etwas wie Name übergeben, was in unserem Fall Spitzname sein wird in unserem Fall . Was wird also mit unserem Spitznamen eingegeben werden, dass wir es hinzufügen können? Alles klar, Cool. Öffnen wir also unsere Komponente und beginnen wir mit dem Bau. Also zuerst haben wir Anfangswert. Ich habe eine der wichtigsten Requisiten gearbeitet. Dann werden wir Destruktor auf sichere ehrwürdige haben auch Etikett, das wird in diesem Alter sechs sein, und es gibt eine Chance, und dass dieses Label nicht übergeben werden. Also lassen Sie uns jetzt VT falten und dann auch einige andere Dinge, wie Platzhalter. Vielleicht so. Lassen Sie uns armen Platzhalter. Und standardmäßig, es wird gesagt, Wählen Sie etwas wie richtig, Ihr Wert. In Ordnung. Und dann schlage ich vor, eine Requisite zu gießen, die unsere leere Nachricht darstellt, wenn jemand versucht unsere Eingabe zu speichern und sie leer ist, so dass wir wie einen globalen Wert setzen können, der sagt, dass die Eingabe leer ist. Aber was, wenn wir es anpassen wollen? Also lassen Sie uns es auch als Requisite leere Nachricht übergeben. Und standardmäßig, wenn es nicht in Requisiten angegeben ist, werden wir sagen, dass es vor Gericht sein wird, sein leeres alles in Ordnung, und jede andere Requisite wird unsere Eingabe Requisiten sein. Alles klar, also für das Leben, was wir tun werden, also hier, direkt vor dem eigentlichen Importelement, werden wir das Label portieren. In Ordnung, dann werden wir Input geben, die von unserem Anzug kommt. Also für diese Eingabe, bei der allerersten Requisite, werden wir unsere Eingangskulturen übergeben, und wir werden ein paar von ihnen überschreiben. Also werden wir Platzhalter überschreiben, der dieser Platzhalter von Requisiten sein wird. Dann werden wir auch andere Dinge haben, die wir innerhalb dieser Komponente verwalten werden, wie seinen internen Zustand. Also, wenn wir es bearbeiten, werden wir alles von hier aus verwalten. Also lasst es uns im Voraus hier setzen. Also werden wir einen neuen Zustand definieren , der,sagen wir, sagen wir, nur Eingabe und dann in Port als Standard-Anfangswert gesetzt wird. Es wird unser Anfangswert sein, dass wir hier hinübergehen. Also lassen Sie uns Anfangswert setzen. Alles klar, dann haben wir einen eigenen Change Handler, den wir angeben müssen. Also lassen Sie uns auf Eingangsänderung gießen. Normalerweise erhält es, wie Sie sich erinnern, wie Sie sich erinnern,ein Ereignisobjekt. Aber auf unserem Anzug, es ist etwas anders als das erste Argument für auf Veränderung Ereignis. Also, wenn ich hier unverändert setze, wenn ich darauf schwebe, können Sie sehen, dass das erste Argument Wert ist. So ist es nur für uns gemacht, benutzerfreundlicher zu sein, so dass wir stattdessen Wert haben, sogar den Zielpunktwert referenzieren. Also hier werden wir auch zurückrufen setzen, weil wir keine Abhängigkeit haben und wir es im Voraus von hier aus optimieren wollen . Bubble-Aufruf setzt nur die Eingabe auf ihren Wert wie diesen. Und für diese Änderungen werden wir auf Importwechsel gießen, Ordnung. Und vergessen Sie auch nicht, den tatsächlichen Wert mit unserer Eingabe zu verknüpfen, und wir sind hier fast fertig. Jetzt wollen wir auch unsere Eingabe bearbeiten pflanzliche. Es wird also nur ein Anlagewert sein, der anzeigt, also werden wir seinen glaubwürdigen Zustand erstellen , der wünschenswert ist und standardmäßig auf false gesetzt wird. Ordnung, also wird diese Eingabe deaktiviert, wenn wir glaubwürdig sind, auf false gesetzt. Also, wann ist essbar so das wahre? Wir werden in der Lage sein, unsere Anfrage zu verwalten. Also lassen Sie uns tatsächliche Schaltfläche erstellen, die anzeigt, dass so lassen Sie uns schlechte Eingabegruppe wird nicht nur Schaltfläche setzen, weil wir die beiden Schaltflächen in unserem Import entweder schließen oder bearbeiten haben . Also werden wir Eingabegruppe setzen, damit es begrapscht aussieht, weißt du? Also Eingabegruppe in Taste und innerhalb dieses Knopfes, wir werden setzen, ich kann und das komme ich wird der nächste sein. Also, wenn unsere Eingabe wird essbar sein, ehrwürdige Anzeige schließen Taste. Ansonsten, wenn wir die tatsächliche Eingabe sehen und wir nicht beabsichtigen, sie zu bearbeiten, erhalten wir hinzugefügt Also dies ist nur ein Symbol mit, wie, wie Bleistifte, so dass wir sehen können, dass wir es hinzufügen können. Alles klar, also für diese auf Klick-Button, werden wir auf Bearbeiten klicken gießen und diesen unbearbeiteten Klick werden wir hier definieren. Also beim Bearbeiten Click wird es auch zitieren, verwenden Sie Rückruf im Voraus, weil wir keine Abhängigkeiten haben oder tatsächlich mit Ihnen. Aber es spielt keine Rolle, Corneau. Also werden wir setzen Set ist glaubwürdig, um den Wert von unserem aktuellen Zustand umzukehren. So werden wir diese Funktion aufrufen, die den Bowling-Wert umkehrt. Und dann wollen wir auch sicherstellen, dass wir, wenn wir auf Abbrechen klicken, den Ausgangszustand zurückkehren. Also wollen wir auch set-input aufrufen und nur für den Fall, setzen Sie es zurück auf den Anfangswert. So erscheint es jetzt als Abhängigkeit. Also lasst es uns hier setzen. Und sagen wir eigentlich mit und sehen, was hier vor sich geht. Alles klar, Cool. Also, jetzt haben wir es so, und es sieht fast cool aus, aber es scheint, als wäre ich ein etwas. Oh, ja, eigentlich, weil wir Eingabegruppe verwenden, müssen wir es um die Eingabegruppe wickeln. Das ist mein Schlimmes. So wichtige Gruppe. Und ich werde das so am Ende setzen. Sehen wir uns mal an. Alles klar, jetzt sieht es gut aus. Ich kann es jetzt nicht hinzufügen Eingabe, weil ist essbar so zu fallen. Wenn ich jetzt auf diesen Button klicke, kann ich ihn hinzufügen. Dieser Knopf. Und wie Sie sehen können, wenn ich auf diese Schaltfläche klicke, wird die Funktion zum Bearbeiten von Klicks ausgelöst. Wenn wir also diesen eingestellten Eingabeanfangswert nicht haben, wenn ich auf diese Schaltfläche klicke, wird er nicht wieder auf den Standardwert gesetzt. Wir wollen also sicherstellen, dass es immer anfänglich ist, wenn wir es abbrechen. In Ordnung. Was müssen wir sonst noch tun? Wir müssen eine andere Flasche definieren, die angezeigt wird, wenn wir tatsächlich auf Bearbeiten klicken. So sind wir in der Lage, hier zu genießen. Was? Wir werden eingießen. Wir werden eingießen. Wenn unser Import glaubwürdig ist, dann werden wir eine andere Eingabegruppe unten rendern. Lass es uns einfach kopieren und hier rüber bringen. Also für auf Klick, werden wir auf sicheren Klick setzen. Es wird nicht dasselbe auf Save das sein. Wir gehen als Requisite. Wir werden einen anderen auf sicheren Klick hier definieren. Für jetzt. Lass es so sein. Also, für diesen Knopf, was wir zu seiner passiven feuerbaren Veränderung gehen. Ich kann, ich kann, wird ein statischer Aiken sein. Und das kann ich, wenn ich mich erinnere, ist es Scheck. Werfen wir einen Blick. Alles klar, los. Ja, das ist es. Überprüfen Sie. Es scheint, als hätten wir das Markup. Lassen Sie uns tatsächlich die Funktionalität für auf sicheren Klick definieren. Also, was werden wir hier tun? Zuerst werden wir eine sehr primitive Validierung durchführen. Zuerst erhalten wir den getrimmten Wert, um unnötige Leerzeichen um unseren Text zu vermeiden. Also lassen Sie uns getrimmten Wert setzen und es wird Eingang Punkttrimmen sein. Okay, dann werden wir überprüfen, ob unser getrimmter Wert nur ein leeres Feld sein wird. Dann werden wir alarmieren wurde befriedet. Leere Nachricht als Requisite. Wir können diese leere Nachricht hier drüben setzen und uns eine Auszeit von vier Sekunden machen. In Ordnung. Dann am Ende werden wir setzen Set ist glaubwürdig fällt, denn wenn wir auf sicher klicken, wollen wir es nicht glaubwürdig machen, wie es vorher war. Und jetzt hier werden wir noch gegen einen nachsehen. Denken Sie, es wird sein, wenn getrimmt wird nicht unser Anfangswert sein. Also werden wir überprüfen, ob wir etwas wirklich bearbeiten und unser Wert anders ist Onley, dann rufen wir unseren eigenen sicheren Rückruf zurück, den wir hier im Dashboard angeben. So wird es in einer Spüle-Funktion sein. Also lassen Sie es uns beruhigen, denn es wird konfrontiert sein, es wird ein Versprechen sein, also müssen wir es abwarten. Also lassen Sie uns eine Spüle gießen und uns ein Gewicht auf den Safe gießen, den wir hier passieren. Und wie Sie sich erinnern, erhält dieser Rückruf neue Daten als Argument. Also hier müssen wir unsere tatsächliche Eingabe übergeben. Also lassen Sie uns schlecht nicht eingeben oder vielleicht auf Wert getrimmt, weil wir es nicht mit den nur unnötigen Leerzeichen um ihn herum setzen wollen. Alles klar, jetzt schauen wir es uns an. Und hier, lass uns ausverkauft kommen. Sehen Sie, neue Daten, um zu sehen, ob es tatsächlich funktioniert hat. Jetzt scheint es ziemlich fertig zu sein. Vielleicht werden wir es in Zukunft ein wenig an unsere Anforderungen anpassen. Aber jetzt sieht es gut aus. Öffnen wir unser Dashboard. Lasst uns aufmachen, Konsul, und schauen wir uns mal an. Also jetzt, wenn ich es editiere, wenn ich absage, ist alles gut. Wenn ich also wieder auf Safe klicke, ändert sich nichts. Und wir haben diesen Anruf nicht auf Safe gefeuert. Also, wenn ich es ändere und wenn ich es jetzt speichere, habe ich den neuen Wert, der konsul von diesem auf sicheren Handler gesperrt wird. Also hat es tatsächlich funktioniert. Und ich schätze, wir sind hier im nächsten Video fertig. Wir werden tatsächlich einige Funktionen auf diese Komponente anwenden, oder vielleicht um diese Komponente. Also aktualisieren wir unseren Riel-Spitznamen. Aber jetzt lassen Sie uns dieses Video beenden und unsere Änderungen übernehmen. Also werde ich erstellt wiederverwendbare, glaubwürdige Eingabe setzen . Alles klar, Perfect. Wir sehen uns im nächsten. 109. Dashboard - Nickname aktualisieren: Hey, willkommen in diesem Video. Wir werden weiter bauen unser Dashboard essbare aktualisieren unseren echten Spitznamen in riel Time Datenbank. Lasst uns gehen. Im letzten Video haben wir glaubwürdige Input erstellt. Und wir definieren dies auf sichere Funktion, die wir weitergegeben haben, um Kräutereingabe zu bearbeiten. Diese Callback-Funktion wird also unsere endgültige Eingabe erhalten, wenn wir auf Speichern klicken Also lassen Sie uns jetzt diese Daten verwenden und unsere Datenbank aktualisieren. . Also, wie zuvor, werden wir unsere Datenbank, Objekt verwenden, um auf Datenbank zuzugreifen. Dann müssen wir Befriedung Referenz auf die Datenbank wählen. Also werden wir Profile Schrägstrich setzen. Wir werden hier drin eine Schnur ihrer Polizei benutzen. Wir werden Profil setzen. Nicht Benutzer, ich d. Jetzt müssen wir nur Spitzname aktualisieren. Das wollen wir nicht erschaffen haben. Also müssen wir genauer sein, wenn es darum geht, etwas innerhalb der Echtzeitdatenbank zu referenzieren . Also müssen wir hier drüben auf diesen Namen verweisen. Was wir tun können, können wir es tatsächlich auf zwei Arten referenzieren. Wir können Ihren Schrägstrich hier drüben setzen und den Namen setzen, oder ich bevorzuge einen anderen Weg, nur um ihn benutzerfreundlicher zu machen . Ich würde das Kind hier und hier rüber bringen. Ich muss auch den Pfad angeben, aber dieser Pfad wird relativ zu dem Pfad sein, den wir in der ersten Referenz angegeben haben. Also lasst uns diesen Namen schieben. Also werden wir ein Kind von diesem Pfad innerhalb der Datenbank angeben, Ordnung. Oder tatsächlich, lassen Sie es in einem wertvollen setzen wir es, sagen wir, Benutzer Nick Name, ref. Dann werden wir einen Try Catch-Block definieren, weil wir mit asynchronen Daten und Versprechungen arbeiten werden. Also hier werden wir gießen, warten, und dann rufen wir einfach den Benutzernamen Spitzname ralf dot sat, Daten in die Datenbank schreiben wird. Und hier werden wir neue Daten setzen, die wir als Argument erhalten. Danach werden wir nicht, wenn ich Benutzer mit Erfolgsnachricht und wir sagen Spitzname Bean aktualisiert hat und wieder für Sekunden und für jede andere werden wir auf ihre Nachricht setzen, wo wir unsere Nachricht als Text und auch vier Sekunden setzen. Alles klar, scheint nett zu sein. Schauen wir es uns an. Lassen Sie uns zurück zur App navigieren, wenn ich auf Bearbeiten klicke, lassen Sie mich meinen Spitznamen ändern, um Be einzugeben als ich auf sicher klicke und Spitzname wurde aktualisiert Und wenn wir zurück zur späteren Basis gehen. Sie können sehen, dass die tatsächlichen Daten geändert werden. Versuchen wir es noch einmal. Lassen Sie uns sagen, dass ich weiß, und ich klicke sicher. Nickname wurde aktualisiert. Die Datenbank wird aktualisiert. Alles schien schön weg. Wenn Sie noch eine Frage haben. Warum genau das? Hey, Andy wird aktualisiert, wenn wir die tatsächlichen Daten in der Datenbank aktualisieren. Okay, noch einmal für eine Erklärung. In unserem Provider-Kontext haben wir Abonnements, Echtzeit-Listener für unsere Daten verwendet . Also für eine Referenz verwenden, die unser Datenbankpfad unter Profilen ist, Benutzer I d. Wir setzen Echtzeit-Listener diese Rückruf zurück. Also dieses kalte Back feuerte jedes Mal, wenn sich etwas unter diesem Pfad innerhalb der Datenbank ändert. Wenn wir also sagen, dass Namensänderungen unter Benutzer I d als dieser Rückruf ausgelöst wird und wir werden Profilstatus mit diesem Datenobjekt aktualisieren, das zu dem Zeitpunkt neu sein wird, wenn diese Colback ausgelöst wird. Das gleiche gilt für erstellt bei oder für jede andere gefüllt. Wenn wir also so etwas wie das Alter hier hatten, und wenn sich das Alter verändert hat, dann werden diese Colback gefeuert und so eins in Ordnung, ich schätze, das ist in Ordnung. Und du verstehst es. Jetzt lassen Sie uns unsere Änderungen übernehmen und das Video beenden. Also lasst uns gut bei allem kommen. Dann lassen Sie uns Pete Commit setzen, Nehmen wir an, aktualisierter Spitzname in der Datenbank. In Ordnung. Sieht gut aus. Wir sehen uns in der nächsten. 110. Dashboard - Link von Providern (Teil 4): Hey, in diesem Video wir weiter bauen die Flughafenkomponente und wir werden Benutzerkonto mit mehreren Signaturanbietern oder mehreren Sinan-Methoden verknüpfen . , Zum Beispiel, wenn ich mich verbinde oder wenn ich mit Facebook gucke und dann, wenn ich hinausschaue und mit Google eingucke, lande ich auf demselben Konto. Ich werde nicht zwei verschiedene Konten haben. In Ordnung, also lasst uns das machen. Zuerst navigieren wir zurück zu unserem Code. Und hier unter Dashboard, lassen Sie uns Ihre Datei erstellen, die wir Provider Block für jetzt nennen. Lassen Sie es eine leere Komponente sein und lassen Sie uns zu unserem Dashboard innerhalb Index GS direkt nach Hey Profile Name Provider Block bearbeiten . Perfekt. Nun, um fortzufahren, müssen wir wissen, wie wir tatsächlich auf unsere aktuellen Benutzerdaten zugreifen können, wo Benutzer Objektdaten spezifischer zu sein. Anstatt unseren Verwendungsprofil-Hook zu verwenden, um die Daten zu erhalten, können wir tatsächlich off-Objekt verwenden, und dann können wir auf den aktuellen Benutzer zugreifen. Also lasst uns es schnecken und sehen, was ihr bekommt? Also, wenn ich jetzt zu diesem Board gehe, wenn ich jetzt in Consul schaue, habe ich das Benutzerobjekt aus, das derzeit im Benutzer angemeldet ist, also wird es von der Feuerbasis verwaltet. Hier beschränken wir verschiedene Zugriffstoken, Aktualisierungstoken, Anzeigenamen, E-Mail und andere Daten. Aber wir sind gerade an Anbieterdaten interessiert, die wir hier haben. Also ist es im Grunde ein Array von Providern oder Array von Simon-Methoden, die wir gerade verwenden . Also, wie Sie sehen können, gerade jetzt haben wir gerade jetztnur ein Element, das Google dot com ist. Daher werden wir diese Informationen verwenden, um anzuzeigen, dass wir derzeit nicht mit diesem spezifischen Anbieter verbunden sind. Und die Sache ist, dass, wenn Sie sich erinnern, wir Echtzeit-Zuhörer für unsere Profildaten setzen. Also, wenn wir etwas aktualisieren, wird es an allen Orten mit den Anbietern aktualisiert. Es funktioniert nicht in Echtzeit, daher müssen wir es mit dem Reaktionszustand verwalten. Also in Ordnung, gehen wir zurück zum Provider-Block. Und hier werden wir einen neuen Zustand definieren , den wir nennen, ist verbunden, und es wird nicht ein Bowling-Wert sein. Es wird ein Objekt sein, das anzeigt, ob wir mit Facebook oder Google verbunden sind . Also werden wir ein Objekt mit zwei Tasten haben, google dot com und facebook dot com, das ist Provider i d kann gefunden werden, dass in diesem Array, so wie Sie für Google sehen können, ist es Google dot com. In Ordnung, also für Google Dot Com, wir überprüfen, ob wir verbunden sind. Also greifen wir auf uns aktuelle Benutzerpunkt-Anbieterdaten zu. Also ist es ein Array, und auf dem Regen können wir einige anwenden, um zu überprüfen, ob ein Element tatsächlich die Bedingung rechtfertigt. Also werden wir hier unsere Daten haben, und wir werden überprüfen, ob einige von unserem wo Array-Elemente Provider I D oder Google Dot com haben. Wenn Datenanbieter I d gleich Google dot com und das gleiche werden wir für Facebook tun. Also lasst es uns kopieren. Und ersetzen wir Google dot com mit facebook dot com. Alles klar, gut. Auf diese Weise haben wir jetzt verfügbar ist verbunden. Das zeigt an, was wir mit Google oder Facebook verbunden sind. Nun wollen wir unseren Marker definieren. Also in diesem Def, werden wir unsere Tasten oder Angriffe gießen, die darauf hinweisen. Und hier werden wir eine Last von bedingtem Rendering haben. Aber jetzt hören Sie zu. Trotz, ästhetisches Markup. Also zuerst wird Element angepackt werden. So wird das Stapelelement in der Nähe sein, Kräuter, und es wird Farbe grün haben, weil es vier Google innen sein wird, werden wir Aiken haben. Und das kann ich haben, kann ich von Google und es wird sagen, verbunden. In Ordnung. Und jetzt haben wir auch heute Morgen. Lassen Sie es uns gleich hier oben stellen. Wir werden uns für Facebook bewerben. Also lasst es uns kopieren. Und lassen Sie uns Farbe durch das Blau ersetzen und ich kann mit Facebook. In Ordnung. Scheint gut. Jetzt schauen wir es uns an. Wenn wir jetzt zum Dashboard gehen, sind wir verbunden. Dies wird also angezeigt, wenn wir tatsächlich mit unseren Anbietern verbunden sind. In Ordnung, dann werden wir andere Dinge definieren, die unsere Knöpfe sind, um sich mit diesen oder dem Provider zu verbinden . Also lasst uns ein bisschen ablegen, in diesen Block verschmelzen, und dann werden wir unsere Böden definieren. So wird der erste Button für Google sein. Es wird also ein Blockelement sein. Es wird Farbe grün und innen wieder haben. Wir werden sehen, und ich komme und ich kann sein, Sagen wir, auch Google und wir werden X mit Google verknüpft nennen. Das gleiche wird für Facebook sein. Lassen Sie es uns kopieren. Und ersetzen wir Farbe mit dem blauen Lynn zu Facebook. Und ich kann, wird Facebook sein. In Ordnung, schauen wir es uns an. In Ordnung. Sieht gut aus. Also werden wir diese unten Tasten haben, um tatsächlich mit dem Anbieter zu verbinden. Und diese zwei an der sagen Leute haben, wenn wir verbunden sind. In Ordnung. Lassen Sie uns zuerst unser bedingtes Rendering für den Fall gießen, wenn wir bereits verbunden sind. Also für diese Tags, werden wir setzen, wenn verbunden ist, dann, weil es ein Objekt ist, können wir auf seine Eigenschaften zugreifen. Also, wenn ich mit Google Dot com auf Lee verbunden bin, dann werde ich dieses Tag-Element rendern und das gleiche tatsächlich, werden wir für Facebook tun. Also, jetzt werden wir eine auf Lee angezeigt, wenn wir verbunden sind. In Ordnung. Sieht gut aus. Und für diese Schaltflächen werden wir die nächste angewendet. Also, wenn wir nicht mit Google verbunden sind, die kommen, dann werden wir diese Schaltfläche anzeigen und das gleiche wird vier Facebook tun. Also, wenn wir nicht mit Ihrem Facebook verbunden sind, dann werden wir diese Art von Schaltfläche anzeigen. In Ordnung, schauen wir es uns an. Wenn ich mein Dashboard öffne, bin ich mit Google verbunden und bin nicht mit Facebook verbunden. Alles klar, jetzt ist es eigentlich, einige Funktionen zu tun, um alles mit einem Zustand anzuwenden. In Ordnung, also zuerst müssen wir definieren, waren Handler. So werden wir insgesamt für Handler haben, um Handler zu UNL Inc von Google und Facebook, und zwei Handler auf einen Link zu Facebook und Google. Also lassen Sie uns definieren sie zuerst wird auf einem Link auf Facebook Link wie folgt sein. Dann haben wir Google entlinkt. Dann haben wir Facebook und LinkedIn Google verlinkt und Google so verlinkt. Alles klar, Erstens, lasst uns vielleicht unverknüpfte Funktionalität machen, also wird es irgendwie gleich sein, und es ist sehr einfach zu tun. Also werden wir eine andere erstellen, wie, eine gemeinsame Funktion, die wir innerhalb auf Link Facebook aufrufen und Google erlauben, dass wir anrufen werden, wissen Sie, nur auf Link, und dann wir werden hier Provider I d Provider erhalten. Das gefällt mir. Ordnung, also nennen wir das unlink von unverknüpftem Facebook so, und dann setzen wir Facebook Dot com und dasselbe, was wir für Gogol tun werden. Wir werden auf Link Google Dot com so setzen. Alles klar, Sie haben die Verknüpfung des tatsächlichen Anbieters aufgehoben. Wir werden das nächste tun, was wir zuerst versuchen, fangen Block, und wir werden zuerst fragen, ob nur eine Anmeldemethode für den Benutzer übrig bleibt. So ist es möglich, dass wir von Google losgelinkt, und dann haben wir keine Anmeldeanbieter überhaupt auf diese Weise, Konto wird aufgegeben und es wird keine Anmeldemethode haben, so bedeutet es, dass es irgendwie sein wird. Deshalb wollen wir das vermeiden. Und wir werden überprüfen, ob off dot aktuellen Benutzer dot Provider Daten Punktlänge gleich eins ist . Und wir wollten und verknüpfen. So haben wir nur eine Anmeldemethode und wir klicken auf unlink. Wir werden eine Warnung erhalten. Wir werden einen neuen Editor werfen, und wir werden sagen, dass Sie nicht trennen können für, ähm Provider I d , dass wir als Argument hier erhalten. Und jetzt werden wir diese Angelegenheit fangen, die wir hier rüber werfen, und wir werden es aufmerksam machen und Kunstredakteur, wir werden eine bessere Botschaft für vier Sekunden sagen. Alles klar, wenn hier alles cool ist und wenn wir Anbietern sagen, die verbunden sind und wir von einem von ihnen trennen wollen , ist es sicher. Also werden wir dot aktuellen Benutzer dot unlink diese Methode abrufen, wenn ich sie aufrufe, können Sie auf Links einen Anbieter vom Benutzerkonto sehen und ich muss Provider I D übergeben , der Provider I d von unseren Argumenten sein wird. Es ist also ein Versprechen, was wir tun werden, wir werden erwartet. Und weil es ein Think wartet Index, müssen wir einen Sing vor die Funktion setzen. Also, nachdem wir erwartet haben, müssen wir unser Set aktualisieren verbunden ist. Wir müssen unseren lokalen Staat aktualisieren. Also, was können wir tun? Wir können tatsächlich eine andere Funktion erstellen, nur um unseren Zustand zu aktualisieren, so dass wir es so etwas nennen können , wie dieses Update verbunden ist, und innerhalb können wir Provider I d übergeben und dann nur bewerten, ob es wahr ist oder fällt. Also hier, melden Sie Provider i d. Und wenn wir die Verbindung aufheben, wollen wir es auf Kraft setzen. Also lassen Sie uns dieses Update erstellen ist verbunden, wir werden Provider I d erhalten . Und dann werden wir tatsächlich erhalten, den Wert, so etwas. Also innerhalb dieser Funktion werden wir nennen Set ist hier verbunden, wir werden vorherigen Wert innerhalb des Rückrufs erhalten. Und hier müssen wir zurückkehren und Sie Wert, weil es ein Objekt ist. Wir wollen sicherstellen, dass wir die Struktur erhalten. Also werden wir zurückkehren. Okay, lassen Sie es vielleicht explizit von dieser Callback-Woche im Gegenzug ausdrücken und Alba Jet hier, wir werden den vorherigen Zustand so zusammenführen und dann den tatsächlichen Provider aktualisieren i d Wir müssen diese Art von Klammern öffnen. Dann müssen wir Anbieter I d als Schlüssel zitieren und dann enthüllt den Wert zu beruhigen. Alles klar, auf diese Weise wird es das Objekt mit dem angegebenen von i d und Wert aktualisieren. In Ordnung. Gut. Sieht gut aus. Lassen Sie uns vielleicht auch, und eine andere Warnung hier drüben mit Warnung, vielleicht nur Info, und wir werden sagen, getrennt vom Anbieter getrennt von mir d wie dies, es sei denn, setzen Sie vier Sekunden hier über . In Ordnung. Nun, lassen Sie uns diese Handler tatsächlich mit unseren Schaltflächen verknüpfen, also müssen wir Facebook aufheben. Wir müssen es hier zum Sackelement bringen. Also hier können wir das auf nahem Ereignis haben. Also für dieses unclos Ereignis, Kautable geben Sie auf Link Google, tatsächlich, und das gleiche für Facebook. Also hier werden wir uns anziehen und wir werden dieses Mal auf Link Facebook setzen. In Ordnung. Jetzt verfügt es über ausreichende Funktionalität, um es zu testen. Also lasst uns das Dashboard öffnen. Lassen Sie uns auf dieses schließende Element klicken. Also, wenn wir darauf klicken, können Sie nicht von Google dot com trennen, weil wir nur Google-Signing-Methode nur eine davon haben . Also, wenn wir davon trennen, werden wir unser Konto machen, dass alles in Ordnung, jetzt ist es tatsächlich und unsere Link-Funktionalität . Also wieder, es wird fast das gleiche sein. Also werden wir eine gemeinsame Funktion als UNL Inc erstellen. Also lassen Sie es uns sagen, vielleicht hier drüben und wir werden es nennen. Lasst uns verknüpfen. Alles klar, also wird es keinen Provider i d erhalten, aber das Provider-Objekt dasselbe, wie wir es im Inneren verwendet haben. Anmeldeseite. Lassen Sie uns diesen neuen Firebase Auth Firebase Provider sehen. In Ordnung, also habe ich es kopiert. Also lassen Sie mich es kommentieren. Und hier werden wir diesen Link anrufen und dann unterschrieben. Wir müssen Provider-Objekt übergeben, das wir als Argument erhalten. Also für Facebook, werden wir neue Firebase von Facebook aus dem Provider anrufen. Lassen Sie uns zuerst Feuerbasis von Feuerbasis importieren. In Ordnung, schau, der Trainer und das Gleiche wird für Link Google tun. Also lasst es uns kopieren. Und hier rufen wir Google Auth Anbieter an. Alles klar, sieht gut aus. Jetzt lassen Sie uns diese Handler im Voraus mit unseren Schaltflächen verknüpfen. Also auf klicken, wir werden Google verlinken und für diesen Button klicken Sie auf einen Link Facebook. In Ordnung. Sieht gut aus. Also, was wird jetzt unsere Strategie sein? Also ist es eigentlich sehr, sehr einfach mit Feuerbasis wieder, wir müssen unser Auth Objekt verwenden. Und hier werden wir unseren aktuellen Benutzer anrufen und dann mit Pop-Up-Link mit Pop-Up verknüpfen. Wir müssen nur das Provider-Objekt angeben, das wir als Argument erhalten, das eines davon sein wird , Ordnung. Also, wieder, es ist ein Versprechen, das wir erwarten müssen. Und nachdem es erfolgreich aktualisiert wurde, was auf Sie Rennfunktion umgewandelt wurde, nachdem es erfolgreich aktualisiert wurde, werden wir Benutzer mit Alarm in vier benachrichtigen. Nehmen wir an, verbunden oder vielleicht zwei verbunden. Provider. Verwenden wir das Rincon-Präparat. Und weil es am Provider-Objekt ist. Dieses Mal hat dieses Provider-Objekt Provider I d als Schlüssel. Und wieder werden wir vier Sekunden im Falle eines anderen angeben. Wir werden auf ihre Nachricht aufmerksam machen, und wir werden unsere Nachricht hier so setzen. Und am Ende des Tages müssen wir auch unseren lokalen Staat aktualisieren. Also werden wir dasselbe nennen wie bevor Update verbunden ist. Und dieses Mal ziehen wir Provider Dot Provider I D. und dann werden wir wahr sein, weil wir unser Konto verknüpfen. In Ordnung, jetzt scheint es in Ordnung. Schauen wir es uns an. Es scheint, als hätten wir alle Funktionen. Lassen Sie mich nochmals nachsehen. Okay, sehen gut aus. Gehen wir nun zum Dashboard. Wenn ich auf Link zu Facebook klicke, mal sehen, was jetzt passieren wird. Ich werde gebeten, in meine Facebook-Bust zu schauen, weil ich mich bereits angemeldet habe. Jetzt habe ich auf Facebook verlinkt. Wenn ich zur Authentifizierung gehe und wenn ich eine frische hatte, kann ich sehen, dass ich Provider anmelden muss, die mit diesem Benutzer verbunden sind. Also hat es tatsächlich funktioniert. Nun, wenn ich Lassen Sie uns einen Klick auf Trennen von Facebook Jetzt, Ich habe von Facebook dot com getrennt. Wenn ich auf Google klicke, können Sie die Verbindung zu Google nicht trennen, da es das einzige ist, das noch übrig ist. Und wenn ich wieder aktualisiere, können Sie sehen, wie Facebook verschwinden. Also, eigentlich funktioniert alles. In Ordnung, also war es eine Menge, eigentlich, eigentlich, ich schätze, das ist der gute Zeitpunkt, dieses Video zu beenden. Also werden wir alles in den Zustand der Bühne hinzufügen, und dann werden wir Commit verknüpften Facebook und Google zu einem Konto erstellten Anbieter Block Who bekommen ? Alles klar, wir sehen uns im nächsten. 111. Dashboard - Erstellen (Teil 5): Hey, in diesem Video werden wir weiterhin Dashboard bauen, und wir werden unser Management mit Benutzerprofil-Avataren beginnen. Also in diesem Video werden wir eine Schaltfläche erstellen und wir werden in der Lage sein, ein Bild von unserem PC auszuwählen , das wir dann auf Feuerbasis hochladen und als unser Avatar-Bild verwenden werden. Lass uns gehen. zunächst Lassen Sie unszunächsteine neue Datei auf ihrem Dashboard erstellen. Der Ärgername eines Autos applaudiert Bt rein. Dann lassen Sie uns eine leere Komponente erstellen. Für jetzt, lassen Sie uns Hallo in als in Index GS, die unser Dashboard direkt nach essbarer Eingabe ist. Lassen Sie uns referenzieren Avatar-Upload Bt in so. Okay, gut. Jetzt fangen wir an, unsere Komponente zu bauen. Unser oberes Element wird also eine Entwicklung für den Klassennamen sein. Wir werden es ein wenig abseits der Marge am Hacken geben, das wird leer drei sein. Und dann wollen wir alles zentriert halten. Deshalb haben wir das Steuerzentrum gestellt. In Ordnung, dann müssen wir den Dateityp für die Eingabe angeben, aber wir wollen den nativen nicht verwenden, weil es nicht der beste Weg aussieht. Also für jetzt, lassen Sie es uns einfach als Text behalten und vielleicht, wenn Sie wollen, können Sie es ändern. Um das zu tun. Wir müssen ein Dif hier drüben setzen. Dann lassen Sie uns Label-Insight angeben. Und in diesem Label, werden wir wählen neuen Avatar und auch neben diesem Text in das Etikett. Wir werden die Datei ablegen, aber wir geben ihm keine Anzeige. Also klicken wir tatsächlich auf diesen Text. jedoch Gleichzeitig klicken wirjedoch auf diese Eingabe. Also lassen Sie uns Port aus der Typdatei so einfüllen. Und lassen Sie uns auch den Klassennamen ausgeben, keine anzeigen. Und wir haben diese Warnung auf dem Etikett, die besagt, dass sie mit der Steuerung verknüpft werden muss. Also für diese Eingabe, lassen Sie uns eine Idee so etwas wie Al Atar Upload definieren. Und lassen Sie uns diese Idee zu html vier für dis Label geben. HTM von vier wird also Avatar sein. Applaus. In Ordnung. Auch für dieses Label werden wir den Klassennamen aus diesem Spielblock geben. Außerdem wird es gröberer Zeiger sein, und es wird ein wenig gepolstert wie folgt sein. In Ordnung, schauen wir es uns an. Jetzt. Wenn ich zum Dashboard gehe, sieht es schön aus. Jetzt haben wir diesen Knopf. Wenn wir darauf klicken, können wir Dateien auswählen. Machen wir es so, dass wir hier nur Bilder auswählen können. Also für diese Eingabe werden wir eine andere Requisite setzen, die ist, außer und es wird eine Zeichenfolge von akzeptierten Dateitypen sein. Aber lassen Sie uns diese Dateitypen außerhalb der Komponente angeben. In Zukunft ist es einfacher, innerhalb dieser Komponente zu navigieren. Lassen Sie uns Dateiimporttypen binden, und es wird als Drink Off Dateitypen durch Komma referenziert werden. Also zuerst akzeptieren wir PNG-Dateien als J PAC-Dateien und J packen diese Erweiterung ab. Ordnung, also für diese außer Requisite, wir Datei-Import-Typen übergeben und wir sind bereit zu gehen Jetzt lasst es uns überprüfen. Wenn wir hier darauf klicken, können wir P und G und J zurück Dateien sehen. In Ordnung. Sieht gut aus. Was wird unser nächster Schritt sein? Wenn wir also ein Bild auswählen, möchten wir, dass ein neues Modell geöffnet wird, und in diesem Sterblichen sehen wir die Vorschau. Also müssen wir den Motor von Indo definieren. Also hier, neben dem Etikett werden wir Modellelement aus unserem Anzug verwenden. Und in diesem Modell werden wir Modell Dot Heather als daneben setzen. Wir werden Körper und auch Fußzeile wie diese haben. Also für das Modell, müssen wir zeigen Eigenschaft angeben. Es ist ein Aufzählungszeichen, das angibt, ob es offen ist oder nicht als auf Höhe Handler, wenn dieses Modell geschlossen wird. Also müssen wir unseren eigenen Brauch verwenden. Hoffe, dass wir früher erstellt verwenden sterblichen Zustand, um tatsächlich diese Werte zu erhalten. Also lasst es uns importieren. Und lasst uns D Struktur ist offen, offen und geschlossen. Also für auf Höhe Ereignis, werden wir Close Handler aufrufen und für Show werden wir angeben, ist offen. Also in Moto Heather, wir Port-Modell Punkt-Titel Also dieser Titel wird ein gerechtes und applaudieren Vielleicht so, applaudieren neuen Avatar und lassen Sie uns diesen Titel unten hier entfernen. Dann in den Körper. Wir werden etwas anderes spezifizieren. Und in der Fußzeile werden wir einen Grund setzen, der unseren Avatar hochlädt. Also lassen Sie uns Applaud New Avatar eingeben und für diese Schaltflächen wird Aussehen angeben. Sagen wir, Geist, und auch wir werden es mit off 100 geben, indem wir angeben, dass es ein Blockelement sein . , jetzt, Also, jetzt, wie Sie sehen können, haben wir keinen Auslöser, um unser Moto zu öffnen. Wir müssen irgendwie bestimmen, wenn wir die Datei auswählen. Also dafür werden wir auf Änderungsereignis beim Import off-Typ-Datei verwenden. Lassen Sie uns also die eigene Veränderung befriedigen. Und für diese eine Änderung werden wir eine Funktion erstellen, die wir bei Dateieingabeänderung benennen werden. Alles klar, jetzt lassen Sie uns hier oben und diese Funktion erstellen, weil es ein Handler für ein Ereignis ist. Diese Funktion empfängt ein Ereignisobjekt. Ordnung, also wird dieses Ereignisobjekt Ziel und unter Ziel haben. Wir werden in der Lage sein, auf tatsächliche Dateien zuzugreifen, die wir auswählen, und es kommt immer als Array von Dateien. Lassen Sie uns also aktuelle Dateien unter sogar Zieldateien setzen. Da es also immer ein Array sein wird, müssen wir überprüfen, ob wir nur eine Datei auswählen. Also lasst uns nachsehen. Wenn aktuelle Dateien, die Länge gleich eins ist, dann werden wir unsere Logik anwenden. Also lasst uns zuerst unser erstes Element aus dem Array greifen. Also lasst uns Datei setzen, und wir werden aktuelle Dateien setzen und auf das erste Element verweisen. Dann müssen wir tatsächlich überprüfen, ob die Datei, die wir auswählen, die gültige Datei ist, weil es egal ist, was wir angeben. Hier drüben. Ich kann für jede Datei suchen und ändern Sie es auf alle Dateien, und dann kann ich kaufen Mai Steak Upload, Nehmen wir an, nebenan. Also wollen wir überprüfen, ob diese Datei tatsächlich ein Bild ist. Also hier oben, lassen Sie uns Mitteltypen angeben, die für uns zugänglich sind. Dazu lassen Sie uns alle verfügbaren angeben, Nehmen wir an, akzeptierte Dateitypen. Also hier wollten wir ein Array von Strings angeben. Also zuerst wird unser Strahl Typ Bild Schrägstrich p und G sein. Dann werden wir Bild Schrägstrich j Pack haben. Also, wenn ich mich nicht irre, ist es das Richtige. Und auch werden wir Bild Schrägstrich p j pack haben. Alles klar, gut. Jetzt müssen wir eine Hilfsfunktion erstellen, die überprüft, ob diese Datei Array aus Mitteltypen erfüllt . Also, wenn unser Dateityp einer von ihnen ist, so werden wir eine neue Hilfsfunktion erstellen, die Name ist gültige Datei und es wird Datei als Argument erhalten, und es wird Dateityp gegen diese Werte zu überprüfen. Also gehen wir einfach zu überprüfen akzeptierte Dateitypen enthält Datei Tochter Typ. Alles klar, so dass es einen booleschen Wert zurückgibt. In Ordnung, also jetzt hier, drinnen. Ah, waren Handler. Wir können fragen, ob wir fragen, ob es gültig ist, unsere Akte einreichen, dann tun wir etwas. Andernfalls zeigen wir dem Benutzer einen Fehler an. Oh, Junge, du hast die falsche Aktenzeit ausgewählt. Also lasst uns wachsam machen. Dann werden wir Warnung setzen, nicht einen Fehler, und wir werden angeben, vielleicht falschen Dateityp, und dann lassen Sie uns schlechte Datei Tochter so eingeben, und lassen Sie uns vier Sekunden angeben. Also, was werden wir tun, wenn wir die gültige Akte haben? Zunächst einmal werden wir unser bewegliches Fenster öffnen. Aber kurz bevor wir es öffnen, müssen wir irgendwie unser Image aufstellen, das wir applaudieren. Dafür werden wir einen neuen Zustand schaffen. Lassen Sie uns also einen neuen Zustand mit Verwendungsstatus erstellen , den wir benennen werden. Nehmen wir an, nur Bild und Bild standardmäßig einstellen. Es wird auf jetzt gesetzt. Aber wenn wir Bild ausgewählt entwickelt haben. Wir werden „Setimage“ nennen, und wir werden die Datei als unseren Staat so machen. Alles klar, jetzt schauen wir es uns an. Wenn ich also zum Dashboard gehe, wenn ich einen neuen Avatar auswähle, wenn ich ein Bild hochlade, Ordnung, Motile öffnet sich. Jetzt machen wir das Gleiche. Aber lassen Sie uns Jason-Datei wählen. Wenn ich auf Öffnen klicke, habe ich eine falsche Dateityp-Anwendung, Jason. Also hat es tatsächlich funktioniert. In Ordnung? Was wird unser nächster Schritt sein? Unser nächster Schritt besteht darin, die Vorschau anzuzeigen und das Bild anzupassen. Also, wie wir in der Lage sind, das zu tun, werden wir react-Avatar-Editor-Paket verwenden, das von einem PM kommt Ich mag dieses Mini-Paket wirklich . Es gibt uns die Möglichkeit, das hochgeladene Bild anzupassen. Wir werden nicht in zu viele Details eintauchen, aber wir werden nur in der Lage sein, unser Bild so zu skalieren, dass es notwendig ist. Also zuerst, lasst es uns installieren. Also werde ich mein Terminal öffnen und von hier aus, was ich noch ein in Ordnung habe . Ich werde npm installieren reagieren Avatar, Editor und lassen Sie uns warten, bis es tatsächlich installiert ist oder richtig ist. Scheint, als wäre unser Paket installiert worden. Lassen Sie uns den AP und P. M Run erneut ausführen, starten und mal sehen, wie wir dieses Paket tatsächlich verwenden können. Lassen Sie mich also den Importbefehl kopieren. Lassen Sie mich es hier ganz oben stellen. Und wie Sie sehen können, muss ich diese Komponente so verwenden. Also lasst uns das kopieren. Lassen Sie uns diese Komponente als in unserem Code für Modellkörper kopieren. Wir werden diese Komponente spezifizieren, aber zuerst werden wir überprüfen, ob wir unser Bild innerhalb des Staates definiert haben. Also lasst uns schlechtes Image. Wenn wir ein Bild haben, werden wir das über unsere Editor-Komponente und für das Bild anzeigen. Wir werden unsere Datei angeben, dass wir den US-Bundesstaat für With und Height Mobile auf 200 begrenzt haben . Dann für die Grenze werden wir sagen, nur 10 setzen . Und das ist diese Grenze an Kanten, als wir keine Farbe brauchen. Wir brauchen keine Skala, aber wir brauchen Grenzradius. Wir wollen es umkreist lassen. Also werden wir Grenzradios 100 angeben. Alles klar, jetzt schauen wir es uns an. Wenn ich die Seite aktualisieren, dann klicke ich auf Modell Wählen Sie neuen Avatar. Wenn ich auf dieses Auto klicke und jetzt öffnen, kann ich sehen, dass ich dieses Converse Element habe, das ist dieses Paket. Und jetzt bin ich in der Lage, es mein Bild ein wenig hinzuzufügen. Alles klar, so sieht es gut aus, aber es zentriert sich nicht. Es bedeutet, dass wir zusätzlichen Markt für dieses Bild für diesen Avatar-Editor hinzufügen müssen. Lassen Sie uns ein weiteres Def um es so herum. Und für diesen Def. Lassen Sie uns die Anzeige flex angeben. Also werden wir das Display Flex setzen. Begründen, sagen wir, zentrieren, ausrichten Elemente zentrieren und lassen Sie uns es in voller Höhe so setzen. Wenn ich ein frisches hätte, schauen wir es uns an. Wenn ich ein frisches hätte, Lassen Sie mich ein Bild erneut auswählen. Aber trotzdem sieht es nicht gut aus, weil es nicht gerechtfertigt ist. Mitte. Es ist gerechtfertigt Content-Center. Lassen Sie es mich versuchen. Wählen Sie Neuer Avatar aus. Alles klar, jetzt sieht gut aus. Es ist zentriert. Okay, also denke ich, das ist es für dieses Video, und unser nächster Schritt wird sein, das Bild wirklich hochzuladen. Aber es wird das Thema für unser nächstes Video zu diesem Schritt sein. Lassen Sie uns unsere Änderungen übernehmen und dieses Video beenden. Also werden wir alles zu diesem Stadium hinzufügen, dass wir Commit bekommen werden, und wir werden sagen, angefangen, mit Benutzeravatar zu arbeiten. Applaus. In Ordnung. Sieht gut aus. Wir sehen uns im nächsten. 112. Dashboard - Hochladen von Avatar auf Firebase (Teil 6): Hey, in diesem Video, wir werden weiterhin auf Avatar-Upload zwischen Komponente arbeiten, und wir werden fertig Hochladen que sera Wasser. Lass uns gehen. Das erste, was gequibbelt Sie würden einen Handler für ein Klick-Ereignis definieren, um Ihren Avatar-Button applaud . Lassen Sie uns also auf Klick-Ereignis beruhigen und lassen Sie uns eine neue Funktion erstellen, die wir beim Upload nennen werden . Klicken Sie auf. Dann werden wir diesen Handler direkt nach der Dateiimportänderung setzen, und jetzt müssen wir irgendwie Zugriff auf das eigentliche Bild bekommen. Dieses Mal wird dieses Bild bearbeitet. Also müssen wir Zugang zu diesem umgekehrten Element bekommen. Also, wenn wir es untersuchen, ist es eine Umkehrung innerhalb von Dom, weil es um unsere Editor-Komponente geht, die wir aus dem Paket verwenden . Also, um zu verstehen, was tatsächlich passiert, wie wir das Bild bekommen können, das wir brauchen, um zu ihrer Dokumentation zu navigieren, als wenn wir nach unten scrollen , haben wir ein Beispiel darauf beschränkt, auf das resultierende Bild zuzugreifen. Hier haben wir diese Methode beschränkt bekommen Bild skaliert, um sich zu unterhalten. Aber wie wir aus diesem Beispiel sehen können, verwendet es klassenbasierte Komponente, und es verwendet auch etwas namens Referenzen. Referenzen in React sind also die Möglichkeit, direkt auf Dom-Elemente zuzugreifen oder Elemente direkt dort zu reagieren , wo angemessener programmatisch zu sagen wäre. Lassen Sie uns also herausfinden, wie wir tatsächlich eine Referenz auf unsere Avatar-Editor-Komponente innerhalb einer funktionsbasierten Komponente setzen können . Also zuerst müssen wir einen Hook importieren, den wir vorher noch nicht von reagieren gesehen haben , der ref verwendet wird , der für Verwendungsreferenz steht. Jetzt müssen wir eine neue Referenz erstellen, und wir werden diesen Referenz-Avatar-Editor Graph nennen, und wir werden diesen Haken so nennen. Jetzt müssen wir diesen Verweis an diese Komponente übergeben. Also werden wir Raph angeben, und dann werden wir Avatar-Editor grob gießen. So, jetzt sind wir in der Lage, diese zugreifen, Nehmen wir an, Avatar, Editor-Komponente mit dieser Referenz, das ist unser Wasser, das ich zu rau gemacht. Also beim Hochladen klicken. Lassen Sie uns einen Blick werfen. Wir müssen auf diesen Editor zugreifen. Holen Sie sich Bildfertigkeit, um auf den tatsächlichen Wert von dieser Referenz zuzugreifen. Wir müssen die nächste setzen, damit wir uns unterhalten, und wir werden sagen, wir werden auf Avatar Edita ralf dot current zugreifen. Es ist also das aktuelle Element aus dieser Referenz, weil es auch undefiniert sein kann. So stellen wir sicher, dass wir auf das aktuelle Element zugreifen. So als nächstes können wir auf die eigentliche Methode zugreifen, die wird Bild skaliert werden, zwei Kameras. Also lassen Sie es uns nennen. Und jetzt können wir tatsächlich unser umgekehrtes Element haben. Aber die Sache ist, dass wir nicht mit dem Gespräch arbeiten können. Wir können es nicht hochladen. können wir eigentlich gar nichts machen. Also zuerst müssen wir es in eine ehemalige konvertieren, die wir zu Feuerbasis applaudieren können, damit wir Converse tatsächlich in eine Blob-Datei konvertieren können. Und eine Bloke Datei ist nur eine Stückdatei, die im Binärformat dargestellt wird. Mit diesem Format können wir applaudieren. Also, auf jedem umgekehrten Element haben wir diese Methode, die aufgerufen wird, zu blockieren, und die Sache mit diesem Methode zu blockieren, dass es nur Rückrufe akzeptiert. Wir können eigentlich keine Versprechen gebrauchen. Dafür möchte ich diese Colback-basierte Methode in ein Versprechen konvertieren. Um das zu tun, werden wir das nächste hier an der Spitze tun. Wir werden eine neue Funktion definieren, die wir erhalten Block nennen, und diese Funktion wird eine Converse wie diese erhalten und diese Funktion wird zurückkehren und Sie versprechen Objekt. Also lassen Sie uns wieder neu setzen, ich verspreche es. Also haben wir es noch nicht gesehen. Um ein tatsächliches Versprechen zu erstellen, müssen wir eine Rückrufeinsicht setzen, die zwei Argumente erhält, Ergebnis und Ablehnung. Also werden wir diese Methode aufrufen, um das Versprechen tatsächlich zu lösen oder abzulehnen. Also hier, drinnen, was werden wir tun? Wir rufen Converse zu Bluff an. Dann werden wir diesen Rückruf mit dem mit dem Ergebnis angeben, das der eigentliche Bluff sein wird . Und in diesem kalten Rücken werden wir es überprüfen. Wenn unser Blut existiert und alles in Ordnung ist, werden wir uns aus diesem Versprechen ergeben, dass wir es lösen werden. So Ergebnis und Wert wird der eigentliche Sprengrat sein. Wenn wir keine Blockelemente haben, die mit einem neuen Fehler und für eine Fehlermeldung ablehnen würden , werden wir von so etwas wie Dateiproteste jemals sagen. Ordnung, also haben wir jetzt auf diese Weise eine kalte, zurückbasierte Methode in ein Versprechen umgewandelt . Also, jetzt können wir das in die Luft sprengen und was wir tun können, werden wir versuchen, fangen Block hier drüben zu versuchen und jetzt, was wir tun werden, werden wir das nennen explodieren so. Dann werden wir Leinwand reinlegen. Und weil es ein Versprechen ist, müssen wir jetzt warten. Und falls wir einen Fehler haben, wird es von diesem Block hier gefangen. Also, weil wir erwarten, Index, müssen wir diese Funktion in eine beliebige Funktion konvertieren. Ordnung, also wird das Ergebnis unsere Explosion sein, dass wir jetzt zum Dateispeicher über Speicher applaudieren können . Wie wir das tun können. Wir haben noch nichts hochgeladen. Nun, navigieren wir zurück zu Firebase Doggy s und importieren wir hier eine andere Bibliothek aus Firebase. Dieses Mal wird es Firebase Schrägstrich Speicher jetzt tatsächlich Zugriff auf Speicher in genau der gleichen Weise werden wir exportieren, const Storage App Dot Storage alles in Ordnung. Und der Speicher A pie ist dem Datenbankspeicher sehr ähnlich. Wir müssen die Referenz angeben, die tatsächlich der Pfad zur Datei ist, und dann müssen wir sie applaudieren. Also jetzt hier. Zuerst werden wir den Pfad angeben, unter dem wir unser Bild speichern werden. Es wird,sagen wir, Avatar-Dateireferenz wie diese sein sagen wir, , so dass wir auf unser Speicherobjekt von Misc Firebase zugreifen würden . Dann werden wir Punkt setzen und dann werden wir Referenz nennen. Also werden wir unsere Dateien auf ihrer Vergangenheit speichern, die s slash Profil Schrägstrich Benutzer i d also müssen wir Sie dorthin bringen. Ich d Also lassen Sie uns verwenden Profil Hook, So const Profil, wir werden von Verwendung Profil erhalten. Dann werden wir den Profilpunkt Ihres i d angeben und es in String-Interpolation konvertieren . Und dann, tatsächlich, lassen Sie uns Zugang Kind und Kind wird Avatar sein. Alles klar, was wir hier tun, wir geben diesen Pfad in unserem Speicher an, also wird er unseren Ordner darstellen und dieses Kind wird es eine Datei namens Avatar sein. Wir werden keine Verlängerung setzen, da es automatisch von der Feuerbasis abgeholt wird. Alles klar, jetzt, das nächste, was gequibelt ist, werden Sie die Datei hochladen. Also lassen Sie uns const Upload-Avatar-Ergebnis setzen. Dann werden wir eine Gewicht-Avatar-Datei Arraf Dot setzen. Und wenn wir es nennen, können wir sehen, dass wir tatsächlich entweder Blob oder Array-Pufferarray setzen können. Also lasst uns tatsächlich unseren Blub hier drüben setzen, und dann lasst uns auch zweites Argument. Wir können Meta-Daten angeben. Also für Materie Daten, lassen Sie uns Cash Control Header angeben. So können wir tatsächlich unsere Bilder innerhalb des Browsers einzahlen. Also lasst uns eine Bargeldkontrolle setzen. Und für die Bargeldkontrolle werden wir die Öffentlichkeit als Marx Age angeben. Wir gehen nach Port 3600, was eine Stunde in Sekunden darstellt. Dann multiplizieren wir mit 24, um den tatsächlichen Tageswert zu erhalten, und dann werden wir mit drei multipliziert. Also, jetzt haben wir Marken, die frei sind. Drei Tage in Sekunden angegeben. Alles klar, jetzt, wo wir Petar haben , lassen Sie mich diese Sammy Spalte von hier entfernen. Jetzt, da wir ein Plourde-Avatar-Ergebnis haben, müssen wir die Don't load your l aus unserer Datei, damit wir es in unserer Datenbank speichern können. Also hier werden wir ständigen Download setzen, Ural. Also nennen wir Upload unserer Wasserergebnis-Punkt-Referenz. Machen Sie sich nicht täuschen, und rufen Sie nicht direkt herunterladen Ihre l Weil, wie Sie sehen können, ist es veraltet ID Referenz zu verwenden, die nicht laden Euro bekommen. Also rufen wir Ralf an, und dann rufen wir an. Holen Sie sich nicht Euro laden. Es gibt ein Versprechen zurück. Also warten wir darauf. Und jetzt können wir es wirklich im Inneren speichern. Unsere Datenbank lässt schlechte Benutzer Avatar Raff, die unsere Referenz innerhalb Echtzeit-Datenbank darstellen wird . Also, welche wird Datenbank Daut Ralf sein, als es sein wird? Profile Slash Profil Punkt Ihre i d Und dann werden wir Kind eines Autos setzen. Und jetzt werden wir User Avatar Raff anrufen, setzen, nicht Euro laden. Und gleich danach werden wir Alarmpunkt-Info über ein Auto nennen, das Bohne applaudiert hat. Und lassen Sie uns vier Sekunden. Und für den Fall, dass jeder Redakteur ist, werden wir alles alarmieren und wir werden unsere Botschaft auch mit vier Sekunden sagen. Und auch kurz bevor wir diese Datei speichern, lassen Sie uns auch den Ladezustand angeben. Also hier werden wir einfach erstellen wird geladen und gesetzt wird, was standardmäßig geladen wird, wird Ihre false gesetzt. Also, wenn wir alle Operationen direkt davor ausführen, rufen wir set wird geladen auf true. Und dann, wenn wir fertig sind, rufen wir set wird geladen auf false und wenn wir fehlgeschlagen sind, rufen wir auch Set wird geladen auf false jetzt, wenn wir es tatsächlich verwenden, wir verwenden es tatsächlich für diese Schaltfläche, um es deaktiviert zu machen. Also deaktiviert wird nur sein, wenn wir seinen Ladezustand aktiviert haben. In Ordnung, also war es eine Menge. Nun, lassen Sie es uns wirklich testen. Also lassen Sie mich die Seite aktualisieren. Lass mich öffnen, Armaturenbrett. Lassen Sie mich Neuer Avatar auswählen. Jetzt klicke ich auf dieses Auto. Ich werde auf Applaud neuen Avatar klicken, und ich kann sehen, Avatar wurde applaudiert. Alles klar, jetzt schauen wir uns zuerst in unserer Datenbank an. So scheint es, als hätten wir jetzt Avatar hier. Wie Sie jetzt sehen können, haben wir diese Öffentlichkeit, die krank ist, was zu einer Firebase-Speicherung führt. Schauen wir es uns an. Unser Lager. Und hier können wir einen Ordner sehen. Lasst uns darauf klicken. Dann haben wir Benutzer I d. Und im Inneren haben wir Avatar-Datei. Also, wenn wir darauf klicken, können Sie sehen, wir haben diese Ihre l, die wir klicken können, und es öffnet uns das Bild in Ihnen tippen. Aber die Sache ist, dass wir jetzt erfolgreich Datei in Feuerbasis Speicher hochgeladen. Also, wie können wir jetzt dieses Bild darstellen? Nun, ich denke, das ist Thema für unser nächstes Video, denn im Moment wird es zu lang. Alles klar, also lassen Sie uns alles speichern, um System zu bekommen. Lassen Sie uns es unsere Änderungen kommen und sagen wir hochgeladen User Avatar. Alles klar, wir sehen uns in der nächsten. 113. Dashboard - User und Initialen von Benutzer-Namen (Teil 7): Hey, in diesem Video zeigen wir das hochgeladene Avatar-Bild in unserem Dashboard an. Lass uns gehen. Zuerst möchte ich die Komponente aus unserem Anzug zeigen, die Allah Teer ist. Also navigierte ich zu seiner Dokumentation, und ich öffnete ALIT sind unter Datenanzeige. Also hier das coole Ding an dieser Komponente, dass es tatsächlich Namensinitialen zeigen kann, wenn wir kein Bild haben. Also lassen Sie uns ein Beispiel öffnen. Und mal sehen, wie wir tatsächlich Namensinitialen setzen können, wenn wir keine Quelldatei haben. Also müssen wir diese Initialen einfach an Avatar Component übergeben. Was ich also vorschlug, schlug ich vor, einen Wrapper um diese Komponente zu erstellen. Also, wenn wir kein Bild haben rebellieren Anzeigenamen Initialen. Also unter Komponenten, lassen Sie uns eine neue Datei erstellen, die wir Profil Avatar nennen. Also lassen Sie es eine Komponente sein, die dieses Ah zurückgibt, was sind Komponenten, die von unserem Anzug so kommt? Welche Requisiten sollten wir für diesen Avatar angeben? Also werden wir den Namen vom Benutzer brauchen, also geben wir ihn als Requisiten weiter. Also lassen Sie uns Destruktornamen und was auch immer zu dieser Komponente geht, es wird auf die Avatar-Komponente aus unserer Serie umgeleitet. Also lass es uns sagen, Teoh Avatar Requisiten. Und dann lassen Sie uns es über das ganze Element verteilen. Alles klar, gut. Nun, in diesem Avatar, müssen wir Namen Initialen portieren. Aber sagen wir, unser Name ist so etwas wie Andrew, und etwas geht danach. So, wie wir die tatsächlichen Namensinitialen erhalten können, werden wir eine Hilfsfunktion erstellen. Also lasst uns das löschen. Und unter MISC, lassen Sie uns eine neue Datei erstellen, die wir Helfer doggy s nennen und hittable definieren alle unsere vernünftigen Funktionen, die uns während des Codes helfen. Also werden wir eine neue Funktion erstellen, die wir nennen, Nehmen wir an, erhalten Namensinitialen. Es wird Benutzername als Argument erhalten, und unsere Logik wird die nächste sein. Zuerst werden wir es in eine Reihe von Auszeichnungen aufteilen, und dann werden wir überprüfen, ob wir zwei oder mehr Wörter in unserem Spitznamen haben, dann bekommen wir erste Briefe zuerst an die Bezirke. Also lasst uns zuerst den tatsächlichen Bereich bekommen. Wir werden es nennen, sagen wir Split Name. Dann machen wir den Namen Punkt zur Oper. Der Fall wird im Voraus in Großbuchstaben umgewandelt, und dann teilen wir ihn durch Leerzeichen auf. Auf diese Weise werden wir mit einem Array von Wörtern enden. Und dann werden wir überprüfen, ob die Länge des geteilten Namen-Array-Dokuments größer als eins ist. Wenn wir also zwei Auszeichnungen haben, geben wir zumindest den Namen Split zurück, Erstes Wort. Und dann müssen wir vom ersten Wort an den ersten Buchstaben bekommen. Also werden wir zweite Klammern öffnen, und wir werden das erste Element setzen. Dann werden wir Pluszeichen setzen, um in einem Bezirk zu schneiden. Dann werden wir diesmal gegen den Namen Bleidt setzen Hubble Referenz. Das zweite Element. Das zweite Wort. Also werden wir einen und wieder setzen, wir werden auf den ersten Brief verweisen. Wir haben Null gesetzt. Ordnung, InOrdnung,falls wir standardmäßig nur ein Wort haben, kehren wir zurück. Teilen Sie einfach den Namen Null, das ist das erste Wort. Und dann erster Element-Anfangsbuchstabe. In Ordnung. Und lassen Sie uns diese Funktion auch von hier aus erkunden. Nun, in unserem Profil-Avatar hier in geschweiften Klammern, können wir tatsächlich anrufen, Namen bekommen und es zeigt, und wir können Namen übergeben, die wir von Requisiten erhalten. Alles klar, jetzt gehen wir zu Avatar. Applaud Bt und Komponente. Und hier, lassen Sie uns diese Komponente verwenden. Also werden wir Profil-Allah-Auto als Quelle setzen. Wir werden Profil Punkt Avatar und dann für Namen angeben. Wir werden Profilpunktnamen angeben. Auf diese Weise, wenn wir eine Quelldatei haben, dann wird die Quelldatei angezeigt. Wenn wir es nicht haben, werden unsere Namensinitialen da sein. Alles klar, lassen Sie es uns speichern und schauen wir uns mal an. Was haben wir? Gehen wir zurück zu unserem Dashboard und jetzt sehe ich, dass ich kein Avatar-Bild habe . Na gut, vielleicht ein Let's Upload. Öffnen wir es. Lassen Sie uns Upload New Avatar Avatar wurde hochgeladen, und immer noch kann ich alle Daten sehen. Okay, das liegt daran, dass wir unsere Kontakte nicht geändert haben. Unsere Profilkontakte. Lassen Sie uns zu Profilkontext gehen und Daten, die wir hier übergeben haben, haben keine Ah, was ist aber innerhalb Al Atar Applaud BT in US-Quelle. Ich habe Profil Avatar angegeben. Dieses Profil stammt aus dem Verwendungsprofilkontext. Also, was müssen wir jetzt tun, wo wir Daten aus der Datenbank wieder? Wir können es tatsächlich von hier aus unserer Momentaufnahme zerstören, oder? So einfach wie das. Also dann werden wir es auch an unsere Kontakte weitergeben Alles klar, speichern wir es. Und jetzt schauen wir uns mal an. Wenn ich jetzt zu meinem Dashboard gehe, habe ich dieses Bild. Aber zuerst sieht es wirklich seltsam aus, also lasst es uns ein bisschen modifizieren. Gehen wir zum Profil Avatar und standardmäßig, direkt bevor wir alle Requisiten verteilen. Lassen Sie uns Kreis setzen, so dass es standardmäßig eingekreist wird. Schauen wir es uns an. Jetzt ist es eingekreist, aber die Größe ist wirklich, wirklich klein. Also was, wir können im Avatar-Upload-Button dio? Wir können Klassennamen anwenden und das wird es beheben. Wir wissen, dass unser Bild, unser Converse, das wir für unseren Teer-Editor angegeben haben, 200 mal 200 ist. Also werden wir mit 200 Höhe 200 Pixel anwenden, die Klassen, die Sie in Utility-Klassen beschränkt haben. Also lasst es uns retten. Und wenn wir jetzt zum Armaturenbrett gehen, haben wir die richtige Größe für M A Tropfer. Aber das Bild selbst ist wirklich klein, also müssen wir das eigentliche Bild rezitieren. Dafür. Ich habe diesen Plusnamen erstellt, den Sie auch innerhalb von Dienstprogrammen finden können, das Bild in voller Größe ist, und es wird mit einer Höhe von 100% dem Bild geben. Jetzt sieht es gut aus. jedoch Es gibtjedochein kleines kleines Problem. Wenn ich dieses Bild verzögert habe, lassen Sie es uns jetzt von hier aus liefern. Wie Sie sehen können, wenn wir kein Bild haben, bekomme ich Namensinitialen, aber sie sind auch zu klein, also müssen wir auch die Telefongröße anpassen. Also lassen Sie uns dafür eine riesige Größe voranziehen und alles wird gut. Schauen wir es uns an. Jetzt. Ich habe auch die richtige Größe für meinen Text. Also lassen Sie uns jetzt vielleicht den Spitznamen ändern und zwei Wörter setzen. Lassen Sie uns setzen und sein. Und lassen Sie uns überprüfen, ob wir zwei Buchstaben als unsere Initialen haben und in Haben wir hier eine angezeigt ? Schön. Lassen Sie uns versuchen und applaudieren New Allah Auto. Wählen wir es aus. Und Avatar wurde hochgeladen, sieht gut aus und funktioniert nahtlos. Okay, gut. Ich schätze, das ist der gute Zeitpunkt, um dieses Video zu beenden. Also lassen Sie uns unsere Änderungen mit Nachricht begehen. Etwas wie angezeigt haben einen tar Benutzer Avatar. Okay, perfekt. Wir sehen uns im nächsten. 114. Create-Room Knopf und Funktionalität hinzufügen: Hey, willkommen in diesem Video. Wir werden neue Bottom Billow Dashboard hinzufügen, das uns lieben wird, um einen neuen Chatraum zu erstellen . Lass uns gehen. Gehen wir zurück zu Code und anderen Komponenten. Wir werden neue Datei erstellen, die wir schaffen Raum bt n motile Don't nennen. Ja, Lassen Sie uns voll gehen Diese Komponente für jetzt. Lass es nur Hallo sein und lass es uns tatsächlich benutzen. In unserer Sidebar Öffnen Sie die Sidebar. Und hier unten Armaturenbrett Tuggle, wir werden schaffen Raum Bt und Moto. In Ordnung, jetzt lasst uns nicht mit dem Disk-Gegner beschäftigen. Und hier werden wir eine Schaltfläche definieren, die ein Modellfenster mit Formular öffnet, in dem wir füllen werden, um tatsächlich einen Chatraum zu erstellen. Also wird es in Ordnung sein, vielleicht eine Diff-Komponente. Also drinnen werden wir Knopf setzen, der unser Tuggle sein wird, um das Flaschenfenster zu öffnen. Also werden wir das in Sicht bringen. Also das kann ich haben Symbol aus kann kreativ sein, und der Text wird neue Chat-Raum zu schaffen. Ordnung, also dieser Knopf wird ein Block Elemente sein, es wird Farbe grün haben und beim Klick gehen wir , Teoh, Teoh, öffne unser Moto. Also lassen Sie uns tatsächlich unseren benutzerdefinierten Haken verwenden, um den tödlichen Zustand zu verwalten. So wird dieser Haken verwendet Modellzustand von hier begonnen, Infrastruktur ist offen, offen und dann geschlossen. Und für Button klicken, Wir gehen zu gießen offen. Alles klar, jetzt definieren wir unser bewegliches Fenster. Also lasst uns Modellelement aus unserem Anzug setzen. Wir werden, wie immer, sterbliche Heather haben wie immer, . Dann werden wir Körper haben und ins Wanken gehen. Alles klar, gut. Also in Heather, werden wir Titel mehr setzen. Sie werden Titel und innen punktieren. Wir setzen so etwas wie einen neuen Chatraum ein und lassen uns dieses Idol von hier entfernen. Ordnung, im Körper, wir werden die Form und den inneren Fuß definieren, oder wir werden den Knopf setzen, um das Formular zu senden. Also lassen Sie uns zuerst die Schaltfläche erstellen. So wird es ein Button-Element sein. Es wird blockiert werden. Komponente und Aussehen wird primär sein. Okay, schätze ich. Das Erscheinungsbild ist standardmäßig auf primär festgelegt. Aber lassen Sie es uns einfach so behalten, wie es ist. In Ordnung? Erstellen Sie einen neuen Chatraum. Jetzt speichern wir es und mal sehen, Was haben wir? Also, jetzt haben wir diese neue Chatraum erstellen, haben jemals. Wir haben nicht die Marge, also lasst uns mal etwas ansprechen. Also für diese steife, lassen Sie uns Klassennamen setzen und fügen Sie Rand oben zwei hinzu. In Ordnung. Sieht gut aus, jetzt in diesem Körper würde unsere Form definieren. Also lasst uns schlechtes Formelement aus unserem Anzug. Und in diesem geboren, werden wir unsere Eingabeelemente definieren, und sie sind unter gebildeten Gruppenkomponenten gruppiert. Also lasst uns schlechte Formgruppe und innerhalb dieser Form. Aber offen wird das erste Kontroll-Label haben. Und dann werden wir Formularsteuerung setzen, die der eigentliche Import selbst sein wird. Lasst uns so vorgehen. Also innerhalb Steuerelement Label, werden wir auf den ersten Port-Raumnamen und Formular-Steuerelement wird Name, Name und Platzhalter sein wird ein Platzhalter wird so etwas wie Chatroom Name eingeben und drei Enten, und es wird eine selbstschließende Komponente sein, weil es eine Eingabe ist. Alles klar, wenn ich also in dieser Formulargruppe schwebe, heißt es, es definiert nicht, also lasst uns es aus unserem Anzug importieren. In Ordnung, dann definieren wir unsere zweite Eingabe. Sagen wir, würde eigentlich und sehen, was wir haben. Wenn wir also auf Neuen Chatraum erstellen klicken, wird nichts passieren, weil wir keine Show Requisite für motile Fenster angegeben haben. Also lassen Sie uns setzen ist offen und auf Höhe, wir werden Kleiderbügel setzen. Alles klar, sieht gut aus. Jetzt schauen wir es uns an und ich sehe, dass wir viel Platz hier drüben hinzugefügt haben. Also lasst uns schlechter Rand oben eins jetzt ist es. Ok, öffnen wir es. Und hier können wir sehen, dass wir unseren Eingang haben, aber es ist ein wenig aus, nicht voll mit. Also lasst es uns schnell reparieren. Und vier Tage bilden Elemente. Wir werden es so machen, dass es alles mit dem Wrapper-Element abnimmt. Alles klar, sieht gut aus. Nun gehen wir weiter und lassen Sie uns eine zweite Foreign Group erstellen, die Raumbeschreibung sein wird. Also für diese Reformgruppe auch werden wir auchSteuerelementbeschriftung auf Formular-Steuerelement wie folgt kopieren Für dieses Steuerelement Etikett werden wir Beschreibung angeben, und für dieses Formular-Steuerelement wir eine Textbereich-Komponente. Also lassen Sie uns schlechte Komponentenklasseneigenschaft. Es wird Textbereich sein als ihre Rose. Standardmäßig ist gleich fünf. Name wird Beschreibung sein. Und Platzhalter wird sein Lassen Sie uns sagen, geben Sie Rom. Beschreibung. In Ordnung. Sieht gut aus. Werfen wir einen Blick, wenn ich darauf klicke. In Ordnung. Ich habe eine Beschreibung. Ich habe echten Namen. Okay, jetzt, vielleicht lassen Sie uns unseren Zustand für die tatsächlichen Daten definieren. Also hier was? Wir werden Ford, wir werden Ihren Zustand definieren, dass wir nennen, bilden, Wert und Fremdwert als Update-Funktion setzen. Ihr Zustand wird also der nächste sein, dass es ein Objekt sein wird, und ich, was ich vorschlage, schlug vor, es außerhalb der Komponente zu setzen, weil wir es zum Anfangswert rezitieren werden, wenn wir es einreichen. Aber wir werden das Formular einreichen. Also lasst uns das Showformular eintragen. Und es wird ein Objekt mit Name und Beschreibung Einsicht sein. In Ordnung. Das gleiche wie wir Namen Requisite für unseren Input haben. In Ordnung, also bist du vorbei. Standard wird Anfangsform sein. In Ordnung? Außerdem benötigen die Leute den Ladezustand. Lassen Sie uns es im Voraus definieren. Wir werden es verwenden, wenn wir das Formular absenden. Ihr Zustand wird also falsch sein. Also gut, Also gut, zuerst müssen wir uns darum kümmern, wann wir die Daten nehmen müssen. Also, wenn wir ein eigenes Änderungsereignis verwenden Also lassen Sie uns vier const auf Formularänderung und die Sache mit unserer Anzug, wenn wir auf Änderungsereignis verwenden, gibt es uns automatisch den Wert als erstes Argument, nicht das Ereignisobjekt. Also werden wir hier Wert haben. Also werden wir CET-Formularwert als Wert gießen. Und eigentlich ist es etwas anders mit unseren Anzugformen. Wenn wir eine Formularkomponente in unserer Sicherheit haben, gibt es Ihnen automatisch nicht den Wert aus der tatsächlichen Eingabe, die Sie es hinzufügen. Aber es gibt Ihnen den Wert aus dem gesamten Formular, so dass es wirklich bequem ist, es mit dem Verwendungsstatus zu verwenden. Ordnung, also bei der Formularänderung, werden wir für unsere Formularkomponente portieren. Also auf Change-Handler wird auf Formularwechsel sein. Jetzt. Wir müssen auch unsere Daten irgendwie validieren und zuerst werden wir den tatsächlichen Zustand mit dem Formular verknüpfen. So hat es diese Eigenschaft namens Formularwert. Es muss also ein Objekt sein, das mit der Form nur unser Zustand interagiert. In Ordnung, also werden wir einen schlechten Formwert haben. Und dieses auf Änderungsereignis wird uns den neuen Formularwert geben, wenn wir ein Element aus diesem Formular aktualisieren . Also, was wird unser Objekt am Ende sein? In Ordnung. Also, wie ich bereits sagte, jetzt müssen wir irgendwie die Daten validieren, das Formular, wenn wir eingereicht haben. Nun, unser Anzug liefert uns, ob wir mit Hilfsmethoden, um das zu erreichen, ein Schema definieren können, das wir unserem gebratenen übergeben können, und dann wird unser Anzug gegen dieses Schema überprüfen. Also lassen Sie uns unser Schema definieren. Ich hier an der Spitze für unser Formular, Lassen Sie uns definieren es Modell. Und hier werden wir ein Schema verwenden, das wir aus unserem Anzug importieren, als wir das Modell setzen. Und in diesem Modell müssen wir ein Objekt setzen, das unseren Staat repräsentieren wird. Also werden wir einen Namen haben. Es muss die gleiche Form wie unser Staat haben. Also Name wird String-Typ sein, der tatsächlich von Schema-Typen kommt. Also lassen Sie uns strukturieren es String oder vielleicht Schemapunkt-Typen von diesem Objekt, wir werden d Struktur-String-Typ. Dann werden wir den String-Typ verwenden, um diesen Namen zu definieren, wird ein Schrumpfen sein. Also String-Typ, dann werden wir setzen ist erforderlich, um die Validierung durchzuführen und andere Nachricht wird erschossen werden . Name ist erforderlich, alles in Ordnung, und das gleiche wird tun. Vier Beschreibung. Lassen Sie es uns kopieren. Lassen Sie uns in Beschreibung umbenennen und sagen wir, Beschreibung ist erforderlich, die coole Denken Sie über diese moralische Schema-Validierung, dass es in Echtzeit validiert wird. Jetzt müssen wir dieses Schema auf unserem Formular einreichen. Also lasst uns diese Formularkomponente finden. Und hier als motil werden wir unser Moto-Schema spezifizieren, unser Modellobjekt hier. In Ordnung, jetzt müssen wir tatsächlich die Submit-Funktion erstellen. Also zuerst einmal, lassen Sie uns tatsächlich auf Formularwechsel. Es ist hier nicht optimiert, weil wir eine Menge von Zuständen haben, die sich ständig ändern, zum Beispiel, ist offen und Fremdwert. Also jedes Mal, wenn wir auf Formularänderung erstellt haben und Sie diese Funktion kopieren. Also lasst uns es im Voraus auswendig lernen, um es optimierter zu machen. Alles klar, und jetzt lassen Sie uns tatsächlich unsere On Submit-Funktion erstellen. Also werden wir es nennen, sagen wir bei der Einreichung und es wird eine Senkenfunktion im Voraus sein und hier wird der erste Schritt sein, Daten tatsächlich zu validieren. Also, wie können wir das tun? Wie es unsere Daten anhand des Schemas validieren kann, das wir hier definieren. Wir müssen tatsächlich einen Verweis verwenden, um unsere Formularkomponente zu referenzieren, und dann mit dieser Referenz können wir seine internen Methoden aufrufen, um sie zu validieren. Also, was können wir jetzt tun? Wir wissen, dass wir ref von react verwenden können. Also lasst es uns hier setzen. Lassen Sie uns es Form nennen, ref, und dann werden wir verwenden ref von react nennen. Dann werden wir dieses Formular ref an diese Formularkomponente übergeben. So rau wird Form, Atem und Hören sein. Der erste Schritt wird sein, wenn Form ref Punkt aktuelle Punktprüfung. Also diese Prüfmethode ist auf dieser Formularkomponente verfügbar, auf die wir direkt hier zugreifen , Also diese Überprüfung wird diese Daten validieren unseren Formularwert, das ist unser Zustand gegen das Schema, das wir hier definieren. Wenn also alles in Ordnung ist, wird es mit dem wahren Bullen Wert zurückkehren. Wenn nicht, wird es falsch sein. Wir werden also überprüfen, ob unsere Formularwertprüfung nicht bestanden hat. Wenn wir also einen falschen Wert haben, werden wir einfach von dieser Funktion als Rat zurückkehren. Wir werden unsere Datenbank mit dem neuen Raum aktualisieren. Lassen Sie uns also gießen, dass CET vor jeder asynchronen Aufgabe auf true geladen wird. Und hier werden wir ein neues Objekt erstellen, das wir in der Datenbank speichern werden. Sagen wir also neue Raumdaten. Es wird tatsächlich sein, ah, wo unser Staat Wert bildet. Aber auch wir werden eine andere Eigenschaft aufbringen, die erstellt werden wird, also hier werden wir alle Formwerte verbreiten, die wir haben, und dann werden wir erstellt und dann werden wir Feuerbasis von Firebase importieren und dann hier hat erstellt, bei wir werden Firebase Punkt Datenbank Punkt Serverwert Punkt Zeitstempel gießen. Jetzt haben wir die komplexen Neurondaten, die wir in der Datenbank speichern müssen. Lassen Sie uns also versuchen catch blawg vor einer asynchronen Aufgabe. Und für den Fall, dass es besser ist, werden wir eingießen. CET wird auf false geladen, und wir töten Alert-Punkt Bessere Fehlermeldung mit vier Sekunden. In Ordnung. Sieht gut aus. Jetzt werden wir warten Datenbank für Projekt von Firebase aufrufen. Dann werden wir Dr. Ralf für diesen Verweis setzen. Wir werden nur Räume angeben, so dass wir unsere Zimmer unter den Zimmern halten, Pfad innerhalb der Datenbank und zu schieben. Und Sie, sagen wir Wert zwei Datenbank, so dass der Schlüssel automatisch generiert wird. Wir werden Push-Methode nennen, also und in den Schulen wurden neue Raumdaten übergeben. Also, nachdem wir Daten in unserer Datenbank haben, lassen Sie uns setzen zwei Stürze laden und lassen Sie uns unseren Anfangszustand zurücksetzen. Also lassen Sie uns sat Formwert nennen. Es wird Anfangsform sein, und danach müssen wir sicherstellen, dass wir auch in der Nähe des Motel-Fensters. Also lasst uns auch Kleidung nennen. Und dann lassen Sie uns eine weitere Warnung mit Informationen und wir sagen Fremdwert. Lassen Sie mich hier Zitate aufstellen. Wir sagen Fremdwert-Punktname oder lassen Sie mich es vorher so nennen. So Formwert wird sein, werden wir sagen, wurde erstellt. Und dann wieder, vier Sekunden wie immer. Alles klar, also sieht es gut aus. Jetzt müssen wir tatsächlich verwenden ist das Laden und auf Formular senden. Wir werden es für diesen Button setzen, den wir hier anklicken und wir werden so weiterleiten . Und jetzt, um dies zu verwenden, ist der Ladezustand. Wir werden es für diese Schaltfläche verwenden. Wir werden es deaktiviert, wenn wir das Laden auf true gesetzt haben. Alles klar, es war eine Menge. Jetzt lassen Sie es uns wirklich testen. Also lassen Sie mich jetzt aktualisieren, nur um sicherzugehen. Lassen Sie mich eintreten. Hallo, dann werde ich etwas anderes setzen. Und hier, wenn ich es leer lasse, können Sie sehen, dass eine Beschreibung erforderlich ist. Das Formular wird tatsächlich in Echtzeit validiert. Das liegt daran, dass wir das Schema definiert haben. Alles klar, lass uns armen Hallo. Und lassen Sie uns die Beschreibung aus diesem Raum machen. Lassen Sie uns auf Erstellen neuen Chatraum und wir können sehen, dass Alarm ist keine Funktion. Okay, vielleicht lassen Sie es uns so bewegen wie diese Warnung. In Ordnung. Alert-Punkt-Fehler war das eigentliche Problem. Ich rief nur e r R, aber es ist Fehler. Das ist also meine Wette. Alles klar, jetzt versuchen wir es noch einmal. Erstellen Sie einen neuen Chatraum. Lassen Sie uns Hallo Beschreibung. Hey, drei neue Chatroom Erlaubnis heute Abend. Das ist in Ordnung, denn wir müssen auch Sicherheitsregeln für unsere Datenbank definieren. Also lassen Sie uns Regeln öffnen und hier werden wir unser nächstes Schema definieren. Also, die nächsten zwei Profile, lassen Sie uns das kopieren. Wir werden auch Zimmer und Zimmer portieren, die wir spezifizieren werden. Also für das Lesen und Schreiben für alles drin hier drüben, werden wir es nur zulassen, wenn der Benutzer authentifiziert ist. Stattdessen, wenn wir diese Überprüfung verwenden, werden wir sagen, dass Lese- und Schreibberechtigung nur erlaubt ist, wenn aus, nicht gleich jetzt und das gleiche, was wir für im Grunde alles hier tun werden, wir werden es hier setzen statt zukünftige Idee, werden wir haben, Sagen wir, Zimmer I d. Und dann auch zum Lesen. Wir werden den Autor beruhigen, nicht gleich Schnee und ab, nicht gleich jetzt. In Ordnung. Sieht gut aus. Lassen Sie es uns kopieren. Und lassen Sie uns es auch mit unserer lokalen Datei synchronisieren, die Datenbankregeln ist. Jason. Lass es uns retten. Und schauen wir uns mal an. Jetzt werden unsere Regeln veröffentlicht. Wenn ich jetzt auf Neuen Chatraum erstellen klicke, wurde hallo erstellt. Und wenn Sie in der Datenbank jetzt unter Räumen schauen, haben wir einen neuen Schlüssel, der automatisch von der Datenbank generiert wurde. Und dann haben wir unsere Daten bei Beschreibung und Name erstellt. In Ordnung. Sieht perfekt aus. Ich schätze, das ist der gute Zeitpunkt, um dieses Video zu beenden. Lassen Sie mich alles begehen. Und dann werden wir die Schaltfläche erstellen angeben, um neuen Chatraum zu erstellen. Oder vielleicht auf neue Schaltfläche unten, um neuen Chatraum zu erstellen. Alles klar, wir sehen uns in der nächsten. 115. Aufstellung von Chat-Räume Listen Teil 1 Teil: Hey, In diesem Video werden wir anfangen, Chatham List Inside Sidebar Hier unten zu erstellen. Lass uns gehen. Lassen Sie uns in Bardo GS in erster Linie hoffen. Und hier, gleich nach einer Kreatur auf Bt und Moto, werden wir Trennkomponente aus unserer Anzug und Innenblase vorbeibringen. Konversationstext beitreten Und auch, lassen Sie uns diesen Import nach oben verschieben, um eine ausgezeichnete Warnung zu vermeiden. Schauen wir es uns an. Sieht gut aus. Jetzt müssen wir tatsächlich Komponenten definieren. Also unter Komponenten-Ordner, lassen Sie uns einen neuen Ordner erstellen, den Menschen Räume hier benennen. Wir werden zwei neue Dateien Chatroom Liste Punkt GS und Raumartikel. Nicht Ja, also wird der Raumartikel mittlerweile leer sein. Und eigentlich gilt das gleiche für Chatroom Liste innerhalb der Seite Bardo Gs Hier unten. Anstelle dieses Textes, den wir als Platzhalter verwendet haben, lassen Sie uns Chatroom Liste verwenden. Alles klar, lassen Sie es uns retten. Werfen wir einen Blick. Wir können tatsächlich den Hello Text sehen, so dass es funktioniert. Perfekt. Lassen Sie uns nun den Markt definieren. Hoffen wir in Chatham List und hier werden wir genug Komponente aus unserem Anzug für die Requisiten setzen Aussehen Satel passieren. Dann wird es vertikal und umgekehrt sein. Und für Klassennamen, werden wir die nächste übergeben. Also müssen wir diese Komponente machen diese Elemente kriechen ein ble. Also werden wir Überlauf an Warum übergeben? Scroll-Zugriff. So werden wir die Bildlaufleiste immer sehen. Und wir werden auch den Zoll Crow passieren, um es zu stylen. Alles klar, und dann innerhalb der Blase vorbei genug Punkt Itim und dann Raumartikel wie das. In Ordnung, schauen wir uns mal an. Ok. Sieht perfekt aus. Wir können Brecheisen ergreifen, und wir können sehen, dass es ein wenig gestylt ist. Okay, gut. Lassen Sie uns nun unser Markup für Raumelement definieren. Also werden wir es in zwei Teile teilen. Dave ist innen oben, Teil und unten, Teil innen. Unteren Teil, wir werden unseren Text definieren. Also werden wir gesponnenes Element setzen, und wir werden noch keine Nachrichten für jetzt und für den Klassennamen setzen. Wir werden angeben, dass es wird angezeigt werden Flex ausrichten Elemente Center, und wir werden Text Black off anwenden 70% Kapazität. Ok. Für den oberen Teil, werden wir hier Raum Namen und wie viel Zeit vor? Die letzte Nachricht wurde veröffentlicht. Also lasst uns Klasse definieren. Nennen Sie den Displayflex aus, richten Sie dann den Inhalt zwischen zwei Anzeigenflächen zwischen unseren Elementen aus und richten Sie dann die Artikelmitte . Alles klar, also wird unser erstes Element im Alter von drei Titeln mit dem Zimmernamen drinnen sein. Also zuerst werden wir statischen Text definieren, und wenn wir die tatsächlichen dynamischen Werte haben, werden wir sie abwischen. Also für H drei, werden wir Text verschwindet angeben, um Überlauf zu verhindern. Und zweites Element wird eigentlich eine neue Komponente sein, die Leute installieren. Also für jetzt, lasst uns span setzen und lasst uns zuerst einen Blick auf den Browser werfen. Schauen wir es uns an. Wie es aussieht, sieht es gut aus. Aber statt dieses x X, werden wir die Zeit vor React verwenden, um eine relative Zeit wie diese zu zeigen, die vor fünf Minuten veröffentlicht wurde . zwei Stunden. Eines Tages gehen. Also lasst es uns installieren. Ich öffne Hunde und kopiere dieses Commened. Dann werde ich meine App stoppen und dieses Paket installiert. Lassen Sie uns warten und dann werden wir weitermachen. Okay, Paket wurde installiert. Lassen Sie uns den Start wieder starten und lassen Sie uns dieses Paket verwenden. Also aus der Dokumentation werde ich diesen Import kopieren. Dann werde ich in Zimmer Artikel importiert und lassen Sie uns die Firma selbst kopieren. Und lassen Sie es uns anstelle dieser Spanne platzieren, damit wir es nicht lokalisieren müssen. Dann benutzen wir jetzt ein neues Date. Stattdessen, außerhalb dieses Datums trinken, um nur die aktuelle Zeit anzuzeigen. In Ordnung, also lasst uns die App aktualisieren und schauen wir uns mal an. Okay, jetzt haben wir gerade jetzt perfekt. Und sie werden über diese Bibliothek denken, dass es diesen Timer aktualisieren wird, Sagen wir in Echtzeit, aber ich mag das Aussehen von diesem Text nicht. Also werde ich den Klassennamen vor einiger Zeit ändern, Komponente ein wenig. So wird es normal gebildet werden. Und auch Text schwarz. Sagen wir 45 Opazität. Werfen wir einen Blick jetzt. In Ordnung. Sieht viel besser aus. Okay, lass uns weitermachen. Und unsere letzte Überlegung hier wird es sein, diese Komponente tatsächlich zu machen, um diese Chatroom Liste volle Höhe zu machen. Also dafür müssen wir es berechnen, weil unser Chat eine ganze Seite ist. Also, wie können wir das tun? Wie können wir uns dem nähern? Wir wissen, dass unsere ganze Seite 100% ist. Wir können die Höhe vom oberen Teil aus der Seitenleiste bekommen, und dann können wir diesen oberen Teil von 100 subtrahieren, dann werden wir die Resthöhe kennen lernen, die unsere Chat-Room-Liste ist. Lass uns gehen. Also lasst uns nicht großes Alter Bardoczky s schieben Und unser oberster Teil ist dieses Def Element. Um die tatsächliche Höhe davon zu bekommen, def, müssen wir Referenzen verwenden. Also lassen Sie uns eine neue Referenz erstellen, die wir topside, Bar Arraf nennen und wir werden ref Hook verwenden. Dann werden wir diesen Topside bereft übergeben, um diesen Def Atem topside by ref zu sein , und wir werden Höhe zur Verfügung stellen, damit wir den Überblick behalten werden. Also lassen Sie uns Ihre Bühne definieren, die Höhe benennen und für jetzt fest saß, standardmäßig wird es so sein, jetzt oder 20 es ist eigentlich egal innerhalb Gebrauch Effekt. Wir werden die tatsächliche Höhe von diesem Def bekommen und dann gesagt, es zu sagen. Also lassen Sie uns verwenden Effekt. Und in diesem Verwendungseffekt, lasst uns den nächsten fragen. Also, wenn wir Topside by Ref Punktstrom haben, weil es in einigen Momenten undefiniert sein kann, also werden wir überprüfen, ob es tatsächlich definiert ist, dann werden wir die Höhe von Ralf nach oben setzen, nicht die aktuelle Punkt-Scroll-Höhe. Also, wenn wir versuchen, auf die obere Seite ohne Strom zuzugreifen, ist es, als ob wir versuchen, auf Element zuzugreifen, wenn wir es mit Dokument erhalten. Get Element von i t. So ist es in einigen Fällen wie diesem sehr nützlich. Wir wollen auch diese Effekt-Callback-Funktion ausführen, wenn unsere oben waren. Balken F ändert sich. Ordnung, jetzt lassen Sie uns diesen Zustand diese Höhe an Chatham-Liste übergeben, damit wir die tatsächliche Höhe berechnen können . Also lassen Sie uns über Elementhöhe als Höhe passieren und innerhalb Jet Room Liste d Struktur über Elementhöhe und dann, was wir tun werden. Wir werden Stil im Lyons-Stil anwenden, der Höhe sein wird, unheilbar, unheilbar, CSS Berechnungsfunktion verwenden. Also lasst uns Schweinefleisch alc. Dann werden wir 100% Alter minus über Element über Elementhöhe verwenden und am Ende werden wir Pixel setzen, weil diese Höhe in Pixel beruhigt. Jetzt schauen wir uns mal an. Wenn die App aktualisiert wird, passiert tatsächlich nichts. Das ist, weil wir nicht Kaskade waren volle Seitenhöhe. Also, was passiert, dass im Haus zwielig hier ist? Wer sagte h 100 auf Lee zu der großen Komponente, aber es für eine verschachtelte Komponenten als auch zu arbeiten. Wir müssen die Höhe 104 alle Kinder für alle verschachtelten Komponenten einstellen. Also für Zeile, wir werden Alter angeben 100 und für Spalte wird das gleiche jetzt tun. Innerhalb des Seitendrahtes wenden wir bereits H 100 auf ihr Erziehungselement an, so dass es funktioniert. Werfen wir nun einen Blick und lassen Sie uns die Komponente untersuchen. Wie Sie sehen können, haben wir bereits volle Höhe und es wird automatisch berechnet und wir werden keinen Überlauf haben . Es passt immer auf die volle Seitenhöhe. Wenn wir also dieses Element inspizieren, können wir sehen, dass die Höhe automatisch für uns berechnet wird. Also haben wir 138 Pixel, die Höhe vom oberen Teil entfernt ist. Aus der Seitenleiste. Alles klar, also sieht es schön aus. Und ich denke, das ist es für dieses Video und das nächste werden wir weitermachen. Also lassen Sie uns alles auf den Bühnenzustand hinzufügen und lassen Sie uns Commit begonnen, mit der Chatraum-Liste zu arbeiten . Wir sehen uns im nächsten 116. Chat von Räume – Teil 2-: Hey, da. In diesem Video werden wir weiter an Chatham List arbeiten. Letztes Mal haben wir Mark up definiert. Dieses Mal werden wir den Staat erstellen und verwalten. Gehen wir, bevor wir in den Code kommen. Ich möchte definieren, wie wir auf diesen Zustand zugreifen werden. Also Chatrooms. Es ist etwas Schulden, die wir global innerhalb der Homepage zugreifen werden. Also werden wir Kontext a p I verwenden, um es von innerhalb der Sidebar-Komponente zugreifen zu können, sondern auch aus dem Chat-Fenster, das wir noch nicht erstellt haben. Lassen Sie uns zu Kontakte-Ordner navigieren und hier lassen Sie uns Ihre Dateiräume Kontext erstellen. Die G s. Hier werden wir neue kontext-undateable dame rooms Kontext mit erstellen kontext-Funktion , die von react kommt zu schaffen. Dann müssen wir eine Komponente definieren, einen Anbieter, der allen seinen Kindern den Kontext zur Verfügung stellt. Lassen Sie uns also const rooms Provider als Argument exportieren. Es wird Kinder erhalten und es wird Räume Kontext Punkt Anbieter zurückgeben, und wir werden Kinder in als Wert setzen. Für jetzt, lasst uns einfach eine Schnur setzen. Und wenn wir sie auf dieser Komponente haben, heißt es, reagieren muss im Umfang sein. Also lassen Sie uns importieren reagieren von reagieren. In Ordnung. Gut. Jetzt definieren wir den Zustand. Es wird also einfach sein. Deshalb können wir den Zustand verwenden. Also lassen Sie uns standardmäßig Räume und Sat-Räume definieren. Es wird auf mounten gesetzt, und wir werden unsere Daten innerhalb der Nutzung Effekt erhalten, wenn Komponente mounts. Also lassen Sie uns für die Verwendung Effekt und innen zuerst, werden wir unseren Verweis auf die Datenwege speichern. Also, wenn wir Datenbank öffnen, erinnern wir uns, dass wir unsere Daten unter Räumen speichern, Schrägstrich Raum I d. Und dann geht Daten. Also, was wir tun werden, werden wir einen Echtzeit-Zuhörer auf Räume setzen, damit wir Echtzeit-Updates erhalten können. Lassen Sie uns erstellen Sie wertvoll, dass wir Raum-Liste rau nennen und es wird Datenbank dot ref Zimmer sein. Also, jetzt haben wir die Referenz. Dann werden wir einen Echtzeit-Listener mit Punkt auf Methode setzen. Also rufen wir die Raumliste an. Ralf dachte an Wert und dann für den Callback. Wie für jetzt, erhält es Snap Shirt. jetzt angeht, werden wir Konsul schauen, Snapshot-Punkt-Wert richtig. Und weil es ein Echtzeit-Listener ist, müssen wir es abbestellen, weil es sich um ein Abonnement handelt. Also werden wir dies innerhalb der Bereinigungsfunktion tun. Off Use-Effekt hier. Wir werden Raum-Liste rauen Punkt Off setzen, es wird alle Echtzeit-Listener von dieser Referenz innerhalb der Datenbank trennen . Alles klar, lassen Sie es uns retten. Und lassen Sie uns diesen Kontext tatsächlich verwenden. Gehen wir zur Startseite. Und hier werden wir alles um Zimmer Anbieter wickeln. Okay, sagen wir mit und schauen wir uns mal an. Wenn ich zur Konsole gehe, kann ich sehen, dass ich einen Snapshot-Wert habe , der ein Objekt ist, bei dem jeder Schlüssel Raumidee ist und dann Daten weitergibt. Also haben wir diesen Vorarbeiter, weil wir Jason-basierte Datenbank haben. Aber das sind nicht gerade die vier Monate, mit denen wir zusammenarbeiten wollten. Wir brauchen einen Atemweg. Lassen Sie uns also eine Hilfsfunktion erstellen, die diesen Objekttyp in ein Array umwandelt. Also werden wir eine neue Funktion in Helfern togs definieren, die wir benennen werden. Lassen Sie uns eine Transformation zwei Array mit I d. Es wird Snapshot-Wert als Argument erhalten und es wird zurückkehren. Als nächstes wird zuerst überprüft, ob der Snapshot-Wert vorhanden ist. Wenn unsere Daten nicht jetzt, wenn wir irgendwelche Daten haben. Also, wenn das der Fall ist, dann werden wir die Logik setzen. Sonst werden wir zurückkehren und leer. Richtig. Also, was wird unsere Strategie sein? Wir werden Objekt die Kuss-Methode nennen, um alle Raumideen in ein Array zu gießen. Und dann werden wir jeden Wert, jeden Raum, den ich habe, diesen Daten zuordnen . Lass uns gehen. Lassen Sie uns also Objektpunktschlüssel vom Snapshot-Wert setzen, um alle Kinder als Array zu erhalten. Dann werden wir jeden Wert aus diesem Bereich, in dem jedes Element Raum I d ist, einem Objekt zuordnen , das alle Daten aus unserem Raum sein wird. Wir können es mit Snapshot-Wert aus Raum I D zugreifen und dann werden wir eine andere Eigenschaft anhängen , die Raum I dseinwird. , sein mit Snapshot-Punktwert, lassen Sie uns tatsächlich transformieren es weniger große neue wertvolle Daten hier. Wir werden Transformation zu Array mit i d setzen und wir werden Snapshot-Punkt-Wert-Einsicht übergeben. In Ordnung. Und lasst uns später konsularische CTA sehen, was wir tatsächlich erhalten. Nun, Wie ich sehen kann, habe ich ein Array von Räumen und ich habe Daten und auch ich habe ich d als Eigenschaft. Alles klar, das ist es, was ich will. Nun, lassen Sie uns tatsächlich den Zustand aktualisieren. Rufen wir Setrooms an und legen Daten hinein. Und dann lassen Sie uns diesen Zustand an den Kontext übergeben, als unser Wert, dessen Räume sind. Alles klar, das ist es vorerst. Ich denke, im nächsten Video werden wir das beenden und wir werden unsere Zimmer aus der Datenbank anzeigen. Aber für jetzt, lassen Sie uns dieses Video beenden, indem wir unsere Änderungen begehen. Holen Sie Commits Bindestrich M und für Nachrichtenbericht erstellt Räume Kontext. Okay, wir sehen uns in der nächsten. 117. Chat - Räume zeigen und sie als Links (Teil 3) verwenden: Hey, da. In diesem Video werden wir Chatrooms anzeigen, die wir in der Datenbank speichern, indem wir das Markup und den Kontext verwenden, den wir in den vorherigen Videos erstellt haben. Lass uns gehen, öffnen wir unseren Code. Und hier lassen Sie uns Chatraum Liste Komponente öffnen. Hier konsumieren die Menschen unseren Kontext. Und wieder wie zuvor, anstatt Cues-Kontext zu verwenden und dann den Kontext durch Importieren der Datei zu spezifizieren, werden wir einen Helfer-Haken in Räumen, Kontakten erstellen . Lassen Sie uns exportieren. Const. Wird es benennen. Verwenden Sie Räume, und es wird eine Funktion sein, die uns den Wert der Kontakte zurückgibt. Also lasst uns setzen, um Kontext zu verwenden und Räume zu beruhigen Kontext. Auf diese Weise vermeiden wir den Aufruf von Cues Kontext mit Räumen, Kontext jedes Mal, aber Räume verwenden. In Ordnung, also in zerschmetternden Listenkomponenten. Lassen Sie uns diesen Gebrauch Räume Haken nennen und jetzt erhalten wir den Kontextwert. Nun ist die Sache, dass diese Räume zu der Zeit null sein könnten, wenn wir versuchen, darauf zuzugreifen, weil unser Anfangszustand langweilig ist und nur wenn die Komponente eingehängt wird, erhalten wir die tatsächlichen Daten. Also müssen wir bedingten Lauf setzen, trinken und es hier drinnen überprüfen. Genug. Lassen Sie uns sagen, wenn wir keine Zimmer haben. Dann zeigen wir die Lauder-Komponente, die aus unserem Anzug kommt. Es wird zentriert sein, und es wird zentriert sein. Vertical E. Außerdem wird es Inhalt haben, was heißt, laden und es wird eine niedrige Geschwindigkeit haben. In Ordnung. Und lassen Sie uns auch Größe auf mittlere Größe angeben. Alles klar, Zitat. Nun lassen Sie uns das zweite bedingte Rendering anzeigen, um tatsächlich Daten anzuzeigen, die wir jedes Array-Element abbilden werden, das sind Räume, die wir mit Transformation transformieren, um mit I d zu einem j 6-Element zu gelangen. Also lassen Sie uns fragen, ob wir Zimmer und Zimmer dot Land ist größer als Null Onley. Dann rufen wir Raum an, Startkarte drinnen, wir haben wenig meinen Tim und wir haben eine Karte. Dieses Zimmer verführe ich, Artikel Komponente so zu lieben. Und vergessen Sie nicht, wenn wir diese Punktkarte verwendet haben, müssen wir die Schlüsselstütze angeben. Also lasst uns Raum dunkel machen. Und dann werden wir das ganze Raumobjekt als Zimmer übergeben, Eigentum an Zimmergegenstand wie dieses. Und dann werden wir das ganze Raumobjekt als Zimmer übergeben, In Ordnung. Sieht gut aus. Jetzt öffnen wir den Raumpunkt hier, werden wir Chur oder Eigentum zerstören, und innerhalb der Komponente werden wir wieder unser Gleichgewicht bekommen, indem wir dieses Mal das Raumobjekt strukturieren. So werden wir an erstellt haben und auch wir werden Raumnamen haben. Also statt dieser statischen besteuert, werden wir Raumnamen anzeigen, die wir D Struktur und auch vor vier Mal Komponente. Wenn wir keine Nachrichten haben, werden wir die Zeit anzeigen, wenn dieser Raum erstellt wurde. Also lassen Sie uns einfach passieren Neues Datum überhaupt erstellt, Lassen Sie uns speichern und werfen Sie einen Blick. Perfekt. Jetzt können wir sehen, dass Zimmer vor einem Tag erstellt wurde und Zimmername ist Hallo, Vielleicht wollen wir versuchen, ein weiteres Zimmer zu schaffen. Also lasst uns auf unser Moto klicken. Lassen Sie uns passieren, wenn ich Roll Name und was auch immer Bericht für die Beschreibung kannte. Wenn Sie darauf klicken, können wir sehen, dass die Daten in Echtzeit aktualisiert werden, so dass alles perfekt funktioniert. jedoch Ich möchte diese Komponentejedochauch in einen Link verwandeln. Also, wenn wir darauf klicken, gehen wir tatsächlich zur Chat-Seite. In Ordnung, also können wir zurück zum Code navigieren und gehen wir hier zur Chat-Room-Liste für diesen Schnupftabak-Artikel. Zuerst. Denken Sie, ich möchte das tun, ich möchte die Komponentenklasse angeben, damit es dieses genug Element mit diesem bereitgestellten Element für eine kompetente Klasse rendert . Es wird verknüpft Komponente, die von Reaktor Router stumm für diese Link-Komponente kommt , werden wir seine Eigenschaft zu befrieden, was auch ist. Also lasst uns zwei setzen. Und lassen Sie uns String-Interpolation verwenden, um anzugeben, welchen Pfad es geben wird, wenn wir darauf klicken. Also wird es Chats Schrägstrich Raum I d. Also lassen Sie uns String contar Population öffnen und lassen Sie uns Raum Idee setzen. Alles klar, cool. Schauen wir es uns an. Jetzt. Wenn ich darauf klicke, können Sie sehen, dass sich der Ural ändert und wir tatsächlich die Funktionalität haben. Aber ich möchte diesen Artikel auch aktiv machen, wenn wir den richtigen Pfad haben, der dem Link entspricht . Also, was wir nach wie vor mit der Abendkasse tun müssen, müssen wir unseren aktuellen Standort bekommen. Also lassen Sie uns verwenden Location Hook, der von React Router Down-Paket kommt. Jetzt für diesen Schnupftabak, wir eine weitere Eigenschaft übergeben, die aktiv Schlüssel sein wird, so dass der aktive Schlüssel Ort sein wird, nicht Pfadname. Dann müssen wir beruhigen oder, sagen wir, jeden Liebesgegenstand mit seiner Strömung verbinden. Lasst uns einen Schlüssel. Dafür müssen wir eine weitere Eigenschaft übergeben, die Ereignisschlüssel sein wird. Und es muss dem aktiven Schlüssel entsprechen, der Position Punkt Pfadname ist. Also wird es Schrägstrich Chats sein, Schrägstrich Raum I d. Also für Ereignisschlüssel, werden wir genau das gleiche wie für Eigenschaft angeben. Und jetzt wird es funktionieren. Schauen wir es uns an. Und gerade jetzt, wenn unser Standort übereinstimmt, haben wir die coole Animation und wir haben den aktiven Schlüssel. So funktioniert es perfekt. Aber ich möchte eins ändern. Denken Sie anstelle von Chats, ich möchte einfach so chatten. In Ordnung, schauen wir uns noch einmal an. Wenn ich zur Chat-Seite wechseln, habe ich dieses Element aktiv. In Ordnung. Gut. Das ist es also. Lassen Sie uns unser Video beenden. Lassen Sie uns alles in den Bühnenzustand versetzen, und dann rufen wir uns an, erhalten Sie Commit mit den angezeigten Chatrooms. Alles klar, cool. Das ist es für dieses Video. nächste Mal werden wir unseren richtigen Teil von der Website zu bauen und wir werden anfangen, Chat-Fenster zu bauen. Wir sehen uns dort 118. Erstellen von Nested Layout für die Homepage: Hey, In diesem Video werden wir Lee unsere für die Homepage erstellen. Also für jetzt haben wir bereits den linken Teil gebaut, welche eine Sidebar? Moment werden wir unseren richtigen Teil definieren, und wir werden sehen, wie sie ein reaktionsfähiges Let's Go spielen werden. Also lasst uns zu Hause togs Datei öffnen. Und hier werden wir ein Nest haben, eine Dürre. Also, wenn wir auf einen Chatraum klicken, können wir sehen, dass wir zu Chat-Schrägstrich Raum i d gehen. Dafür müssen wir eine säurevolle heraus erstellen, weil wir es auf der Homepage zeigen werden. Also, was ich vorgeschlagen habe, dio hier statt nur eine Datei direkt zu verwenden, lassen Sie uns erstellen, um nicht den Ordner zu Hause. Und hier werden wir alle Nestor Dürren setzen und die DGS wird in Index-Togs sein . Also lassen Sie uns einen neuen Ordner zu Hause erstellen, in dem wir nach Hause setzen, als wir ihn in Index Punkt gs umbenennen werden . Und hier ist unser Nest die Dürre wird Chat-Seite sein. Also lasst uns eine neue Datei erstellen, die wir Chat Doggy s nennen werden , und im Moment wird sie leer sein. Solicititous Port. Hallo? Ordnung, also innerhalb dieses Index Wenn wir es speichern, lassen Sie uns aktualisieren Das Verzeichnis kann nicht geöffnet werden. In Ordnung, vielleicht lasst uns die App neu starten und es wird funktionieren. Lassen Sie mich erfrischen. Alles klar, jetzt scheint es gut zu sein. Gut. Lasst uns weitermachen. Also wird unser erster Schritt definiert werden. Ah, wo? Nestor Dürre. Also hier, neben dieser Spalte, lassen Sie uns switch-Anweisung definieren und hier werden wir die Chat-Route und die Sidebar gießen Es wird beibehalten, weil es unser Layout ist. Also in diesem, was wir ausgießen und weil unsere Homepage bereits privat ist, brauchen wir keine Nest-Dürren zu gießen. Auch private Routen. Wir können sie als öffentlich benutzen, weil unsere Eltern privat sind. Das bedeutet, dass diese bereits geschützt sind. So wird es genau Route sein und Pfad wird Schrägstrich Tschad Schrägstrich Chat I d, um dem Gitter zu folgen. Wir müssen hier auch eine Säule setzen. Also lassen Sie uns Spalte setzen und innen werden wir Chat gießen und lassen Sie uns auch aus diesem Ordner importiert . Also lassen Sie mich den Chat angeben und wir werden Chat benutzen. Alles klar, jetzt sieht es gut aus. Lassen Sie uns definieren, wie Maney Spalten die Chat-Seite nehmen wird. Auf kleinen Geräten dauert es also alle 24 Spalten und auf mittleren Geräten. Wir werden den Rest abnehmen, damit es 16 sein wird und dann wird Klasse Name auch eine Kirche 100 sein. Jetzt schauen wir uns mal an und schauen wir mal. In Ordnung, haben wir Hallo, lassen Sie uns untersuchen und versuchen, Eis zu rece. In Ordnung, also sehen wir, dass, wenn wir auf kleinen Geräten sind, wir das haben, sagen wir, von oben nach unten, Lee raus. Das ist nicht das, was wir wollen. Wir wollen dieses Hallo auf kleinen Geräten ausblenden und weil wir das nicht nur verstecken müssen, wollen wir auch sicherstellen, dass wir, wenn wir in den Chatraum gehen, die Navigationsleiste nicht sehen. Die Seitenleiste. Deshalb müssen wir eine Art von ah, sagen wir, komplizierten Zustand. Also zuerst müssen wir unseren Bruchpunkt definieren, wenn wir auf dem Desktop sind, und das ist, wenn wir 992 Pixel haben. Also zuerst lassen Sie uns definieren ist Desktop, und es wird das Ergebnis aus Verwendung Media-Abfragehook sein, die wir früher definiert haben. Und hier werden wir fragen, ob Männer mit IHS 992 Pixeln, richtig? Also in diesem Fall werden wir Desktop haben. Außerdem müssen wir unsere zweite Bedingung nehmen, wenn wir genau auf der Startseite sind, damit wir Sidebar auf kleinen Geräten anzeigen können , nicht auf der Chat-Seite, so dass sie ausgeblendet wird. Also lassen Sie uns definieren, ist genau so. Lassen Sie uns es von der Verwendung zerstören, nicht verwenden. Media Query verwendet Route viel. Es ist ein weiterer Haken, der vom React-Router kommt, das gleiche wie Verwendungsort. Aber dieser Koch gibt uns, sagen wir, denkt im Zusammenhang mit unserer aktuellen Route und Dürre Spiel. Also eine dieser Requisiten ist genau und es wird sagen, ob wir derzeit auf dieser definierten Route sind , die Homepage ist. Also, wann immer wir auf nur Schrägstrich wird es uns geben ist genau gleich der Wahrheit. In Ordnung, also lassen Sie uns jetzt unseren Zustand definieren. Also lassen Sie uns schlecht Sidebar rendern und wir werden fragen, ob es Desktop ist, wenn es genau auf Lee übergeben wird, dann werden wir in der Lage sein, Sidebar zu rendern. Also, jetzt hier, lassen Sie uns die nächste Logik gießen. Also, wenn wir Sidebar rendern können, dann werden wir diese Spalte setzen und jetzt müssen wir auch definieren, Nehmen wir an, eine vier vier Stunden oder wenn jemand öffnet eine kaputte Chat-Seite, wir können es leer leben und es wird in Ordnung sein. Aber machen wir es schick und ziehen wir hier und hier rüber. Wir werden fragen, ob es nur Desktop ist. Dann wollen wir Spalte zeigen, und es wird,denke ich, die gleiche Lee aus wie hier haben denke ich, . Also lassen Sie es uns einfach kopieren. Und drinnen ziehen wir es. Nehmen wir an, nur Text, der sagt Bitte wählen Sie Chat und Klassenname wird besteuert werden Mitte und Rand oben Fage Rechte. Jetzt schauen wir uns mal an. Also, wenn jetzt sind wir auf Schrägschatten weniger Raum I d. Wir können nur Geschwätz auf Seite sehen. Wenn ich dies entferne und zur Startseite navigiere, kann ich nur Seitenleiste sehen, so dass es gut aussieht. Wenn ich die Größe ändere, kann ich beide sehen, damit ich meinen Chatraum sehen kann, aber stattdessen aus dem eigentlichen Chat. Wann immer es nicht ausgewählt ist, kann ich sehen, Polizei Auswahl auf voller Rücken für heraus geschossen, so funktioniert es wie 404 und wenn ich einen der Chats auswähle, kann ich das eigentliche Chat-Fenster sehen. Ich schätze, das ist es für dieses Video. Nächstes Mal werden wir weitermachen. Aber jetzt lassen Sie uns einfach unsere Änderungen begehen. Lassen Sie uns sagen, Holen Sie sich alles. Holen Sie sich Commit und lassen Sie uns sagen, dass wir unsere für Homepage erstellt und Shat-Seite für rechts erstellt haben. Ehrfürchtig. Wir sehen uns im nächsten. 119. Layout/Komponente: Hey da, in diesem Video, werden wir Lee für Chattering Seite erstellen, die wir auf der rechten Seite sehen können statt dieser . Hallo? Lasst uns gehen. Gehen wir zurück zum Dekodieren. Und hier unter Komponenten-Ordner, lassen Sie uns grüßen und Ihren Ordner und dass wir Shatt Fenster innerhalb nennen. Wir werden drei neue weitere Ordner erstellen und jeder wird jeden Teil dieser Seite darstellen . Also werden wir erste Folder wird Nachrichten sein. Dann gießen wir oben und unten so, einen inneren Blasenplatz, alle entsprechenden Komponenten. Also im Inneren unten, lassen Sie uns Index Togs setzen und es wird für jetzt leer sein, als das gleiche, was wir für den Rest tun werden. Also hier werden wir Index-Togs setzen, aber ein Name, der es meldet, dass wir Nachrichten hineinlegen werden, Speichern wir es und schließen. Und unsere neueste Komponente wird dieser Vortrag sein. Lassen Sie uns also einen weiteren Index-Togs erstellen. Und lassen Sie uns die Spitze mit der obersten Text-Einsicht setzen. In Ordnung, speichern wir es und navigieren wir zur Chat-Seite. Also hier, in diesem Def, lassen Sie uns ein anderes def gießen. Das wird ein Rapper für Chat Top sein, und wir werden es nur in einer Sekunde importieren. Dann gießen wir noch einen Dave ein. Und im Inneren werden wir Nachrichten und dasselbe setzen. Wir werden für Tschad unten, alle Rechte und für jeden dieser Daves beantragen . Wenn wir öffnen Haupttochter ein CSS. Hier haben wir Klassen Diagramm oben, Tschad unten und Schuss Mitte. Also lassen Sie uns sie für Top-Level Porter Chat Top vier Nachrichten verwenden. Wir werden einen Kumpel in die Mitte setzen und für aber, ähm, wir werden den Klassennamen Chad unten setzen. Alles klar, jetzt importieren wir diese Komponenten. Also zuerst, lasst uns Chat importieren. Tell up von Lassen Sie uns navigieren zwei Komponenten, Chat-Fenster und oben. Dann werde ich drei Mal kopieren. Dann werde ich unten und Nachrichten verwenden, und dann werde ich sie durch den Chat unten und Nachrichten ersetzen. Alles klar, sieht gut aus. Werfen wir einen Blick. Also, jetzt, wenn mit einem frischen wir sehen können, haben wir Top-Nachrichten und unten und lassen Sie uns diese Verpackung entfernen, def. Und schauen wir uns noch einmal an. Jetzt haben wir Top-Nachrichten und unten ganz unten. Alles klar, gut. Nun lassen Sie uns unsere anfängliche Logik für Chatroom Seite definieren. Also zunächst einmal, lasst uns diese Chad I D. Von unseren Perimetern greifen , wie Sie innerhalb der Homepage mit befriedigt es als nur Chat I d erinnern. Also lasst uns von Verwendung Programme Haken greifen, die wir mit React Rotor-Paket verwenden können. Und dann können wir alle unsere Zimmer, die wir im Kontext haben, wie Sie sich erinnern. Also lassen Sie uns verwenden Räume Haken, die wir früher erstellt haben. Und jetzt lassen Sie uns tatsächlich unsere aktuellen Raumdaten abrufen. Also, was müssen wir tun? Zunächst einmal müssen wir gegen dieses Zimmer überprüfen, weil es standardmäßig nicht sein kann, wie Sie sich erinnern. Also lasst uns fragen, ob Zimmer nicht existieren oder ob dieser Wert jetzt ist, dann werden wir die Rechtsordnung Komponente gießen, die aus unserem Anzug kommt. Und wieder wird es vertikal wie zuvor zentriert sein. Es wird mittlere Größe haben. Es wird Inhalt geladen und die Geschwindigkeit wird langsam sein. In Ordnung. Unser nächster Schritt ist, unser aktuelles Zimmer von diesem Zimmer zu bekommen, ist ein Preis. Also lassen Sie uns Port const Aktuelle Zimmer wird Zimmer dot finden wir Zimmer Artikel bekommen. Dann werden wir von i d Equals Chat fragen. Ich d. in Ordnung. Und dann am Ende, wenn wir kein aktuelles Zimmer haben. Also, wenn wir ein zufällig Ihr l setzen, das nicht innerhalb dieses Raums Array existiert, dann werden wir H sechs Element mit dem Klassennamen, Textmitte und Rand oben Seite zurückgeben . Das wird sagen, Tschad, ich habe nicht gefunden. In Ordnung. Sieht gut aus. Lasst uns das entfernen, Lauder. Lassen Sie uns diesen Import nach oben verschieben. Lasst uns retten. Werfen wir einen Blick. So verkohlt, Dieser nicht gefunden. Alles klar, ich bin hier gelaufen. Lassen Sie mich die Negation davor stellen. Also, jetzt wird es funktionieren. In Ordnung, also haben wir Nachrichten unten gesprochen. Und wenn wir einen Zufallsschrumpfen hier drüben setzen, aber wir werden erschossen, nicht gefunden. Ok, perfekt. Also das ist es für dieses Video im nächsten Video, Ich möchte über Kontextprobleme sprechen und warum es eine schlechte Idee ist, direkt nutzen Räume, Haken. Lassen Sie uns unsere Änderungen begehen und das beenden. Also lassen Sie uns bei allem, was Sie System bekommen, dass wir unsere Nachricht begehen und wir werden sagen erstellt Klay, unsere vier verkohlte Seite. Alles klar, gut. Wir sehen uns im nächsten. 120. Problem Context und eine Potential Lösung: hallo Kontext. AP ist erstaunlich, nicht wahr? Aber immer mit jedem guten Werkzeug gibt es auch eine negative Seite. Das Problem mit dem Kontext ist, dass wir einen Teil seines Wertes auswählen können. Wir können einen Selektor aus diesem Grund nicht definieren. Immer wenn der Kontext mit dem Use contacts Hook verbraucht wird, selbst wenn der Wert nicht verwendet wird und er sich ändert, wird die Komponente gerendert. Stellen Sie sich den Kontext vor, der weitergibt und Objekt mit der nächsten Struktur. In einer Komponente, in der Titel angezeigt wird, möchten wir nur die Titelsteuer erhalten, richtig, damit wir Ihren Titeltext vom Kontextwert zerstören können und es scheint in Ordnung. jedoch Für den Kontext spielt esjedochkeine Rolle, ob es sich um Destruktor handelt oder Sie versuchen, Elemente teilweise auszuwählen. Es gibt Ihnen immer den gesamten Kontextwert von nun an, da Titelkomponente den Wert erhält, wenn sich irgendetwas in unserem Objekt ändert. Zum Beispiel, Suche setzen, wird die Titelkomponente zu rendern, und das ist schlecht. Um dies zu lösen, können wir den Kontext tatsächlich in zwei separate Kontextanbieter einen pro Objektschlüssel aufteilen. Auf diese Weise teilen wir Verantwortlichkeiten und machen nicht ausgelöst werden, weil wir nur das verbrauchen was wir innerhalb einer Provider-Komponente benötigen, waren nicht auf Sie beschränkt. Nur ein Kontext kann mehrere Kontexte unter einem Provider kombinieren. Es ist sehr nützlich, wenn wir die Kontakte passieren, zum Beispiel das Ergebnis des Nutzungsstatus, des Zustands und seiner Update-Funktion für sie. Das sind zwei separate Kontexte, die unter einem Provider gruppiert sind. Also, jetzt, wenn wir innerhalb einer Komponente konsumieren Kontext, der die Update-Funktionskomponente bereitstellt, wird nicht gerendert werden. Wenn sich dieser Zustand ändert, wird er nur gerendert, wenn der tatsächliche Wert aus konsumierten Kontext geändert wird, was die Update-Funktion ist. In diesem Fall funktioniert dies in den meisten Fällen. jedoch Situationen, Es gibtjedoch Situationen,in denen wir ein großes Objekt durch den Kontext übergeben möchten, und das Erstellen eines neuen Kontexts für jeden Schlüssel wird ein Overkill sein. Für diese Situationen. Es gibt einen Paketkontextselektor, der uns Funktionalität bietet, um den Wert aus dem Kontext teilweise auszuwählen . Es kommt mit den wenigen Einschränkungen, aber wenn es mit Bedacht verwendet wird, können Renderer überhaupt vermieden werden. Nur um darauf hinzuweisen, dass all das rücksichtsvoll ist, wenn man Creed Enten anstelle von Kontext ein P I verwendet. Für das Staatsmanagement jedoch hat Redox jedocheine Lernkurve und bringt mehr Komplexität, abhängig von der -App. Du brauchst es wahrscheinlich nicht. Deshalb verwenden wir Kontext. A p i im nächsten Video werden wir verwenden Kontext-Selektor installieren und wir werden sehen, wie es uns helfen kann, Sie zu sehen, dass 121. Context in Praxis – Erstellung des aktuellen Room: hi in diesem Medium wird Kontext für den aktuell geöffneten Chatraum mit Cues Context Lecter Paket erstellen . Bevor wir beginnen, lasst uns untersuchen, wie alles gehandhabt wird. Im Moment gibt es Räume Kontext, der die gesamte Homepage raubt. Kontextdaten sind Chatroom Liste mit Echtzeit-Abonnement. Es bedeutet, dass, wenn sich irgendetwas in einem außerhalb des Raums Kontext ändert, Wert innerhalb der Schatten-GS-Räume aktualisiert wird. Kontext wird verbraucht. Jede Aktualisierung eines Zimmers wird also zu einer Kapitulation führen. Zwei aktuell geöffnete Chat-Seite, auch wenn das AB-Datum nicht damit zusammenhängt. Daher innerhalb von Chad Ogea s einen werden wir innerhalb von Chad Ogea s einenneuen Kontext zur Verfügung stellen, den wir den aktuellen Raumkontext benennen und wir werden derzeit offene Raumdaten für diese Kontexte übergeben . Wir verwenden Kontextselektor. Stellen Sie sich eine Situation vor, wenn der Name des aktuell geöffneten Raums aktualisiert wird. Es wird eine Übergabe für derzeit offenen Raum schaffen und Werte, die wir an den aktuellen Raumkontext übergeben werden , werden ebenfalls vermieden. Es gibt eine Komponente, die den aktuellen Raumkontext verbraucht und nur die Beschreibung und nicht den Namen anzeigt , da diese Komponente nicht gerendert wird. Änderungen wirken sich auf Lee auf die Komponente aus, die den Namen anzeigt. Okay, lassen Sie uns alles in die Praxis umsetzen. Ich habe bereits offizielle fröhliche Webseite für die Verwendung des Kontext-Selektor-Pakets geöffnet und wenn ich vom Installationsteil nach unten scrollen, kann ich sehen, dass ich diesen Befehl kopieren muss. Also lasst es uns tun. Gehen wir zurück zum Code und innerhalb des integrierten Terminals werde ich es ausführen und warten, bis es installiert ist. Perfektionieren Sie die Pakete dort. Lassen Sie uns nun die App ausführen und gehen Sie nicht zurück zur Dokumentation. Aus dem Verwendungsteil können wir sehen, dass es sich tatsächlich nicht von der Art unterscheidet, wie wir normalen Erstellen Kontext verwenden. So können wir zurück zum Code navigieren. Und hier in ihrem Kontext, Ordner weniger große neue Datei, die wir aktuellen Raumkontext nennen. Zwielig. Ja, hier. Wir werden aktuellen Raumkontext schaffen und wir werden erstellen Kontext verwenden, den, der von nicht von reagieren kommt. Lassen Sie uns Teoh ein sechs mo Juwel und von der Verwendung Kontext-Selektor umgewandelt. Alles klar , der nächste Teil wird sein, die Provider-Komponente zu erstellen. Also lassen Sie uns setzen Export const aktuellen Zimmeranbieter, so dass es Kinder erhalten und dann auch wird es Daten erhalten, so dass es einige Daten tragen wird, die wir an diesen Anbieter übergeben werden. Also hier werden wir Strom vom Context Dar Provider zurückgeben. Und wir werden arme Kinder dort und um Wert. Wir werden Daten pausieren, also Provider-Komponente wird wie ein Mittelmann sein. In Ordnung, Also, wenn wir unsere Reaktion haben, muss Umfang beginnen. Also lassen Sie uns importieren reagieren von reagieren oder ich gehe. Lassen Sie uns nun sehen, wie können wir einige Daten von hier auswählen? Also müssen wir Kontext verwenden, Selektor. Dann müssen wir Kontext bereitstellen, den wir konsumieren wollen. Und dann liefern wir den Colback, der unseren Wert weckt, wo Argument unser aktueller Zustand ist . Also lassen Sie uns von hier ein wenig nach unten navigieren. Wir können sehen, dass wir es tatsächlich so verwenden können. Also lassen Sie uns das kopieren und es hier in den aktuellen Raumkontext stellen. Also, was wir tun werden, werden wir es in unseren eigenen benutzerdefinierten Haken verwandeln. Lassen Sie uns den Kontextselektor aus dem Paket selbst importieren, und dann werden wir es in einen Haken verwandeln. Also lassen Sie es in Funktion konvertieren. Und anstelle des Vornamens verwenden wir den aktuellen Raum und lassen uns ihn auch exportieren. Und für diese Verwendung aktuellen Raum, wir werden nur den Selektor übergeben. Also lassen Sie uns den Selektor hier übergeben. Und anstelle des Personenkontextes werden wir den aktuellen Raumkontext gießen und für den Selektor werden wir Selektor zur Verfügung stellen. Wir sind schon hier. Gehen wir nicht zurück zu unserer Chat-Seite. Und hier, anstelle dieser leeren Klammern anstelle von Reaktionsfragment, lassen Sie uns diesen Provider verwenden. Also werden wir den aktuellen Zimmeranbieter stellen, und wir müssen Daten weitergeben, die wir in diesen Kontext stellen werden. Also lassen Sie uns Daten setzen Und für Daten, werden wir ein Objekt erstellen, das wir nennen werden, Sagen wir aktuelle Raumdaten. Also hier werden wir dieses Objekt erstellen, und hier werden wir die nächsten Werte übergeben. Aus unserem jetzigen Raum werden wir den Namen und die Beschreibung hervorheben, indem wir die Werte zerstören. Und dann werden wir den Namen und die Beschreibung an aktuelle von Daten übergeben, die an den D-Kontext übergeben werden . Also, wenn wir es speichern und wenn wir jetzt alles hier speichern, wenn wir zu unserer App zurückkehren, wird nichts mehr geändert. jedoch sagen, Wenn wirjedoch sagen,dass wir hier oben zum Chat gehen, verwenden wir den aktuellen Raumhaken, den wir erstellt haben. Dann wählen wir vielleicht einen Namen aus und für den Selektor werden wir State übergeben und vom Staat werden wir den Namen auswählen oder vielleicht nicht, Staat. Lassen Sie uns einfach Neid um Wert so setzen. Und jetzt anstelle von oben, lassen Sie uns diesen Namen aus dem Kontext anzeigen. Alles klar, wenn ich sage, dass, wenn ich mich erneuere, ich sehe Hallo den Raumnamen, den wir an die Kontakte weitergegeben haben, und wenn ich umtausche, wird es geändert. Das ist es also. So können wir tatsächlich Spitzenwerte aus dem Kontext. Und es ist auch sehr wichtig zu beachten, dass diese Werte, die wir aus dem Zustand auswählen, den wir aus dem Kontext auswählen, es wichtig ist zu verstehen, dass wir Objekte auswählen können, weil Objekte durch Referenzen verglichen werden. Und wenn wir die Dokumentation für dieses Paket geöffnet haben, wenn wir nach unten zu Einschränkungen scrollen, können wir sehen, dass Provider-Trigger Onley rendert, wenn der Kontextwert bevorzugt geändert wird , so dass Objekte bevorzugt geändert. Also müssen wir vorsichtig damit sein. Wir müssen nur primitive Typen auswählen, deren Objekt nicht ist. Und auch, wenn wir nach Einschränkungen schauen, müssen wir unsere Komponente umwickeln reagieren, Mama. Also lasst uns auch Säugetier aus reagieren und lasst es uns so umwickeln. Also jetzt ist unser Wert auswendig gelernt. Und wenn sich etwas für diesen Strom aus Daten ändert, lassen Sie uns eine Beschreibung. Und in dieser Top-Komponente verbrauchen wir nur Namen. Diese Komponente wird nicht aktualisiert, wenn die Beschreibung geändert wird. Das ist es also. Eine Sache, die hier zu verweisen ist, dass, wie ich bereits erwähnt habe, wenn wir Räume in dieser Komponente konsumieren, und wenn sich etwas ändert, die gesamte Komponente gerendert wird. Also einschließlich dieser Chat Top-Nachrichten und Chat unten. Aber weil wir hier Säugetier verwenden, lernt Teoh unsere Komponenten ein. Wir haben den Update-Baum erheblich reduziert, so dass nur diese Wrapping-Dips bei jeder Änderung aktualisiert werden . zugrunde liegenden Komponenten Chat-Up-Nachrichten im Chat unten werden nicht gerendert. Das ist es also. Das ist die Höhle. Es ist aus dem Kontext. AP Ich Lassen Sie uns dieses Video beenden. Also lassen Sie uns alles festschreiben und legen Sie die nächste Nachricht erstellt aktuellen Raumkontext mit Verwendung Kontextselektor. Alles klar, wir sehen uns in der nächsten 122. Erstes Chat – Oberer Teil: Hallo. In diesem Video werden wir eine Bau-Chattel Seite starten. Gehen wir, Lassen Sie uns zurück zum Code navigieren und öffnen Sie Index-Togs, die im oberen Teil hier darstellt . Anstelle dieses Namens werden wir ein anderes def gießen. Das wird noch ein Oberteil sein. Also für diesen schwierigen Klassennamen auf Display flex beenden, rechtfertigen Inhalt zwischen den Zeilenartikeln Mitte wir werden das Alter vier Tack ziehen und innerhalb der Rebellen-Anzeige Ah, waren Chat-Namen. Also hier von einem Vokalnamen und Klassennamen für diese Pfanne wird Text verschwinden und auch wir werden setzen und ich kann hier vor diesem Text, wenn wir auf mobilen Geräten sind, so können wir nicht zurück auf die Homepage zu bekommen. Also hier, lasst uns an Bord und ich kann und kompetente Klasse wird ein Link sein, der von React Router stumm kommt , als der Eiken selbst Arrow Kreis sein wird. linke Größe wird doppelt X sein und weil es eine Link-Komponente ist, müssen wir auch Eigentum zur Verfügung stellen, die zur Homepage führen wird, oder? Und auch wir werden bedingten Klassennamen für diesen Aiken gießen. Also werden wir fragen, ob wir auf mobilen Geräten sind. Dann werden wir einen Klassennamen setzen. Und wenn wir auf dem Desktop sind, werden wir andere Klassennamen dafür setzen. Wir werden den Media-Abfrage-Haken verwenden, den wir früher verwenden, und wir werden den Bullen erstellen, der mobil ist. Und dann werden wir Media Query von benutzerdefinierten Hooks und innerhalb eines Bubble Port Markierungen mit off 992 Pixel verwenden . Alles klar, wenn wir auf mobilen Geräten sind, ziehen wir das Display in Linienblock, als Batting wird null Marge rechts zu Text Blue und Lincoln gestylt, um unser Link-Element vollständig auf Stil zu machen. Und wenn wir auf Desktop-Geräten sind, dann zeigen wir diese Aiken einfach nicht an. Also lasst uns sparen und inspizieren. Was haben wir? Also, jetzt haben wir den Namen des Zimmers. Wenn ich das Fenster inspiziere und die Größe ändere, kann ich diese Schaltfläche hier sehen. Wenn ich darauf klicke, gehe ich zurück zur Startseite, um Chathams zu sehen. Na gut, sieht gut aus. Lasst uns weitermachen. Also, hier, neben diesem h vier, lassen Sie uns Schaltfläche Symbolleiste setzen, die von unserem Anzug kommt, und das war unser zu tun Also auch, lassen Sie uns Klassennamen aus Ws No rap setzen. Alles klar, vereinheitlichte ein frisches. Ordnung, InOrdnung, also ist das neben diesem Tag zu tun, wenn wir noch einen Def setzen wollen und es wird unser unterster Teil sein . Also für diesen unteren Teil, werden wir setzen, anzeigen, flex, rechtfertigen Inhalt zwischen und richten Elemente zentrieren. Wir werden als lustiges Element gießen, das auch unser zu tun sein wird. Und auch, wir werden einen Knopf hier drüben setzen, also wenn wir darauf klicken, öffnet sich ein Modellfenster und wir können die Raumbeschreibung sehen. Es wird also eine weitere Komponente sein, die wir erstellen werden und wir werden es Bräutigam Info, BT und Moto Dar g s in Ordnung nennen Info, . Denn jetzt wird es leer sein. Lasst es uns drinnen benutzen. Index-Togs hier. Wir werden von Info Bt und Moto gegossen, richtig? Lassen Sie uns sagen, mit und jetzt definieren wir unsere Komponente. Zunächst einmal werden wir hier auch unsere Zimmerbeschreibung und den Zimmernamen anzeigen. Also, dafür werden wir Kontext verwenden, Kurfürst. Also vor allem werden wir schlechte Beschreibung hier drüben, und es wird verwendet Auto und geworfen Haken werden. So bekommen wir unseren Wert und aus dem Wert wachsen wir Beschreibung. Und erinnerst du dich, dass ich dir gesagt habe, dass es wichtig ist, Objekte nicht auszuwählen, weil sie referenziell e verglichen werden Also bedeutet es, wenn wir mehrere Werte aus einem Objekt auswählen müssen , müssen wir sie separat auswählen. Sie werden also zu einem primitiven Wert, weil Beschreibung eine Zeichenfolge ist. Daher ist es ein primitiver Typ. Also müssen wir auch den Namen anzeigen. Also werden wir genau das Gleiche tun. Verwenden Sie den aktuellen Raum, und wir werden den Spitzen-Raumpunktnamen. Alles klar, klar, in unserem Markup gießen wir ein Knopfelement aus unserem Anzug hinein. Wir werden Rauminformationen gießen und Aussehen wird blink sein und Klasse Name wird klopfen auf X Zugang ist jetzt Null, weil wir ein Motil haben, werden wir wieder unseren eigenen benutzerdefinierten Haken verwenden , der sterblichen Zustand verwendet wird. Also lassen Sie mich es importieren. Und von diesem Haken, den wir greifen, ist offen, nah und offen. Nun, neben diesen Button-Elementen können wir uns eine moralische Komponente leisten, als für Show-Eigenschaft, die wir einstellen werden, ist offen für auf Höhe. Wir werden uns anziehen. Und in diesem Sterblichen, wie immer, werden wir sterbliche Dot Heather haben. Dann haben wir Körper und Fußzeile. Also lasst uns diese Werte ersetzen, Littlefoot sie. Okay, also für Model Heather, werden wir Modellpunkttitel gießen und für Titel, werden wir über diesen Raumnamen als für Fußzeile gießen. Wir gießen noch einen Knopf, der das Moto schließt. Also lasst uns Kleidung setzen, dann werden wir auf Click angeben wird Kleidung sein und es wird auch ein Block-Element sein, Ordnung? Und wir sind Leiche, die etwas Einfaches spezifizieren wird, was ein Sechs Tack sein wird. Und wir werden Beschreibung setzen und Klassenname wird Rand unten eins sein, dann wird die Beschreibung selbst gehen. Also lasst uns Beschreibung setzen. Und jetzt lasst uns speichern Und lasst uns dieses Dropping def entfernen und es durch den reakten Kontext ersetzen . Lassen Sie uns auch den Import nach oben verschieben. Und auch wir haben diesen offenen Handler nicht verwendet. Lass es uns tagelang setzen. Schaltfläche auf Klick wird geöffnet sein. Alles klar, lassen Sie es uns speichern und schauen wir uns mal an. Jetzt haben wir Zimmer Informationstaste, die wie ein Link aussieht. Und wenn wir darauf klicken, haben wir ein moralisches Fenster, das über Hallo sagt. Beschreibung Beschreibung. Hey, nah dran. Lassen Sie es uns noch einmal in Ihrem eigenen Namen testen. Wir haben diese seltsame Beschreibung und alles funktioniert gut. Das ist es also für dieses Video. Lassen Sie uns unsere Änderungen begehen. Lassen Sie die Leute auf alles bekommen kann, dann begehen. Nehmen wir an, begann zu bauen Chat Top Erstellt eine Raumbeschreibung. Modoff. Alles klar, Perfect. Wir sehen uns in der nächsten. 123. Denormalizing – Creating erstellen: Hallo. In diesem Video werden wir anfangen, verkohlten Boden zu erstellen. Gehen wir, bevor wir anfangen. Ich möchte erwähnen, dass im vorherigen Video, als wir anfingen, Chat Top zu erstellen, ich vergessen habe, ein paar Details zu erwähnen. Zuallererst müssen wir noch ein paar Klassennamen hinzufügen und es wird dieses Alter für Element sein. Also lassen Sie uns Klassennamen setzen und wir werden Text verschwinden lassen, um zu verhindern, dass Steuern überlaufen, wenn es zu lang ist. Und dann werden wir die Display-Flags hinzufügen und Items Center ausrichten, um sicherzustellen, dass, wenn wir auf mobilen Geräten sind, diese Aiken und Text vertikal zentriert, rechts und auch ein weiteres Detail. Wenn wir den Raum für Betty Inamoto öffnen, verwenden wir Kontextauswahl, Also, damit es funktioniert, müssen wir auch das Element um Säugetier reiben. Das haben wir vergessen zu dio-Dio. Also lassen Sie uns Memo hier unten und lassen Sie uns auch importiert von React Now verwenden Kontext. Der Selektor funktioniert wie erwartet. Na gut, gehen wir weiter und fangen wir mit Chad Bottom an. Lassen Sie uns Teoh Index Dodgy s innerhalb des unteren Ordners navigieren. Und hier lassen Sie uns unseren Markt so definieren, dass wir zuerst für die Gruppe einströmen und innerhalb dieser Eingabegruppe werden wir die tatsächliche Eingabe mit Platzhalter setzen, richtig? Und du sagst hier und drei Punkte am Ende. Neben diesem Import werden wir ein Buttonelement gießen. Also lassen Sie uns Import Gruppe Dar Schaltfläche definieren. Und dieser Knopf wird die Farbe blau und das Aussehen der Primary in dieser Scheunengruppe haben, werden wir gießen. Ich komme und ich kann wird geschickt werden. In Ordnung, sagen wir, warten wir und mal sehen, was haben wir? Also, jetzt haben wir diesen Import und wir haben den Boden. Wenn wir also auf diese Schaltfläche klicken, wird die Nachricht gesendet. Alles klar, jetzt definieren wir unsere Funktionalität. Also zuerst, wir brauchen Staat. Also lassen Sie uns Import erstellen und sagte in schlecht, und standardmäßig wird es auf einen leeren Shrink gesetzt werden. Dann müssen wir auf Change-Handler für das Änderungsereignis für unseren Import angeben. Und auch wir müssen unsere Input mit dem tatsächlichen Zustand assoziieren. Also lassen Sie uns Wert definieren. Es wird Importeur sein. Und für ein Änderungsereignis werden wir auf Importänderung angeben. Heller. Lassen Sie uns dies bei Importänderung definieren und wir können es im Voraus optimieren, wo sie Callback verwenden , weil wir Eingangszustand haben, der häufig ändert und bei Importänderung keine Abhängigkeit haben wird . Also dieses unveränderte Ereignis gibt uns Wert als erstes Argument und Ereignis. Also müssen wir den tatsächlichen Wert von hier erhalten, und dann werden wir sagen, Import mit Wert nennen . Und nur um zu erwähnen, dass, weil wir diese Eingabe, die aus unserer Anzug kommt , als Komponente verwenden , deshalb erhalten wir Wert als erstes Argument. In jedem anderen Fall erhalten wir nur das Ereignisobjekt. Jetzt müssen wir Funktionalität zu unserer Schaltfläche hinzufügen, um die Nachricht tatsächlich zu senden. Deshalb werden wir eine neue Funktion angeben, die wir auf Send Click benennen werden. Es wird unser Handler für auf Klick Ereignis auf dieser Schaltfläche sein. Also lassen Sie uns beruhigen. Also foran klicken, werden wir auf senden klicken und zuerst, hier werden wir eine einfache Überprüfung machen Wenn ich im Hafen waren. Wenn unsere Nachricht nicht leer ist, so werden wir den Import Punkt Trim gleich leere Nachricht angeben. Wenn es der Fall ist, dann wird es einfach die Dysfunktion beenden. Als nächstes müssen wir die Nachricht zusammenstellen. Und in Zukunft werden wir auch Nachrichten abgelegt haben. Dafür werden wir eine gemeinsame Funktion erstellen, die aufgerufen wird, um die Nachricht zu montieren, damit sie gemeinsame Eigenschaften an unsere Nachricht anfügt. Also hier oben, werden wir neue Funktion erstellen, die wir benennen, zusammenstellen, nachrichten, und als Argument wird es Benutzerprofil erhalten. Und lassen Sie uns sagen, Tschad, ich d ok, und dann wird es uns ein Objekt mit dem Raum i d, das überprüft werden wird, I d. Dann werden wir Autor Objekt haben und hier werden wir de normalisierte Daten, bevor wir fortfahren. Lassen Sie mich die Struktur erklären, die wir haben werden. Wenn wir also jetzt unsere Datenbank öffnen, haben wir Zimmer und Profile und unsere Daten sind jetzt flach und sehr einfach zu verwalten. Aber jetzt haben wir Zimmer und wir müssen Nachrichten erstellen. Wie können wir uns dem nähern? Wir können natürlich Nachrichten innerhalb dieses Objekts setzen, Jedoch, mit Echtzeitdaten basierend, weil wir begrenzte Anfragen sind, müssen wir mit Bedacht auf unsere Struktur entscheiden. Mit Echtzeit-Datenbank ist es wirklich wichtig, die Struktur so flach wie möglich zu halten. Es bedeutet, dass wir idealerweise kein verschachteltes Objekt erstellen möchten. Deshalb werden wir ein weiteres Mal sehen, Routenobjekt erstellen, das wir Nachrichten und Einblicke nennen werden. Wir werden unsere Nachrichtendaten setzen und dann darauf hinweisen, dass diese Nachricht zu diesem bestimmten Raum gehört . Wir werden den Raum in dieser Nachricht angeben. Und auch wir werden de Normized Data de Normizing bedeutet, dass wir unsere Daten kopieren und duplizieren . Dies soll verhindern, dass mehrere Abfragen auf unserer Datenbank ausgeführt werden, wenn wir etwas anzeigen müssen . Zum Beispiel Chat-Nachricht mit Chat-Nachricht. Wir möchten auch Benutzerprofilnamen, Avatar und andere Dinge anzeigen . Wenn wir also Nachricht anzeigen, wenn wir keine Daten duplizieren, müssen wir eine zweite Anfrage an unsere Datenbank senden und das tatsächliche Profilometer erhalten. Um zu verhindern, dass mehrere Anfragen ausgeführt werden, werden wir es duplizieren. Dies ist also in keiner SQL-Datenbank normal. Lass uns gehen. Also, um Nachricht für den Autor zusammenzustellen, werden wir Namen gießen, der den Namen profiliert wird, dann werden wir auch Ihre i d gießen , das Profil sein wird, das Ihr i d dann erstellt wird, wird Profil erstellt bei, und wir müssen auch bedingten Avatar gießen. Also, wenn Sie dort keinen Schiedsrichter haben, legen wir es nicht in dieses Objekt dafür. Wir werden drei Punkte einschenken. Dann werden wir ein schlechtes Profil auf Avatar, und wir werden fragen, ob Geschenk existiert. Dann gießen wir den Avatarschlüssel mit Profiltür-Avatar. Sonst werden wir ein leeres Objekt gießen. Wenn also Profil-Avatar existiert, werden wir dieses Objekt angeben. Und weil wir drei Punkte haben, können wir dieses Objekt nicht auf dieses globale Objekt verteilen. Auf diese Weise wird es diese Eigenschaft an dieses Objekt anhängen. Andernfalls werden wir das leere Objekt verbreiten, das nichts hinzufügt. Okay, als nächstes werden wir Ihren Autor hinzufügen, erstellt bei und hier werden wir Firebase angeben. Aber lasst uns in erster Linie importiert. Lassen Sie mich importieren Feuerbasis aus der Firebase-App, und es wird Firebase-Datenbankserverwert sein. Zeitstempel. In Ordnung, jetzt verwenden wir diese Nachricht zusammenstellen und lassen Sie es uns hier rüber bringen. Also werden wir eine neue verfügbare erstellen, die Nachrichtendaten benennen wird. Dann werden wir anrufen, eine Nachricht mit Profil und Chad I D zusammenstellen damit wir ein Profil aus unserem Kontext bekommen. Also lassen Sie uns schlechtes Profil von Verwendung Profil Hook, die wir aus Profilkontext haben, verwenden Sie Profil. Und auch, wir müssen Chat-Idee bekommen. Und wir können es mit der Hilfe von Paramus bekommen, die von React Router Jugendprogramme kommt . Alles klar, gut. Nun zu diesen Nachrichtendaten müssen wir den eigentlichen Nachrichtentext anhängen. Also hier, lassen Sie uns die Nachricht beruhigen. Datentext wird unser Input sein. In Ordnung. Und jetzt ist die Sache, dass wir eine atomare Operation durchführen müssen, um Daten an mehreren Stellen innerhalb der Datenbank mit Echtzeit-Datenbank zu aktualisieren . Es ist wirklich einfach zu tun, und das liebe ich wirklich. Warten Sie. Also, was werden wir tun? Wir werden eine neue Nachricht innerhalb Nachrichten Pfad erstellen. Und auch werden wir Zimmer aktualisieren. Und hier werden wir noch eine Requisite setzen, Gemüse-Name, letzte Nachricht. Dies ist, um die letzte Nachricht hier in dieser Chatraum-Liste anzuzeigen. Alles klar, was wir tun werden, werden wir ein neues Objekt erstellen. Es wird standardmäßig ein leeres Objekt sein, das Updates sein wird. Und die Logik wird die nächste in diesem Objekt modellieren wir unsere Aktualisierungsdaten innerhalb der Datenbank bezogen Lee auf die Route aus der Datenbank. Also werden wir den Update-Pass als Schlüssel haben. Und für diesen Schlüssel werden wir die tatsächlichen aktualisierten Daten haben, und dann werden wir diese Updates für die Route aus der Datenbank aufrufen, und es wird es als eine atomare Operation ausführen. Das gefällt mir wirklich. Also, was ich meine ist, dass wir zuerst eine neue Botschaft definieren müssen, die ich im Voraus habe. Also für das, lassen Sie uns neue variable Nachricht I d. hier erstellen . Wir werden Datenbank setzen. Dieses Mal wird es Datenbank sein, die von Let me wieder kommt, wie man es importiert, richtig? Es funktioniert nicht. Lass es uns manuell machen. Also werden wir Datenbank von MISC importieren. In Ordnung, gehen wir zurück zu Ordnern. Okay, noch eine Ebene. Sonstiges Firebase. Alles klar, Perfect. Also, Datenbank, dann müssen wir Verweise auf unsere Nachrichten angeben. Dann werden wir den Boden schieben, und dann werden wir auf diese Weise erhalten wir einen einzigartigen Schlüssel aus der riel Zeitdatenbank ohne das eigentliche Dokument zu erstellen. Okay, Jetzt müssen wir dieses Aktualisierungsobjekt aktualisieren. Also lassen Sie uns Updates setzen und unsere erste Eigenschaft wird Nachrichten sein. Dann werden wir die Nachricht angeben, die ich hier drüben habe. Und für diese Nachrichtwerden wir Nachrichtendaten beruhigen, werden als zweites Objekt Räume sein wird, Slash Chat I D und Schrägstrich letzte Nachricht und für die letzte Nachricht, werden wir alle unsere Nachrichtendaten zu beruhigen und auch oben drauf, werden wir Nachricht i d anhängen also Nachricht I d wird Nachricht sein, die ich d mag. Jetzt müssen wir die eigentliche Datenbank aktualisieren. Also hier, wir werden versuchen, fangen Block, fangen Block, und hier werden wir eine Wartezeit rufen und lasst uns Dysfunktion Teoh eine Senkenfunktion umwandeln. Wir rufen unsere Datenbank mit Treff an. Also erhalten wir Verweis auf die Straße von unserer Datenbank, ohne den Pfad anzugeben, dann wird das Update aufrufen und wir werden unser Update-Objekt übergeben, und es wird alle von Keys übergebenen Updates Spitze, und es wird diese Vergangenheit innerhalb die Datenbank direkt nach der Aktualisierung unserer Daten. Wir rufen Set-Input wieder auf eine leere Zeichenfolge, und wir werden auch Alarm-Türfehler setzen und wir werden jemals Dock-Nachricht angeben, okay? Und vielleicht auch Lasst uns den Ladezustand definieren. Also neben diesem Import, lassen Sie uns erstellen ist laden und traurig ist Leihgabe, die standardmäßig auf false gesetzt wird. Dann rufen wir an, dass er geladen wird, bevor wir eine asynchrone Aufgabe machen. Falls wir versagt haben, nennen wir es Satya Falls. Und wenn wir fertig sind, auch rufen wir auchFalse an. Lassen Sie uns nun den Dis Ladezustand für diese Schaltfläche verwenden. Also lassen Sie uns deaktiviert Onley, wenn unsere Daten gerade geladen werden, vielleicht lassen Sie uns speichern und werfen Sie einen Blick. Was haben Sie? Also, wenn ich eine Nachricht an die Datenbank schicke, habe ich die Erlaubnis heute Abend, und das liegt daran, dass wir keine Sicherheitsregeln spezifiziert haben. Lassen Sie uns zu Regeln navigieren. Und dann lassen Sie uns das alles kopieren. Fügen wir es hier unten ein. Lassen Sie uns es in Ihre Nachrichten umbenennen und geben Sie Nachricht I d Lassen Sie uns es speichern und lassen Sie uns es mit unseren lokalen Regeln synchronisieren. Und jetzt versuchen wir, eine neue Nachricht zu senden. Also, wenn ich jetzt klicke, öffnen wir unsere Datenbank und hier kann ich einen neuen Pfad sehen, der Nachrichten ist, die ich neu generierten Schlüssel habe, was eigentlich diese Nachricht ist, die wir mit dieser Codezeile erstellt haben . Wenn wir es hier öffnen, haben wir bei der Zugehörigkeit geschmort Dieses Zimmer I, d Text Autor, ist die nächste Person und Innenräume. Wenn wir jetzt öffnen, haben wir auch eine Nachricht verloren, das ist diese Nachricht, die wir gesendet haben. Es sieht also gut aus. Das einzige, was ich hier tun möchte, ist eigentlich, dass ich vielleicht bei einem neuen Handler für das on key down Event möchte. Wenn wir also auch auf Enter Button klicken, wird die Nachricht gesendet. Also für diesen Import, lassen Sie uns auch auf Key Down-Ereignis setzen und wir werden auf Key Down-Handler angeben, Lassen Sie uns es als nächstes setzen, Teoh auf Eingabeänderung. Und das auf Qi unten wird sein oder vielleicht lassen Sie es uns hier unten setzen, neben dem gesendeten Klick innen auf Taste nach unten. Wir werden dieses Mal ein Ereignisobjekt erhalten, und wir werden fragen, ob Ereignis Kiko oder gleich 13 ist. Wenn unsere Taste, die wir drücken, ist eingeben, dann werden wir zuerst Ereignis verhindern Standard aufrufen, um jede Standardfunktionalität für diese Schaltfläche definiert zu verhindern . Dann werden wir auf gesendeten Klick anrufen. In Ordnung, , versuchen wir es noch einmal,wenn ich noch mal Hallo sage. Wenn ich auf Eingabe rechte Nachricht gesendet wurde und die Datenbank wurde aktualisiert. Also schätze ich, das war's. Lassen Sie uns dieses Video beenden. Lassen Sie uns alle unsere Änderungen abnehmen, indem wir bei allem gut anrufen. Dann erhalten Sie Commit und, lassen Sie uns erstellen verkohlt unten Gesendete Nachrichten an de Chat. Prächtig. Wir sehen uns im nächsten. 124. Letzte Nachricht in Raumliste anzeigen: Hallo. Nun, da wir Nachrichten in unserer Datenbank haben und wir Lust Message Eigenschaft auf Chatroom Daten zur Verfügung haben , können wir diese letzte Nachricht in Chatroom Liste Inside room Element anzeigen. Lass es uns tun. Lassen Sie uns zurück zu Code navigieren und öffnen Sie uns Raum Element Komponente hier oben, wo wir d Struktur um Eigenschaften. Lassen Sie uns auch d Struktur letzte Nachricht als zuerst hier innerhalb der Zeit vor, anstatt Ihr Datum anzuzeigen erstellt auf Lassen Sie uns fragen, wenn wir Nachrichtendaten verloren haben, dann werden wir neues Datum aus der letzten Nachricht angezeigt, die an so erstellt wurde, wenn diese Nachricht erstellt. Andernfalls behalten wir es so, wie es war, bevor wir anzeigen, wenn der Raum erstellt wurde, dann hier unten, wo wir keine Nachrichten anzeigen. Doch statt dessen, lassen Sie uns schlechte bedingte Rendering. Wenn wir also die letzte Nachricht haben, werden wir das letzte Nachrichten-Markup anzeigen. Sonst wird es wie zuvor sein. Wir werden Spannweite anzeigen. Noch keine Nachrichten. Also in diesem Reaktionsfragment, werden wir den ersten Benutzer Avatar und dann die eigentliche Nachricht setzen. Also wird dieses Def Rapper für Profil-Avatar-Komponente sein, die wir früher erstellt haben, wie Sie sich erinnern. Also lasst uns es importieren und für Requisiten. Lassen Sie uns angeben, Quelle wird letzte Nachricht sein. Werfen wir einen Blick. Letzte Nachricht Tochter Autor Nora al atar Punkt Autor Lord Avatar Name im Fall, wenn Avatar nicht definiert ist, wird letzte Nachricht Autor Punkt Name und Größe wird Rauch sein. Und für diese taub lassen Sie uns gießen, um Flex und ein Zeilenpunktcenter anzuzeigen. Sie stellen sicher, dass das Avatar-Element 10 ist, um vertikal zu lesen. Dann entscheiden Sie, ob wir diese Rinde für Reaktionsfragment neben diesem Profil-Avatar loswerden . Lassen Sie uns einen weiteren tauben mit Klassennamen-Tags anzeigen verschwinden, um Angriffe von Überlauf und Rand links zu verhindern . Lass uns dich hineinbringen. Wir werden Def setzen. Das wird sagen, letzte Nachricht Punkt Autor Punktname. Und nächstes Jahr nach dem Namen werden wir arm sein. Letzte Nachricht, Hund Text und in Richtung dieses Autors Namen, werden wir Text kursiv anzeigen, nur um zwischen dem Namen des Autors und der letzten Nachricht zu unterscheiden. Alles klar, lassen Sie uns alles retten. Kommen wir nicht zu unserer Bewerbung zurück. Das kann ich unerwartet sehen. In Ordnung, also nochmal, dieses Reaktionsfragment Buck. Nun, wenn ich sage, was ich sehen kann, habe ich die eigentliche Botschaft. Ich kann den Namen des Autors sehen. Ich kann meine Nachricht sehen und meinen Ah-Wurf sehen. Jetzt vielleicht. Versuchen wir es mit einer neuen Nachricht. Also lassen Sie mich Hallo aus der Zukunft sagen. Wenn ich diese Nachricht schicke, kann ich sehen, dass die Nachricht gesendet wurde. Gerade jetzt wieder, mein Avatar, mein Name und Hallo aus der Zukunft. In Ordnung, das ist es also. Es war ziemlich einfach, oder? Lassen Sie uns unsere Änderungen begehen. Lassen Sie uns alles setzen, um System zu erhalten und lassen Sie uns verpflichten, indem Sie sagen, Anzeige letzte Nachricht im Raumelement, für die Tat. Wir sehen uns in der nächsten. 125. Arbeiten mit denormalisierten Daten: Hey, jetzt haben wir Lust Nachricht in der zerschmetternden Liste. Aber hier ist das Problem, weil wir Daten jetzt duplizieren. Wenn wir sagen, ich gehe zu meinem Dashboard und ich aktualisiere meinen Spitznamen auf etwas anderes, lassen Sie uns speichern, um Look 16 zu zeigen. Dann aktualisieren sie auch meinen Avatar. Wenn ich es hochlade, wird es hochgeladen. Aber letzte Nachricht wird nicht aktualisiert, da diese Daten innerhalb der Datenbank dupliziert werden. Wir müssen uns darum kümmern, wenn wir die tatsächlichen Daten aktualisieren. Wenn wir einige Änderungen vornehmen, stellen wir sicher, dass wir auch alle Referenzen aktualisieren, die wir dupliziert haben. Lassen Sie uns nicht zurück zum Code und lassen Sie uns zum Dashboard navigieren, Gehen wir zu Dashboard Togo und gehen Sie dann zum Dashboard. Und hier, statt dieses Benutzers Spitzname rau setzen neue Daten. Wir müssen einen Weg finden, um alle Referenzen zu aktualisieren. Also, was ich vorgeschlagen habe, möchte ich vorschlagen, eine Hilfsfunktion zu erstellen, die alle Referenzen in unserer Datenbank erhält , und dann können wir unsere Datenbank mit alten diese Referenz aktualisieren. Eigentlich wird es das gleiche sein, wie wir es in Tschad unten getan haben, als wir dieses Aktualisierungsobjekt erstellt haben, und wir haben mehrere übergeben, um eine atomare Operation durchzuführen, so dass es im Grunde dasselbe sein wird. So können wir diese Funktion so aufrufen. Lassen Sie uns definieren, wie wir es tun werden. Also statt eines Gewichts Benutzer Spitznamen Raff Set, wir werden anrufen, Nehmen wir an, wir werden Updates erhalten und weil wir auf unsere Datenbank zugreifen, wird es in einem Satz Operation sein. Wir werden es benennen. Nehmen wir an, lassen Sie Benutzerupdates innerhalb. Wir werden Benutzer I d übergeben, die wird Profil verehren Ihre i d. Dann werden wir den Schlüssel übergeben, den wir aktualisieren müssen. Also in unserem Fall wird es Name sein und dann werden wir den tatsächlichen Wert übergeben , der neue Daten wie folgt sein wird. Also, jetzt müssen wir Dysfunktion schaffen. Lassen Sie uns zwei Helfer navigieren, sie s und hier unten, lassen Sie uns exportieren Funktion de Probleme Namen Benutzer Updates bekommen. So wird es alles Funktion sein und es wird Benutzer i d empfangen dann wird es Schlüssel zum Aktualisieren erhalten und auch wird es Wert erhalten. Und vielleicht lassen Sie uns auch das Datenbankobjekt zusammen mit unserer Funktion übergeben. Also hier werden wir auch dieses Datenbankobjekt übergeben, das wir innerhalb misc Kamin nur für die Bequemlichkeit wie diese haben . Also, jetzt innerhalb von Helfern, können wir auch Datenbank hier drüben haben. Jetzt werden wir ein leeres Objekt erstellen. Undefinierbare Kohle-Updates als unser erstes Update wird der tatsächliche Wert sein, den wir versuchen, so Updates zu aktualisieren. Dann wird Profile Schrägstrich Benutzer i d als Schrägstrich Schlüssel zu aktualisieren, und es wird auf Wert gesetzt werden. Jetzt müssen wir die tatsächlichen Referenzen bekommen. Also unsere Referenzen sind Werfen wir einen Blick Nachrichten Nachricht I D. Als Autor als Avatar in Auch Räume erstellt. Letzte Nachricht. Also, was werden wir tun? Wir werden ein paar Versprechen definieren, weil es mehrere Versprechungen gibt. Wir wollen sie nicht eins nach dem anderen machen. Wir wollen sie sofort ausführen. Deshalb werden wir unsere Versprechen definieren. Und dann werden wir alle mit Versprechen Punkt erwarten Alle unsere erste Verheißung wird Nachrichten bekommen und es wird db dot Ralf Dar Nachrichten sein, dann um Nachrichten zu bekommen, wo sagen wir, dieser Autor, ich d gleich Ihnen unser Benutzer, Wir müssen zuerst die volle Bestellung nach Kind. Dann müssen wir angeben, welches Kind. Wir gingen zur Referenz. Also in unserem Fall Referenznachrichten So haben wir das Nachrichtenobjekt. Dann haben wir Autor Schrägstrich Benutzer i D. Also lassen Sie uns Ordnung nach Autor Schrägstrich Benutzer i d setzen und dann wird dieser Schlüssel gleich dem Benutzer i d sein. Dass wir als Argument erhalten und dann werden wir einen Wert setzen, um den tatsächlichen Wert zu erhalten . Dann wird unser zweites Versprechen sein, Benutzerräume zu bekommen, was DB-Referenz Schrägstrich Räume sein wird. Dann müssen wir wieder Ordnung nach Kind bringen. Und dieses Mal, wenn wir die Räume öffnen, haben wir weniger Nachricht Schrägstrich Autor Schrägstrich Benutzer i d. Also lassen Sie uns Junge letzte Nachricht Autor, Benutzer I d. Und dann gleich Benutzer i d. Und wieder einmal Wert. Jetzt, da wir diese beiden Versprechen im ungelösten Zustand haben, müssen wir sie auflösen. Aus diesem Grund werden wir ein Gewichtsversprechen schaffen, dass alle im Inneren müssen wir eine Reihe von Versprechungen übergeben die Nachrichten bekommen und Zimmer wie diese bekommen und Nachrichten erhalten uns Snapshot von Nachrichten zurückgeben und Zimmer bekommen uns einen Schnappschuss von Zimmern zurückgeben. Also hier werden wir sie strukturieren. Das erste Element ist Nachrichten erhalten. Also werden wir zuerst Nachrichten, Schnappschüsse oder Nachrichten erhalten . Druckknopf-Hemd Eine zweite wird Räume sein, Snap Shirt, das wir korrespondierende Klay am Snatcher und Air Snapshot nennen werden. Dann für jede Nachricht, die wir mit User-Idee haben, rufen wir für jeden so Nachrichten-Snapshot für jede Nachricht, die wir erhalten, wir erhalten Nachrichten-Snapshot, und hier werden wir Updates aufrufen. Dann werden wir schlechte Nachrichten Schrägstrich Nachricht Snapshot Punkt Schlüssel, die die Nachricht i d darstellt. Also werden wir ein Objekt mit all diesen Nachrichten haben, und Schlüssel wird diese Idee off Nachricht sein. In Ordnung, so Nachricht Schlüssel Schrägstrich Autor Schrägstrich Schlüssel zu aktualisieren. Auf diese Weise verweisen wir auf Nachrichten Autor und das Kind, das wir aktualisieren möchten, ob es Allah Auto Name Ihr I d oder erstellt bei. Und dann, damit dieser Schlüssel aktualisiert wird, werden wir Wert setzen und genau das gleiche, was wir für unsere Momentaufnahme tun werden. Also lassen Sie es uns tatsächlich kopieren. Und anstelle von m Schnappschuss, lassen Sie uns schlechte Luft Snapshot, die Raum ist, Snap Shirt und dann für Updates, wir werden Räume setzen, dann werden wir Raum Snapshot Dot Key bekommen, die Dann werden wir hier letzte Nachricht haben. Dann haben wir Autor und dann Schlüssel, um mit Wert zu aktualisieren. In Ordnung. Und gleich danach werden wir das Aktualisierungsobjekt zurückgeben, das wir erstellt haben. Nun lassen Sie uns sagen, was Lassen Sie uns zu Ihrem Dashboard navigieren lassen und kommentiert, und lassen Sie uns wirklich wichtig dieses Objekt von Helfern, aber es scheint, als ob es automatisch importiert werden kann. Also lassen Sie uns importieren Benutzer-Updates von Lassen Sie uns referenzieren unsere Helfer Misc Helfer und es scheint , als ob es nicht richtig gefunden wird, also bringen Sie dorthin. Aktualisieren. Alles klar, bringen Sie dorthin. Aktualisierungen wie diese. Ok, perfekt. Jetzt, da wir Updates haben, anstatt diese Funktion hier drüben aufzurufen und anstatt auf die tatsächlichen Daten zu verweisen, können wir tatsächlich nur Datenbank-Dot Ref Tür-Update mit Updates aufrufen. Dann werden wir erwartet und wir werden all das und auch all das entfernen. Jetzt speichern wir es und lassen Sie uns eigentlich auch öffnen. Applaud Bt, in dem lädt unseren Avatar und lassen Sie uns die Logik finden. Also hier wieder, da wir innerhalb des Dashboards hören können, können Sie es kopieren und stattdessen wieder die referenzierende das untergeordnete Element ausschalten und dann so aktualisieren. Lassen Sie uns Updates setzen würden Ihre Updates als für Profil i d bekommen. Wir werden Avatar dieses Mal aktualisieren und Avatar wird nicht laden Euro so. Lassen Sie uns nun diese Referenz entfernen. Lassen Sie uns dieses Benutzeravatar-Set entfernen. Lasst uns diese Logik fangen. Lass es uns hier setzen und jetzt schauen wir uns mal an. Wenn es tatsächlich funktioniert hat, navigieren wir zurück zum Code. Lassen Sie mich die frische nur für den Fall, wenn ich zum Dashboard gehe, wenn ich auf Änderung klicke, meinen Spitznamen Okay, vielleicht werde ich hallo sagen. Neuer Name. Wenn ich auf sichere Spitzname klicken wurde aktualisiert und ich habe immer noch und hier zu sein. Okay, vielleicht lassen Sie mich das Dashboard eins überprüfen. Meine Zeit. Ich habe einen Namen hier drüben. Lassen Sie uns protokollieren Updates und werfen Sie einen Blick. Was ist los hier drüben? Wenn ich inspizieren, Ich gehe zur Konsole Ich aktualisiere meinen Spitznamen. Ich habe diese Art von Updates, Nachrichten, Profilen, Ordnung, aber ich aktualisiere meine letzte Nachricht nicht. Das ist also komisch. Lass uns Teoh-Helfer navigieren. Und hier schauen wir uns mal an. Zu aktualisierende Autorenschlüssel Okay, Snap Shirt verloren. Verfasser, Ihr I D Lassen Sie uns unsere Datenbank überprüfen. Letzte Nachricht. Autor, Ihr I D Das ist Benutzer I d, dass wir übergeben. Oh, entschuldigen Sie mich. Hier darf nicht zuletzt sein. Muss weniger Nachricht sein. Lass es uns retten. Und jetzt noch ein Mal. Ändern wir unseren Spitznamen. Tiu. Sagen wir, sie sieht 22 aus. Wenn ich meinen Spitznamen aktualisiere, wird er hier aktualisiert. Perfekt. Lassen Sie uns nun nach Al Atar suchen Wenn ich wieder ein neues Bild hochlade, wurde Avatar vermieden. Schauen wir uns rein. Letzte Nachricht. Ja. Ah, Was wurden aktualisiert? Okay, nur für den Fall, dass noch ein Mal. Applaus. Avatar wurde aktualisiert. Perfekt. Werfen wir einen Blick. Ja, es wurde aktualisiert, also hat es tatsächlich funktioniert. In Ordnung. Perfekt. Nun lasst uns dieses Konsul Glück entfernen, das wir hier drüben gemacht haben, und lassen Sie uns unsere Änderungen begehen. Das ist es. Lasst uns alles in den Bühnenzustand einsteigen und uns verpflichten. Aktualisieren Sie alle Benutzerreferenzen, wenn Daten aktualisiert werden. Ok. Perfekt. Wir sehen uns im nächsten. 126. Chat-Nachrichten erkennen: Hey, da. In diesem Video werden wir Chat-Nachrichten hier in der Mitte innerhalb der Chat-Seite anzeigen. Lassen Sie uns gehen, Gehen wir zurück zu Code und lassen Sie uns unsere Ordner Chat-Fenster Nachrichten finden. Und hier haben wir Index-Togs bereits weniger groß, und Sie Datei, die Nachricht Element nennen wird. Für den Moment wird es leer sein. Also lasst uns Hallo reinlegen. Und lassen wir es wie das innerhalb von Nachrichten hier in erster Linie lassen, wir werden unseren Staat definieren, den wir mit dem Verwendungszustand verwalten werden. Also werden wir es Nachrichten und Sat-Nachrichten nennen. Und standardmäßig wird es so sein zu wissen. Dann müssen wir auch unseren Chat greifen, den wir gerade geöffnet haben. Also, dafür werden wir verwenden Paramus Hook, der von React Rotor kommt und wir werden Kind zu bekommen , ich d jetzt in Gebrauch Effekt. Wir rufen unsere Datenbank an. Zuerst greifen wir unseren Verweis auf den Chat-Pfad innerhalb der Datenbank, die Nachrichten ist. Also lasst uns schlechte Nachrichten rau. Dann werden wir Datenbank aufrufen, aber nicht die, die aus Firebase-Paket eins kommt, die von feuerbasierten RGs kommt. Also lasst uns das importieren. Dann werden wir Referenz Schrägstrich Nachrichten angeben. Jetzt werden wir einen Echtzeit-Listener auf Hold-Nachrichten setzen, die mit geöffnetem Chattering zusammenhängen . Also werden wir befriedigen Nachrichten sehen, Ralf, Tür Ordnung nach Kind. Und hier werden wir Zimmer I D. beruhigen und das ist eine Eigenschaft, die wir auf jeder Nachricht haben, das ist Raum I. D. Also wird das von der Idee gleich sein, i d, dass wir von Paramus erhalten. Nun schien es als Abhängigkeit, also lasst uns bearbeiten. Und gleich danach, lassen Sie uns einen Echtzeit-Zuhörer setzen, damit wir Wert setzen und ehrenvolle Callback beruhigen , der Snapshot erhält. Nun, wie Sie sich erinnern, wird dieser Schnappschuss ein Objekt sein, bei dem jeder Schlüssel die Nachricht I d ist und dann bekommen wir die tatsächlichen Daten. Also müssen wir es transformieren. Und wir haben es bereits mit der Transformation zu Array mit I d Funktion gemacht. Also werden wir es noch einmal nennen. Also lasst uns schlechte Daten und dann werden wir Transformation in Array mit i d setzen, dann werden wir den Snapshot-Punktwert aufrufen und ihn an diese Funktion übergeben. Und dann werden wir den Zustand mit Daten wie diesen aktualisieren und weil es ein Echtzeit-Listener ist . Es ist ein Abonnement, das wir abbestellen müssen. Also lassen Sie uns Ah verwenden, wir sind Cleanup-Funktion für die Verwendung Effekt. Und hier werden wir Nachrichten, Floß und Hund abschütten , und wir können Wert angeben. Auf diese Weise werden wir uns von allen Echtzeit-Zuhörern auf diesem Weg abmelden. In Ordnung, jetzt, unser nächster Schritt ist die Anzeige von Daten. Und zuerst müssen wir tatsächlich ein paar Mobbing-Werte bekommen, die uns helfen, unsere Botschaften bedingt zu machen . Unsere erste wird also leer erschossen und verkohlt. Leer wird nur sein, wenn wir Nachrichten definiert haben und dann Nachrichten Punktlänge gleich 20 Also haben wir alle Nachrichten geladen, aber es gibt keine Nachrichten überhaupt. Richtig, dann können wir auch Nachrichten zeigen, die zeigen, ob wir unsere Nachricht Element machen können , die wir erstellt haben. Also, wenn wir Nachrichten und Nachrichten Punktlänge ist größer als Null. Also könnten wir diese Bedingung direkt hier in unser Markup setzen, aber nur um sauberer zu sein,wissen Sie, wissen Sie, wir haben sie hierher gebracht. Also in diesem Def, werden wir die nächste Logik setzen. Zuallererst wird es kein Diff sein. Es wird ein u L. Dann Klassenname wird Nachrichtenliste sein und auch Zoll wachsen, dass im Inneren wir gießen wird leer verkohlt. Dann zeigen wir ein Verbündetes an, weil wir dich haben, ich und wir werden noch keine Nachrichten sagen. Und dann, wenn wir Nachrichten zeigen können, dann werden wir Nachrichten gießen, Doc Map und wir werden jede Nachricht dem Nachrichtenelement zuordnen. Lassen Sie uns es für Intelligenznachrichtenelement öffnen. Er wird Nachricht Tür i d. Und dann werden wir Nachricht mit einer Nachricht wie dieser übergeben Jetzt innerhalb Nachricht müssen wir diese Eigenschaft de strukturieren. Also lassen Sie uns Nachrichten und hier auf der unteren Ebene D Struktur aus Nachrichten setzen, aber nicht aus Nachrichten. Entschuldigen Sie mich von der Nachricht. Benennen wir es in Nachricht um. Lassen Sie uns speichern, was sich auch an der Nachricht ändert. Und von dieser Nachricht werden wir zerstörerischer Autor Schwierigkeiten D Struktur erstellt an und wir werden Text destructor. Jetzt wird es ein l i Element sein und es wird Klassennamen aus getrennt und Rand unten eins haben . Dann bringen wir Dave hierher. Das wird der oberste Teil unserer Botschaft sein. Und dann werden wir ein anderes def setzen. Und in diesem anderen wird Spanne setzen, die unsere Nachricht selbst erkennt und Klassenname wird Ward brechen alle, um Text vom Überlauf zu verhindern, wenn es zu lang ist. Also für unseren oberen Teil, wir Klassennamen von Display-Flags angeben ausrichten Elemente zentrieren Schriftart wird kühner und Rand unten eins sein , dann hier werden wir gießen Erstes Profil Avatar, Lassen Sie uns es öffnen. Profil für alle Matar. Und jetzt lasst uns Intelligenz verwenden, um importiert zu werden. Also als Quelle gehen wir billiger. Autor Punkt-Avatar für Namen. Wir werden uns oder Doc Name vier Klassennamen einschenken. Es wird Marge übrig bleiben. Eine Größe wird überschüssig sein. Und dann neben diesem Avatar, wir werden Spawn Element setzen, ob wir aus Name und Klassenname angezeigt wird um Rand links zu und nach dieser Wirbelsäule angezeigt wird, wenn diese Nachricht erstellt wurde. Also werden wir die Zeit vor sich bringen. Also lasst uns Raumartikel öffnen. Lassen Sie uns diesen Import aus der Zeit gefangen werden. Legen wir es auf den Kotelett. Rufen wir p zur gleichen Zeit an und legen Sie es hier anstelle dieses Datums. Zeit, die wir anzeigen werden. Gerade erstellt bei und für Klassennamen für Normal und Text schwarz. Wir werden es behalten, wie es ist, aber wir werden auch Marge links anzeigen, um wem? Es war eine Menge. Jetzt schauen wir uns mal an. Wie Sie sehen können, haben wir unsere Botschaften. Und jetzt, wenn ich sagen würde, deine Nachricht ausführe, sagen wir hallo. Sie können sehen, dass es hier drüben erschienen ist. Und auch es wird hier innerhalb der letzten Nachricht erschienen. Also, jetzt haben wir tatsächlich unsere Nachrichten angezeigt werden. Und es wird auch für jeden anderen Chatraum funktionieren. Sagen wir Hallo von hier. Jetzt haben wir eine Nachricht hier drüben. Ok. Perfekt. Also dies ist ein lassen Sie uns unsere Änderungen zu begehen. Lassen Sie uns alles vergessen. Lassen Sie uns sagen, begehen. Und Leute benennen angezeigte Nachrichten innerhalb der Chat-Seite. Alles klar, wir sehen uns in der nächsten. 127. Benutzerprofildaten anzeigen: Hallo. In diesem Video werden wir ein neues Modellfenster hinzufügen. Wenn wir also auf den Benutzernamen eines Benutzers klicken, können wir das Benutzerprofil beobachten. Kommen wir nicht zurück zum Code. Und hier unter Nachrichtenordner, lassen Sie uns Ihre Datei begrüßen. Gemüse-Name Profil-Info. BT und Moto GS. Lassen Sie uns eine neue Komponente erstellen. Und jetzt lasst es uns leer halten. Lassen Sie uns Nachricht Element öffnen. Und hier anstelle des Span-Elements, wo wir Autorenname anzeigen, Lassen Sie uns Profil in für BT und Moto und für diese Komponente anzeigen, weil wir Benutzerdaten erhalten müssen , müssen wir es innerhalb anzeigen. Wir werden Profilstütze passieren und wir werden passieren. Nur Autor und alles andere wird von innerhalb der Komponente verwaltet. Von hier aus werden wir Ihr Profil für jetzt zerstören und den Markt definieren. Also zuerst werden wir Taste setzen und diese Schaltfläche wird sagen, kurzen Namen von unserem Benutzer. Also lassen Sie uns neue lebensfähig hier schaffen, dass wir Kurzname nennen werden und es wird nur auf Lee die erste Abwehr Spitzname spielen . Also, wenn es ein vollständiger Name wie Vorname zweiter Name ist, werden wir nur den Vornamen anzeigen. Also lasst uns Profil-Job-Namen setzen. Dann teilen wir es mit leeren Leerzeichen und dann greifen wir das erste Element. Jetzt werden wir nur den Vornamen anzeigen, weil es Modell sein wird. Wir müssen auch einen sterblichen Zustand bekommen. Also lassen Sie uns unseren Haken verwenden , der Modellzustand verwendet wird. Hier erhalten wir offen, nah und offen. In Ordnung, jetzt neben dieser Leiche und wir werden das Modell gießen. Und in diesem Modell, lassen Sie uns zuerst zeigen Eigenschaft definieren, die sein wird, ist offen und auf Verstecken wird Kleidung als in diesem Moto sein . Wir werden sterbliche Tochter haben, Heather wie immer. Dann werden wir Körper haben und wir werden Fußzeile wie diese haben. Also in Heather werden wir sterbliche Tür Titel haben und innerhalb moralischen Titel werden wir kurze Namen Profil anzeigen, dann innerhalb Körper oder vielleicht innerhalb der Fußzeile, Blase Display unten, die ein Blockelement auf Klick sein wird Es wird schließen unser Moto und es wird gerade über auf nur diese diese Sterbliche als im Inneren Körper schließen. Zuerst werden wir es Klasse Name aus Textmitte setzen Also in einer Blase schlecht genau das gleiche Avatar-Bild wie wir es in Avatar tun. Ein Blut Bt, in dem ja ist, dieses Profil Avatar. Also lassen Sie es uns kopieren und lassen Sie es uns hier setzen. Jetzt importieren wir Profil Avatar. Und daneben zeigen wir H vier an, wo wir den vollständigen Namen dieses Benutzers anzeigen werden. Also lasst es uns zuerst schnappen. CONST. Der Name wird aus dem Profil genommen. Und vielleicht lasst uns auch Avatar schnappen und sagen wir, erstellt bei Also jetzt brauchen wir Teoh die Struktur nicht oder wir brauchen kein Profil hier angeben. Also für dieses Alter, denn wir werden Marge sprechen, um etwas Marge an der Spitze hinzuzufügen. Und dann werden wir Mitglied anzeigen, da und dann werden wir Mitglied seit Variable gießen , die wir erstellen werden. Also lassen Sie uns armen const Mitglied da und wir werden neues Datum erstellen setzen und dann werden wir einfach nur auf lokale Tageszeichenfolge aufrufen, um unser Datum zu ehemaligen. Nein. Also haben wir nicht offen benutzt. Also lasst es uns dafür auf Klick setzen. Okay, gut. Nun lassen Sie uns Nachricht Element öffnen. Sieht gut aus. Sieht gut aus. Jetzt schauen wir uns mal an. Also, wie Sie jetzt sehen können, haben wir den Knopf. Wenn wir darauf klicken, können wir sehen, dass sie 22 aussieht. Profilen Sie unser Bild, vollständigen Namen, Mitgliederszenen und schließen Sie Perfect. Aber ich möchte es nicht so angezeigt werden. Also werden wir nur ein paar Dinge. Alles andere, was an diese Komponente als Requisite übergeben wird, wird zu Knopf-Requisiten umgeleitet . Und lasst uns dieses Def als Rapping-Element loswerden. Lassen Sie es nur eine Taste am Ende sein, so dass alle diese Requisiten an diese Schaltfläche übergeben werden. Also lassen Sie uns Bt und Requisiten Objekt über diese Komponente so verteilen. Also für dieses Profil in vier Beat und Modell, können wir Aussehen passieren, die Link sein wird. Und auch wir können Klassennamen übergeben. Fügen wir Polsterung hinzu. Zito Dan. Lassen Sie uns Rand links und auch Text schwarz hinzufügen. Speichern wir es und schauen wir uns jetzt an. Sieht gut aus. Wenn ich habe oder ich sehen kann, dass es etwas ist, das anklickbar ist. Wenn ich darauf klicke, kann ich Benutzerdaten erhalten. Okay, perfekt. Das ist es also. Jetzt lassen Sie uns unsere Änderungen übernehmen. Holen Sie sich alles, holen Sie sich Commits. Nehmen wir an, die Benutzerdaten mit maro Fenster angezeigt werden. Alles klar, wir sehen uns in der nächsten 128. So fügst du Präsenz – Teil 1: Hallo. In diesem Video werden wir Rial Zeit Präsenz in unserer Anwendung mit Fire Base verwalten. Es ist ziemlich einfach zu tun. Lasst uns herausfinden, wie wir damit umgehen können. Gehen wir zu Google und lassen Sie uns einfach Firebase Riel Zeitpräsenz eingeben. Dann können wir zum ersten Link gebaut Präsenz und Wolkenfeuerladen gehen. Und hier haben wir bereits eine Lösung mit Präsenz in Echtzeit Datenbank. Also müssen wir nur dieses Code-Snippet fangen und es dann in unserer Anwendung verwenden. Also lassen Sie uns erste Kopie ist offline und online für Datenbank Wertsachen und lassen Sie uns zu Profilkontext navigieren . Dies ist der Ort, an dem wir alles umgehen werden, denn hier können wir Zugang zur Authentifizierung bekommen. Objekt mit Echtzeit-Abonnement. Alles klar, also lassen Sie uns trotz eines Bels hier oben setzen und Var durch Constant ersetzen. Jetzt schauen wir uns mal an. Was müssen wir als Nächstes tun? Also müssen wir Database Floß zu Informationen zu erraten verbunden. Das ist also wie ein allgemeiner Weg in Datenbankpfad, auf den wir zugreifen können, und wir können Echtzeitpräsenz aus derzeit angemeldeten Benutzer bekommen . Also lassen Sie es uns einfach kopieren. Oder lassen Sie uns das alles so kopieren, und lassen Sie es uns hier drinnen platzieren. Wenn Authentifizierungsobjekt, Denver wird unsere Echtzeit-Anwesenheitsverwaltung durchführen. Also hier müssen wir Verweis auf vernetzte anstelle von Firebase-Datenbank erhalten. Lassen Sie uns später Basis verwenden, die wir in misc bekommen haben. Feuerbasis. Also dann erhalten wir Verweis auf den Wert verbunden, was in eine schmale Funktion umgewandelt wird als wir erhalten. Snap. Sicher, wenn Snapshot dieser Wert falsch ist. Lassen Sie uns schlecht und drei Personen Gleichheit als Benutzerstatus. Datenbank Ref. Also schauen wir uns mal an. Das ist so wertvoll, dass wir kopieren können. Und das ist der Ort, an dem wir unseren Status in unserer Echtzeitdatenbank speichern. Was wir also tun müssen, weil es ein Echtzeit-Abonnement sein wird, müssen wir es auch in Zukunft abbestellen. Also lasst es uns hier in Yousef als neue Lebensfähigkeit handeln, wir werden es nennen, Benutzer erschreckt Datenbank rau. Lassen Sie uns Datenbank entfernen und lassen Sie uns einfach Benutzerstatus setzen, ref. Dann werden wir Benutzer Starter Ref Datenbank Ralf Status zuweisen und Sie Idee, Lassen Sie uns es hier an der Spitze, einfach so, und stattdessen weg Sie Idee. Lassen Sie uns Ihr i d verwenden und ersetzen Sie es durch die String-Interpolation. Also werden wir beide Objekt Punkt Ihr i d so bekommen, weil es ein Abonnement ist. Wenn wir weggeschaut werden. Lassen Sie uns überprüfen, ob wir den Benutzerstatus haben. Ref, wenn wir es erledigt haben, werden wir uns davon abmelden. Und das gleiche werden wir auch für unsere Bereinigungsfunktion über Heldenbenutzerstudien tun. Grob weg. Okay, perfekt. Jetzt lassen Sie uns diesen Teil verwalten. Also lassen Sie uns alle Kommentare entfernen. Lassen Sie uns das alles entfernen. Und hier werden wir gießen Benutzer begann Riemen auf. Trennen ist offline für Datenbank, dann Funktion. Lassen Sie uns in eine Erwachsenenfunktion umgewandelt. Dann ersetzen wir es durch Ihren Status. Ref. Sad ist online für Datenbank, also ist dies im Grunde es. Jetzt schauen wir uns mal an. Wir haben Feuer. Basis ist nicht definiert. Werfen wir einen Blick. Firebase-Datenbank. In Ordnung. Weniger Import Feuerbasis von Firebase App, so dass wir Zugriff auf Serverwert erhalten können. Male Temp. Speichern wir es und schauen wir uns mal an. Wenn wir drinnen sind,wird uns die Erlaubnis verweigert. Wenn wir drinnen sind, Das ist interessant. Das ist wahrscheinlich etwas mit Sicherheitsregeln. Schauen wir uns an, wo wir unsere Daten schreiben. Äh, huh. genau. Also schreiben wir unsere Daten, um den Status von Ihnen I d. So lassen Sie uns wieder richtige Sicherheitsregeln für diese Vergangenheit innerhalb der Datenbank. Also haben wir den Status. Also nennen wir es diesen Weg. Wir werden es so machen. Also hier werden wir Benutzer I d haben und dann werden wir in der Lage sein, an diesen Ort auf Lee zu schreiben. Wenn wir aus, ich d gleich, um ihre Ideen so lächerlich zu verwenden Kopieren Sie diese Logik und fügen Sie sie hier so ein. Jetzt speichern wir es und schauen wir uns an, ob es tatsächlich funktioniert hat. Wenn ich meine App neu zu machen, kann ich jetzt sehen, dass ich keine Warnungen habe. Also nennen wir es P Gefäße und lassen Sie uns singen schreit sie mit unseren lokalen Daten wie diese. Gehen wir nun zurück zu den Daten und schauen wir es uns hier an. In unserer Datenbank haben wir New Path, das ist Studien, dass ich meinen Benutzer habe, ich d. Und dann habe ich weniger Veränderung und blieb online. Jetzt schauen wir uns mal an. Wenn ich mich von der Anwendung abmelde, habe ich online geblieben, also ist dies, weil wir, wenn wir uns abmelden, haben wir keine geologische für unsere Datenbank, also Onley, wenn wir uns anmelden. Lassen Sie mich mit Google fortfahren und lassen Sie mich mein Konto auswählen. Okay? Ich bin eingeloggt. Sie können sehen, dass die letzte Änderung geändert wurde. Du hast gesehen, wie die Flotte erschossen wurde, oder? Also, was passiert? Dass es tatsächlich funktioniert, wenn wir uns anmelden, aber nicht, wenn wir uns abmelden. Und die Sache ist, weil wir unsere Sicherheitsregeln auf diese Weise setzen, können wir Lee schreiben und lesen, wenn wir von Ihnen haben, ich d. Also, wenn wir unsere von unserer Anwendung einloggen, wenn wir uns abmelden , wird dieses Autorenobjekt auf jetzt gesetzt, so wird das gefeuert. Und wenn wir unsere Logik hier über setzen, wenn wir uns auf diese Weise abmelden, werden wir die Erlaubnis heute Abend bekommen, weil zu der Zeit, wenn wir versuchen, Recht auf die Datenbank des Objekts wird jetzt gesetzt werden. Die Lösung hier ist nur, um zum Dashboard zu gehen. Gehen wir zu Dashboard Tuggle hier. Wir müssen diese Logik eingießen. Also, kurz bevor wir abmelden Mobile Recht auf Datenbank. Wir haben also immer noch Zugang zu unseren Sicherheitsregeln. So können wir immer noch Zugriff auf das Autorenobjekt haben. Und erst dann werden wir unseren Benutzer abmelden. Also, welche Logik sollte hier genau so gesetzt werden, wie wir hier in Benutzerstarter gießen. Refs, das ist. Ah, für Datenwege fliegen. Also, was ich Ihnen von hier an vorgeschlagen habe, werden wir CONST exportieren. Ist ein Fliegen für Datenbank. Dann werden wir diese Logik kopieren. Kurz bevor wir uns von unserer Anwendung abmelden, fügen wir diese Logik ein. Dann werden wir importieren ist offline für Datenbank. Dann werden wir die Datenbank Dodds Ralf gießen, dann werden wir den Status als Schrägstrich setzen. Dann lassen Sie uns Zitate ändern und unseren aktuellen Benutzer pique. Dann werden wir das Set gießen, und dann werden wir ein Fliegen für eine Datenbank so etwas auf Lee setzen, dann weil es ein Versprechen ist. Also lasst uns hier drüben fertig machen. Erst dann werden wir unseren Benutzer abmelden. Wir werden unseren Benutzer alarmieren und unsere Anwendung schließen. Und im Falle eines Fehlers werden wir auch unseren Benutzer benachrichtigen, aber besser. Und wir werden eine bessere Punktbotschaft sagen. In Ordnung, jetzt schauen wir uns mal an. Also lassen Sie mich die App nur für den Fall aktualisieren. Werfen wir einen Blick in die Datenbank. Jetzt haben wir den Status online, und wenn ich mich abmelde, bin ich abgemeldet. Und jetzt bin ich aus der Linie geblieben. So ziemlich cool jetzt, wenn ich mich wieder unterschreibe, ich bin angemeldet und der Status wurde geändert. Und jetzt, wenn ich meine Anwendung schließe, wenn ich meinen Tab schließe, kann ich sehen, dass Zustand ein Fliegen ist, also funktioniert es tatsächlich. Und das ist es. So kann es mit Feuererhöhung gehandhabt werden. Es war ziemlich einfach, oder? Das einzige, was ich hier tun möchte, ist, dass ich mich tatsächlich auch von referenzierten oder info dot connect abmelden möchte, wenn wir abgemeldet sind. Also lassen Sie uns ausgießen, wenn wir unsere unterzeichnet sind und auch wir werden das gleiche für die Bereinigungsfunktion setzen , nur für den Fall. Auf diese Weisebehandeln wir alle Echtzeit-Abonnements und alles funktioniert gut. Auf diese Weise Nun, das war's für dieses Video. Also lassen Sie uns begehen. Unsere Veränderung wird alles in den Bühnenzustand bringen. Und dann werde ich alles mit Nachricht begehen. Ich werde sagen, eine Riel Zeitpräsenz, Zuhörer für einen Benutzer. Perfekt. Im nächsten Video werden wir eine Echtzeitpräsenz für Benutzer im Chat-Fenster anzeigen. Wir sehen uns dort 129. So fügst du Präsenz – Teil 2: Hey, da. In diesem Video werden wir Echtzeitpräsenz für jeden Benutzer, den wir im Chat sehen, anzeigen. Es wird als Dar vor Benutzer Avatar angezeigt. Gehen wir, bevor wir damit anfangen. Ich möchte darauf hinweisen, dass wir im vorherigen Video, als wir die Echtzeitpräsenz für jeden Benutzer hier verwaltet haben, diesen Vergleich gemacht haben. Wenn der Snapshot-Wert als die dreifache Gleichheit gleich false ist, ist dies also nicht ganz richtig, da dieser Wert möglicherweise kein Bowling ist. Um das zu verhindern, lassen Sie uns tatsächlich doppelte Negation setzen, um es in eine Bowline umzuwandeln. Und jetzt wird alles gut. Alles klar, jetzt fangen wir an. Also, was müssen wir zuerst gehen? Wir werden einen benutzerdefinierten Haken erstellen, der uns die Anwesenheit von besonders Benutzern geben wird. So können Sie zu benutzerdefinierten Hooks navigieren. Und hier unten, lassen Sie uns exportieren und Sie funktionieren, die Präsenz verwenden wird. Und dieser Haken wird Benutzer I D empfangen , dass wir Präsenz aus bekommen wollen. Also lassen Sie uns unseren Zustand für Präsenz schaffen. Wir werden es Präsenz und die Anwesenheit nennen. Es wird ein einfacher Verwendungszustand sein, der standardmäßig davon ausgegangen wird, dass er weiß. Dann in dir die Tatsache, dass wir unsere Benutzerdaten ziehen werden. Also zuerst müssen wir Referenz bekommen. Also lassen Sie uns große const Benutzerstatusdiagramm würde Datenbank von Firebase dot treff sein dann begann ein schlechter Status Schrägstrich Ihr I d, dass wir als Argument bekommen, dann müssen wir ein Array von Abhängigkeiten gießen, als wir brauchen, um Ihre i d innen zu übergeben. Dann werden wir schlechte Benutzerstatus Rough dar auf Wert. Dann werden wir kurz drängen, und gleich danach werden wir prüfen, ob Snapshot existiert. Also, wenn es einen Datensatz innerhalb der Datenbank für diesen Pfad gibt, dann werden wir const-Daten gleichen Snapshot-Punktwert gießen. Und dann werden wir Daten anwesend machen, Ordnung. Und innerhalb der Bereinigungsfunktion werden wir den Benutzerstatus Raft, Benutzerstart abbestellen . Es ist grob dran. Und von diesem Haken, werden wir Präsenz zurückkehren, richtig? Perfekt. Sieht gut aus. nun Lassen Sie unsnuneine Komponente erstellen, die ein Punkt sein wird, wo wir die Benutzerpräsenz anzeigen werden. Also gehen wir zu Komponenten. Und hier weniger toll. Sie Datei Gemüse-Namen Präsenz Punkt der g s Also in dieser Komponente werden wir unsere Custom Koch nennen, die Verwendung Präsenz ist. Also lassen Sie uns schlechte const Präsenz gleich verwenden Präsenz. Und wir werden Ihr I D übergeben , das als Requisite für diese Komponente erhalten würde. Dann innerhalb des Markups werden wir das nächste Mal unsere Anzugdokumentation öffnen. Dann lassen Sie uns nach Tooltip suchen. Öffnen wir es. Lassen Sie uns ein Beispiel aus Auslösen von Ereignissen Hover finden. Also brauchen wir genau diese Funktionalität. Gehen wir zu Beispielen und lassen Sie uns das kopieren. Dann werden wir es in unserem Hof so platzieren. Lassen Sie uns flüstern von unserem Seher und statt der Schaltfläche, werden wir einen Batch und Tooltip wird nicht dieser Tool-Tipp angezeigt. Es wird diese Komponente sein. Lassen Sie uns es kopieren und lassen Sie es uns so stützen. Jetzt müssen wir auch Tooltip und Innen Tooltip importieren. Wir werden nichts platzieren. Für den Moment, aber es sagt, dass leere Komponente sich selbst zu schließen und Sie sind direkt drinnen. Wir werden Abzeichen auch von unserem Anzug und Insider-Charge setzen Nun, eigentlich nichts setzen. Es wird nur ein Pfeil aus etwas Farbe sein. Also, jetzt müssen wir bekommen, was wir in Tooltip setzen. Und was werden wir innerhalb Charge setzen, welche Farbe angezeigt wird? Nun, wir müssen tatsächlich eine Logik ausführen, und der beste Ort, um damit umzugehen, ist tatsächlich, eine benutzerdefinierte Funktion zu erstellen, die wir von hier aus aufrufen werden . Also für diese Abzeichen werden wir den Klassennamen aus dem Auto zeigen, Sir. Zeigen Sie ihr und Stil Hintergrundfarbe wird erhalten Farbe, die wir in einem Moment erstellen und im Inneren werden wir Präsenz wie diese und für Tool-Tipp für unseren Text übergeben. Wir werden passieren, SMS bekommen. Und wir nennen es wäre Präsenz so. Also, jetzt müssen wir diese beiden Funktionen erstellen, So können wir hier nach oben navigieren. Und zuerst werden wir Farbe schaffen. Wir werden Präsenz erhalten. Und zuerst, wenn Präsenz undefiniert ist oder wenn es jetzt ist. Also, wenn es nicht definiert ist, dann werden wir tolle Farbe zurückgeben, richtig? Dann werden wir Switch-Anweisung setzen und dann werden wir zwischen Präsenzdarstellung wechseln. Lassen Sie uns unsere Datenbank Präsenz Punkt Zustand öffnen. Dann, wenn wir Fall online haben, dann werden wir grüne Farbe zurückgeben. Wenn wir Fall aus Lügen haben, dann werden wir Rad-Farbe anzeigen und standardmäßig werden wir auch großartig wie diese anzeigen. Also für Farbe, wir jetzt lassen Sie uns dies für Text erstellen. Also lassen Sie uns definieren, erhalten Text mit Anwesenheit als auch. Und wieder prüfen wir gegen keinen Wert. Wenn wir also keine Anwesenheit haben, werden wir in keinem Staat aufzeigen. Dann werden wir die Staaten wieder anwesend sein. Wenn es gleich zwei online ist, dann werden wir online zurückkehren. Sonst werden wir Lust online zurückgeben, als wir String-Interpolation öffnen, als neue Datumspräsenz zu setzen . Lust hat sich verändert. Zwei lokale Dates trinken so. Okay, perfekt. Nun wollen wir diese Komponente tatsächlich verwenden. Lassen Sie uns zum Nachrichtenelement navigieren. Und kurz bevor wir Profil Avatar anzeigen, lassen Sie uns Präsenz nicht verwenden. Und lassen Sie uns Ihre Idee als Autor Dot Ihr I d übergeben. Moment werfen wir einen Blick. Und tatsächlich, wenn meine App jetzt vor meinem Profil frisch ist, kann ich grünen Punkt sehen Und wenn ich schwebe, kann ich online sehen. Wie können wir nun gegen mehrere Benutzer getestet werden? Nun, lassen Sie mich abmelden und lassen Sie mich mit Facebook schauen, so dass es mich und Sie Benutzerprofil erstellen und wir werden es sehen So jetzt können Sie Dad sehen. Es ist unbekannter Zustand Und das ist, weil, wie Sie sich erinnern im vorherigen Video, setzen wir Sicherheitsregeln für den Status Schrägstrich Benutzer I d. So können wir Onley unseren aktuellen Benutzer lesen. Ich d gleich zwei Benutzer ich d, dass wir versuchen, innerhalb von acht immer zuzugreifen. Jetzt haben wir die Erlaubnis heute Abend. Nun, um das richtig zu beheben, werden wir es so behalten, wie es ist. Aber für regionals wir angepasst und wir werden sagen, wenn nicht gleich Schnee auf Lee, dann werden wir in der Lage sein, Benutzerdaten zu lesen. OK, jetzt kopieren wir es und synchronisieren es mit unseren lokalen Daten. Lassen Sie uns sagen, wo und jetzt werfen wir einen Blick. Wenn ich meine App jetzt aktualisiere, sieht es in Ordnung aus. Und wenn ich schwebe, kann ich zuletzt online an diesem Datum sehen, so dass es tatsächlich funktioniert. Und wenn ich hallo sage, kann ich sehen, dass ich derzeit online bin und andere Benutzer offline ist. Also das ist es und es funktioniert ziemlich genial. Lassen Sie uns unsere Änderungen begehen. Lassen Sie uns gießen, bekommen alles Land, begehen und lassen Sie uns dieses Spiel für Echtzeitpräsenz für eine Tatsache gießen. Wir sehen uns im nächsten 130. Edit hinzufügen: Hallo. In diesem Video werden wir Drover zum Chat hinzufügen, wo wir in der Lage sein, es Rauminformationen wie Raum, Name und Beschreibung hinzuzufügen Raum, . Lass uns gehen. Kommen wir nicht zurück zum Code und suchen wir unseren Top-Ordner. Und hier im Index-Togs war einfach öffnen Sie es neben dieser Datei. Lassen Sie uns jeden erstellen, den wir Edit Room BTM Drover Inside nennen werden wir den nächsten Markt setzen . Also zuerst werden wir Buttonelement verwenden und drinnen werden wir nur einen Brief setzen, der für admin steht. Dann Klassenname wird Grenze Radios Kreis als Größe wird kleine Farbe rot sein und auf Klick. Wir werden offenen Handler setzen, den die Leute von der Verwendung Modell State Hook greifen, das wir oft benutzt haben . Wie für jetzt, Also lasst uns grub ist offen, offen und schließen. Jetzt müssen wir das moralische Fenster schaffen. Also lasst uns von Drover grüßen. Lassen Sie uns aus RC oder so in diesem Rover importiert werden, werden wir Show-Eigenschaft gießen, die offen sein wird als auf. Hyde wird Kleidung sein und Platzierung wird richtig sein und das gleiche wie für Modelle. Drover hat Drover Header Körper und für so lassen Sie uns diese Komponenten erstellen. Innerhalb Fußzeile werden wir eine weitere Schaltfläche gießen, die nur sein wird, um den Drover zu schließen, so wird es ein Block Elemente und auf Klick werden wir unsere Drover in Heather zu schließen, wir gehen zu gießen, fuhr oder Titel und für Drover Titel, wir werden den Edit Room All jetzt, eigentlich, für Drover Body gießen eigentlich, , bevor wir es definieren. Lassen Sie uns diese Komponente tatsächlich innerhalb der oberen Komponenten verwenden. Also lassen Sie uns Index-Zahnräder innerhalb des oberen Ordners und hier innen öffnen. Aber in der Werkzeugleiste Lassen Sie uns dabei Raum VT und Drover verwenden, das ist es. Jetzt in unserem Körper wurden definieren, Elemente eins für Raumnamen und 14 Raumbeschreibung zu importieren und wir werden unsere Edita ble Eingabe verwenden, die wir früher verwenden. Also lasst uns diese Komponente öffnen und dann lasst uns wichtig. Also für Ed Izabal Eingabe müssen wir den Anfangswert übergeben. Also holen wir uns das aus unserem aktuellen Raumkontext. Also hier an der oberen Blacks Board, Name gleich verwenden aktuellen Raum und wir werden Wert Punkt-Namen und das gleiche, was wir für die Beschreibung tun . Also lasst es uns schnappen. Und auch, lasst uns diese Komponente umwickeln, Säugetier. Also lassen Sie mich Memo hier drüben und lassen Sie mich es so importieren. In Ordnung? Jetzt müssen wir unsere Komponenten setzen. Also für den Edit Herbal Import für die erste Eingabe, die über Name sein wird, wir den Anfangswert-Namen übergeben, als wir auf sichere Funktion zur Verfügung stellen müssen und lassen Sie es auf Namen sicher sein . Wie für jetzt, dann werden wir Etikett und Etikett setzen wird Ahh sein, sechs Element mit Klasse. Name außerhalb des Randes, unten zwei. Dann wird es Name sein. Und auch leere Nachricht wird genannt Kann leer sein. In Ordnung. Unsere zweite in Armen wird ein Textbereich im Hafen sein. Also lassen Sie uns die kompetente Klasse beruhigen. Es wird Textbereich stieg standardmäßig fünf sein. Dann werden wir auch Anfangswert als Beschreibung gießen, als wir unsicher setzen werden, was auf Beschreibung sicher sein wird und auch leere Nachricht wird Beschreibung kann nicht leer sein. In Ordnung, jetzt speichern wir es und definieren wir diese Funktionen. Also zuerst werden wir auf Namen sicher erstellen, und dann werden wir eine eigene Beschreibung sicher erstellen. Und weil unsere Funktionalität sehr ähnlich ist, werden wir eine gemeinsame Funktion erstellen, die innerhalb jeder dieser Funktionen aufgerufen wird . So wird es sein, sagen wir, aktualisieren Daten von Tagesdaten, und es wird Schlüssel erhalten. Oder sagen wir Feld, was wir aktualisieren müssen und auch den Wert tatsächlichen Wert, der traurig zu diesem Schlüssel sein wird . In Ordnung, jetzt, im eigenen Namen Save. Wir werden Update-Daten mit dem Namen als Schlüssel und auch neuen Namen aufrufen , der als Argument an diese Funktion übergeben wird, weil wir diesen Handler an glaubwürdige Eingabe übergeben haben . Und wie Sie sich erinnern, wenn wir es öffnen, gibt es uns den endgültigen Wert. In Ordnung, also das gleiche werden wir für die Beschreibung sicher hier tun, wir werden Beschreibung und neu setzen. Sagen wir, Schreibtisch wird ein neuer Schreibtisch. Also innerhalb der Daten werden wir Datenbankobjekt aufrufen. Dann werden wir Verweis auf Zimmer Schrägstrich Raum I D oder Chat i d angeben also werden wir das von der Verwendung Haram greifen. Also lasst uns teilen i d von der Verwendung Programme greifen. Lassen Sie uns schlechter Import an die Spitze. Und dann für diese Referenz, wir angeben, dass Child wird Schlüsselsatz wird Wert sein. Danach. Wenn wir mit dem Schreiben von Daten in die Datenbank fertig sind, werden wir Alarm aufrufen, und wir werden den Erfolg erfolgreich aktualisiert und lassen Sie es für vier Sekunden setzen. Und falls wir einen Fehler haben, werden wir auch Alarm sagen, aber diesmal besser. Und wir werden unsere Botschaft so setzen. Alles klar, sieht gut aus. Lassen Sie uns diesen leeren Raum löschen. Lasst uns sparen und schauen wir uns mal an. Jetzt haben wir diesen A-Button oben rechts. Lasst uns darauf klicken. Wir haben Drover und das erste Problem. Ich sehe, dass wir hier keinen Spielraum haben, also wenn wir inspizieren, können wir sehen, dass, wenn wir die Importgruppe öffnen und wir müssen, Dave hier drüben ist und sie im Grunde keinen Spielraum haben. Also lasst uns unseren glaubwürdigen Import öffnen. Also müssen wir etwas Platz für dieses Def gießen, oder es kann eine Option sein. Also, was ich vorgeschlagen habe zu tun, können wir ein weiteres Argument an glaubwürdige Eingabe übergeben, die Räuber Klassenname sein wird und standardmäßig leer sein wird. Also dann werden wir diesen Rapper-Klassennamen an diesen Dieb Klassennamen übergeben und was wir tun werden Es wird mit verdammten navigieren sagen, Sie waren glaubwürdige Eingabe. Und für Textbereich begann ein spezifizierter Rapper schließen Name wird Rand oben drei sein, um etwas Platz oben darauf hinzuzufügen , lassen Sie uns einen Blick. Jetzt kann ich sehen, dass es gut aussieht. Nun lassen Sie uns tatsächlich einige Daten bearbeiten. Kann neuer Name Rom sein. Und wenn ich sage, wo ich erfolgreich sehen kann, aktualisiert und Raumname wurde aktualisiert. In der Tat. Okay, kalt. Aber es gibt ein Problem uns. Denken Sie daran, mit Räubern sind sie nicht genau ansprechbar. Also, was müssen wir tun? Wir müssen die volle Eigenschaft an diesen robur weitergeben, wenn wir auf mobilen Geräten sind. Also werden wir verwenden Media Query Hook hier oben. Wir geben an, dass sein Handy benutzt wird. Medienabfrage. Und hier werden wir Markierungen mit off 99 2 Pixel angeben. Dann gehen wir vorbei. Dies ist mehr Galle bis zum vollen Eigentum und es wird nur aktiviert, wenn wir auf mobilen Geräten sind . Also, wenn wir es öffnen und wir präzisieren das Fenster, es sieht immer noch gut aus. Okay, das ist es, schätze ich. Jetzt lassen Sie uns unsere Änderungen übernehmen. Lassen Sie die Menschen alles auf die Bühne. Staat ist immer und dann begangen werden. Bearbeitungsraum hinzugefügt. Drover. In Ordnung. Im nächsten Video werden wir unserem Raum mehr Sicherheit hinzufügen, da , wie Sie sehen können , vorerst wir es, wie Sie sehen können, vorersthinzufügen können. Dieser Raum, obwohl wir nicht zugelassen sind, weil wir keine Benutzerberechtigungen haben. Das ist also unser Thema für das nächste Video. Wir sehen uns dort. 131. Role-based und Sicherheitsregeln: Hey, da. In diesem Video verwalten die Menschen unsere rollenbasierte Sicherheit auf bestimmten Füllungen. Wenn wir versuchen, es hinzuzufügen. Zimmerinformation, Los geht's. Also, zuallererst, wie wir unsere Rollen definieren werden. Wenn wir unsere Struktur in Räumen öffnen, können wir sehen, dass wir bei Beschreibung, letzte Nachricht und Name erstellt haben . Also hier werden wir auch eine weitere Eigenschaft hinzufügen, die wird zugibt. Und mit Echtzeit-Datenbank können wir ein Rennen schlecht machen oder wir können. Aber sie sind wirklich schlecht verwaltet, weil von seinem schlechten Abfrage-Builder-System, weil wir von seinen schlechten Abfragen auf der Echtzeitdatenbank unsere Edmonds als Array von Benutzer-IDs setzen. Also, wenn der Benutzer zu diesem Array gehört, bedeutet dies, dass der Benutzer ein Administrator ist und es nicht als Array setzen wird. Wir werden ein Objekt in unserer Datenbank erstellen, und jeder Schlüssel wird Benutzer i d sein. Und wenn dieser Benutzer ein Administrator ist, dann wird es auf true beraten gesetzt. Dieser Benutzer befindet sich nicht in der Datenbank. In Ordnung, also zuerst, was wir tun müssen, müssen wir einen Benutzer zu unseren Daten hinzufügen. Gehen wir zu, sagen wir neuen Raumnamen. Oder vielleicht lassen Sie es uns in etwas Spezifischeres umbenennen. Sagen wir cool, lassen Sie es uns retten. Und nun lassen Sie uns hier durch diese Datenbank navigieren. Wir werden ein neues Feld hinzufügen, das wir zugibt, als wir hier auf Pluszeichen klicken werden. Dann müssen wir unseren Benutzer I d setzen Was wir tun können, können wir zum Profilkontext gehen. Und dann, wenn wir aus Objekt, lassen Sie uns Konsul Ankläger i d unseren Benutzer i d zu bekommen. So jetzt kann ich mich von Benutzer I d gefangen und setzen Sie es in Datenbank und dann setzte Wert auf true und dann auf Raumdaten bearbeiten So sieht es so aus. Nun, um den Zugriff zu beschränken, müssen wir Sicherheitsregeln definieren, so können Sie zu Regeln navigieren. Und hier werden wir das nächste, was für unsere Zimmer Weg tun. Wir werden das richtige Eigentum entfernen, so dass es von hier abgeholt wird, so dass niemand tatsächlich zwei Zimmer Pfad rechts kann , aber sie sind in der Lage, Räume zu lesen als für Zimmer I d. Stattdessen, off schreiben Sie es so. Wir können die Regel nicht neu erstellen, sondern auch für die letzte Nachrichteneigenschaft, die so ist. Wir bringen uns zu beruhigen, oder? Regel sagte, abschalten nicht gleich Nein, Lassen Sie mich für Schlamm es so. Dies liegt daran, wenn Sie sich erinnern, wenn wir Daten an mehreren Stellen aktualisieren, wir aktualisieren auch die letzte Nachricht in unserem Zimmer. Im Grunde genommen kann jeder, der zum Chat schreibt, die letzte Nachricht im Raum aktualisieren, aber nicht andere Felder wie Raum, Name und Beschreibung. Hier werden wir Modelle für genau diese Gefühle definieren, so für Raumidee, wir sind in der Lage, Daten zuerst zu schreiben, wenn die Daten nicht vorhanden sind. Wenn wir versuchen, und Sie Zimmer zu schaffen, werden wir angeben, ob Daten. Diese Daten sind also wieder ein globales Objekt innerhalb von Sicherheitsregeln und stellen die aktuellen Daten dar , auf die wir zugreifen möchten. Also, wenn Daten vorhanden sind, so ist es eine Bowline in der Lage, in diese Vergangenheit zu schreiben, wenn Daten nicht vorhanden sind. Also, wenn wir versuchen, einen neuen Raum mit dem spezifischen Raum I d zu erstellen, oder wenn wir ein Admin sind, dann werden wir in der Lage sein, diese Informationen zu schreiben und zu bearbeiten. Also, wie können wir das tun? So wissen wir, dass wir es unter hinzufügen Männer speichern, dann haben wir Benutzer I d und wahr. Mit einer Datenbank mit Sicherheitsregeln funktioniert es also so. Ich habe die Dokumentation für Echtzeitdaten geöffnet, im Grunde Rituale. Und hier habe ich diese Information beschränkt. Wenn ich ein wenig nach unten scrolle, kann ich diese Informationen finden, auf die ich zugreifen kann, indem ich diesen Ansatz verwende. Also werde ich genau das gleiche Muster verwenden und was ich tun werde. Ich werde fragen, ob Daten, auf die wir zurzeit zugreifen wollen, Kinderzulassungen haben. Dann haben wir in diesem bei Mons Child ein weiteres Kind, das unser Benutzer sein wird. Und wir können es von beiden Objekten bekommen. Also werden wir fragen, ob Kind off dot Ihr i d dot Wert gleich zwei ist. Wahr. Also, wenn wir einen Datensatz für unseren Benutzer in Edmunds gefüllt haben, dann werden wir in der Lage sein, auf diesen Pfad zu schreiben. Jetzt speichern wir es und schauen wir uns mal an. Nun, wenn ich ein Admin von dieser kalten Gruppe bin, werde ich darauf klicken. Ich werde in der Lage sein, es zu bearbeiten, weil wir unseren Benutzer I d in die Datenbank bearbeiten. Nehmen wir an, dass etwas Zufälliges jetzt erfolgreich aktualisiert wird. OK, jetzt lassen Sie uns zu einem anderen Raum navigieren Wenn wir kein Admin sind, Lassen Sie mich versuchen, es zu bearbeiten. Hallo Welt. Wenn ich jetzt versuchen werde, es zu genießen, werde ich heute Nacht Erlaubnis bekommen, damit unsere Sicherheitsregeln funktionieren und das ist ziemlich cool. Und deshalb haben wir jetzt den Zugriff auf unsere Datenbank eingeschränkt. Aber auch wir müssen es programmatisch verwalten, müssen wir Männer usw. hinzufügen. Also lasst uns das auch tun. Also lassen Sie uns navigieren, um Raum zu schaffen, Strand Hand Modell. Und hier wird Wasser tun. Wenn wir einen neuen Raum schaffen, werden wir uns hinzufügen, um Männer hinzuzufügen. Also, hier, wenn wir in Ihren, ähm, Daten definieren ähm, , werden wir auch ein neues Objekt hinzugefügt Beans hinzufügen. Und wir werden uns spezifizieren. Lassen Sie uns an erster Stelle importieren. Ja, es wurde aus dem aktuellen Benutzer importiert, Ihr I d ist auf true gesetzt. Jetzt, wenn wir in Ihrem Zimmer hinzufügen, setzen wir uns als Admin ein. Als Nächstes , müssen wir wissen,wer Adnans genau gehört. So können Sie zu Chatel gs navigieren und hier für einen aktuellen Raum. Wir werden das nächste tun, weil es ein Objekt ist und wir mit I raise arbeiten müssen Idealerweise, wenn wir in unserem Code arbeiten, müssen wir dieses Objekt in ein Array verwandeln. Also lassen Sie uns hier erstellen. Neue, wertvolle Ad-Mons und Insider-Helfer. Wir werden eine neue Funktion definieren, die unser Objekt nur in ein Array transformiert. Wir werden es also genau so nennen, wie wir es mit dieser Funktion getan haben. Aber wir werden sagen, transformieren Sie sich hier einfach in Array. Wir werden Snapshot-Wert wieder erhalten und lassen Sie mich definierte Funktionstastatur, und diese Funktion wird ziemlich einfach sein. Also, wenn Snapshot 12 existiert, dann werden wir Objektschlüssel von diesem Snapshot-Wert zurückgeben, so dass wir ein Array von Benutzer-IDs erhalten . Andernfalls beginnen Sie eine Rückkehr und leeren Sie Sofort sagen wir diese Helfer und lassen Sie uns es im Inneren verwenden. Chatterjee ist hier. Wir werden uns in Array verwandeln. Sagen wir, die heutige Zimmertür Adnans und jetzt haben wir die Verwaltung. Aber auch wollen wir wissen, ob wir derzeit angemeldet sind Benutzer ist ein Admin. Also was? Wir sind zu dir gekommen. Wir können ein neues Wertvolles ist Admin erstellen und wir werden einfach fragen, ob Zulassungen diesen aktuellen Benutzer Punkt Ihrer i d enthalten und wie wir es diese Daten zusammen mit dem Kontext weitergeben können . Also lassen Sie uns passieren, gibt zu und ist admin. Von nun an werden wir in der Lage sein, diesen Drover Onley zu zeigen, wenn wir zugeben. Also, jetzt lasst uns Teoh unser oberstes Teil navigieren. Lassen Sie uns zu Index-Togs innerhalb des oberen Ordners navigieren und aus dem Kontext hören. Wir werden seinen Admin nutzen den aktuellen Raumwert zu greifen. Der Wert ist Admin so. Und jetzt werden wir fragen, ob wir Admin Onley sind, dann werden wir in seinem Zimmer Bt und Drover zeigen. Werfen wir einen Blick in diesen ersten Raum, wo wir der Admin sind. Wir können diesen Drover sehen, und wir sind in der Lage, es hinzuzufügen. Rauminformationen wurden erfolgreich aktualisiert. Aber in dem Raum, in dem wir nicht zugeben, werden wir nicht in der Lage sein, diesen Drover zu sehen. Und auch werden wir nicht in der Lage sein, es zu aktualisieren, weil wir Sicherheitsregeln gesagt. Lassen Sie uns tatsächlich die Sicherheitsregeln kopieren. Und lassen Sie uns sie mit ah, Kriegseinheimischen synchronisieren . Öffnen Sie Datenbankregeln und fügen Sie sie hier ein. In Ordnung. Es scheint gut zu sein. Haben Sie das dort, wo es noch eine Sache an unseren Sicherheitsregeln gibt. Wenn wir unseren Rat inspizieren, können wir sehen, dass wir diese Firebase Warnung haben, dass Ihre Daten niedriger sind und sie bei Ablehnung filtern . Erwägen Sie, den Index auf der Raumidee bei Nachrichten zu beenden. Also lasst uns das machen. Das ist, um unsere Abfragen noch leistungsfähiger zu machen. So können Sie zu Regeln navigieren. Und, lasst uns sehen, erwägen, Index auf Raum I d hinzuzufügen. bei Nachrichten. Lassen Sie uns das kopieren. Und diese Nachricht ist, dass wir es hier drüben so hinzufügen. Jetzt lassen Sie uns probieren und schauen, ob wir diese Warnung noch haben können, okay? Im Moment ist unser Rat klar. Ich sehe keine Warnung. Lassen Sie uns wieder unsere Regeln kopieren und fügen Sie sie ein. Teoh, unsere Datenbank-Regeln, Jason so. Okay, das ist es also für dieses Video. Auf diese Weise werden wir unsere Sicherheit verwalten. Jetzt lassen Sie uns unsere Änderungen übernehmen. Lassen Sie uns bei allem in den Bühnenzustand. Und dann lassen Sie uns Änderungen mit den Update-Sicherheitsregeln für die rollenbasierte Berechtigung übernehmen. Und das ist alles. Alles klar, wir sehen uns in der nächsten. 132. Role-based: Hey, da. In diesem Video werden wir Schaltfläche hinzufügen, um rollenbasierte Berechtigung verwalten zu können. Also, wenn wir auf jemandes Benutzerprofil klicken, wenn wir derzeit sind und waren aus dieser Gruppe, wir sind in der Lage, diesen Benutzer zu erstellen und war auf Let's not get back to code gewesen. Und lasst uns aufmachen, schätze ich. Nachricht Element. Also hier werden wir eine kleine Änderung an Profil-Info, BT und Modell tun. Also lasst es uns öffnen. Und hier wollen wir diese Schaltfläche hier unten anzeigen. Wie können wir das tun? Nun, es ist eigentlich einfach. Wir können einige Kinder an diese Komponente übergeben und sie werden hier angezeigt. Also hier im Seitenprofil in vier Milliarden Modell, wir werden auch d Struktur Kinder und dann die Kinder, die wir in der Fußzeile direkt vor unserem Schließen-Knopf angezeigt werden . Jetzt lass es uns retten. Lassen Sie uns nicht mit einem Nachrichtenelement interagieren. Und hier für Profil in für Betty Anne Morrow, lassen Sie uns einen anderen Boden passieren, so dass dieser Boden ein Blockelement sein wird, und auf Klick wird etwas, das in ein paar Sekunden definieren wird. Außerdem wird es Farbe blau haben und Text wird der nächste sein. Also, zuerst müssen wir definieren, wann diese Schaltfläche angezeigt wird. Vielleicht, lasst uns kommentieren. Und hier lassen Sie uns ein paar schlechte Äpfel kreieren und es zuerst so zum Vortrag bringen. Okay, also müssen wir zuerst definieren, ob wir Admin-Berechtigung erteilen können. Dafür müssen wir unsere kontaktierten Daten erhalten. Also lassen Sie uns Admin von der Verwendung aktueller Raum bekommen. Lassen Sie mich das Auto in den Raumkontext öffnen, dann lassen Sie mich den Haken importieren und vom Wert Begin ein Peak ist admin. Und wir brauchen auch andere Eingeständnisse. Verwenden Sie also den aktuellen Raumwert. Wert gibt so zu. Dann lasst uns unser Nachrichtenelement um Memo wickeln, weil wir Kontextselektor verwenden und hier werden wir das nächste tun. Zuerst müssen wir wissen, ob Nachrichtenautor ein Admin ist. Also lassen Sie uns seine Nachricht Autor Admin erstellen und wir werden Edmunds fragen Inklusive Autor, Autor Tür Sie I d. Dann müssen wir wissen, ob wir der Autor der Nachricht sind, damit wir seinen Autor von Essbar erstellen und wir können uns aktuelle fragen. Lassen Sie uns aus dem aktuellen Benutzerpunkt importieren Ihr I d gleich Autor indoor Sie d mag dies. Und dann können wir eine andere essbare erstellen, die nennen lassen Sie uns sagen, kann Zugriff gewähren oder Admin gewähren. Und wir können Admin-Berechtigung erteilen, wenn wir Mons selbst hinzufügen. Und auch, wenn wir nicht Nachrichtenautoren sind, so können wir jetzt all diese Wertsachen verwenden, um unsere Schaltfläche bedingt anzuzeigen . Also zuerst werden wir arm. Wenn wir gewähren Admin nur getan, wir werden diese unten und auch für die Nachricht angezeigt Wir werden seine Nachricht setzen, Autor admin. Dann sagen wir, Admin-Berechtigung entfernen. Wie sonst werden wir sagen, geben Sie Admin in diesem Raum so etwas. Okay, jetzt, schauen wir mal, was wir getan haben. Lassen Sie mich erfrischen. Nur für den Fall, wenn ich dieses Profil geöffnet, Ich kann sehen geben admin in diesem Raum. Wenn ich klicke, passiert nichts, weil wir keine Funktionalität definiert haben. Also lassen Sie hier navigieren und alle Funktionen, die wir in Nachrichten Komponente gießen werden, und dann werden wir diese Funktionalität an Nachricht Element übergeben. Okay, also für Nachricht Element hier, wir werden sagen, behandeln Admin-Funktion, die wir übergeben werden, dass wir bekommen. Und für diesen Griff admin. Wir werden passieren. Sagen wir, Autor Punkt Ihr I d. Alles klar, jetzt müssen wir diesen Griff Admin von Requisiten bekommen und lassen Sie uns zu Nachrichten navigieren. Und hier werden wir konstante Handle admin definieren, und lassen Sie uns es im Voraus mit Verwendung zurückrufen optimieren, weil wir es an untergeordnetes Element übergeben . OK, so dass dieser Handle admin wird Ihre i d erhalten und dann lassen Sie uns zuerst unsere Edmunds ref innerhalb der Datenbank definieren, so dass wir ein Call-Datenbankobjekt . Dann Referenz wird Räume sein, als es wird Chat I d sein. Dass wir bereits von Gebrauch Dauerwellen haben und dann Schrägstrich voraus. In Ordnung, jetzt müssen wir Chat-Ideen eine Abhängigkeit hinzufügen und hören, was wir tun müssen. Wir müssen unseren vorherigen Wert tatsächlich erhalten, um ihn auszulösen. Wenn wir also auf diesen Button klicken und wir die Erlaubnis erteilen möchten, dann wird es an ihm sein. Andernfalls, wenn dieser Benutzer bereits über die Berechtigung verfügt, möchten wir sie widerrufen. Also tatsächlich, um es mit Echtzeit-Datenbank zu tun, wenn wir seine Dokumentation öffnen, können wir diesen Abschnitt unter dem Lesen der richtigen Daten speichern Estrin Abschnitte sehen. Auf diese Weise sind wir in der Lage, Zugriff auf den vorherigen Wert zu erhalten und wir können ihn aktualisieren. Und am wichtigsten ist, es ist Transaktion. Es bedeutet, dass Daten nicht beschädigt werden. Also lassen Sie uns tatsächlich genau den gleichen Ansatz verwenden. Also lassen Sie mich kopieren all das und was ich dio werde ich nennen erwarten, was diese Ausgabe Rennfunktion umwandeln . Rufen wir Ausweichen hinzufügen Männer Ralf Dar-Transaktion. Dann erhalten wir unseren aktuellen oder vorherigen Wert , der Einlass sein wird und hören, was wir sagen werden. Ich werde den gleichen Code einfügen, den ich kooperiert habe, und hier werde ich fragen, ob Zulassungen existieren . Nur dann werde ich meine Logik ausführen. Also, wenn es gibt, dann möchte ich fragen, ob es zugibt, dass Sie ich existieren. Dann möchte ich den Zugriff widerrufen. Also werde ich zugeben, dass ich es weiß. Und wenn wir Wert setzen, um für Echtzeit-Datenbank wissen, wird es aus der Datenbank gelöscht werden, weil Sie tatsächlich keine Werte dort speichern können. Also, wenn wir nicht die Erlaubnis haben, dann werden wir grunzen. Also voraus, dass Ihr i d auf True gesetzt wird. Lassen Sie uns nun den Rest des Codes entfernen. Und am Ende werden wir wieder zugeben, und es wird sein Ding tun. Richtig? Ruf an. Jetzt müssen wir den Benutzer darüber informieren, ob wir den Zugriff widerrufen oder gewährt haben. Also werden wir Alarmtür reinlegen und was soll hier berichten? Wie können wir angeben, ob wir dafür den Zugriff widerrufen oder gewährt haben? Wir können hier zur Verfügung stellen, dass wir zurücktreten werden. Sagen wir eine Warnmeldung. Also, wenn wir den Zugang widerrufen haben, werden wir Alarmbereitschaft setzen. Nachricht an den Administrator. Berechtigung wurde entfernt. Und für true, beginnen Sie eine angegebene Miller-Nachricht. Administratorberechtigung erteilt, etwa so. Dann werden wir diese Warnmeldung an Alert-Info übergeben, und ich Wir müssen diesen Handle-Admin an Nachrichtenelement übergeben. Also lasst uns Board mit Admin umgehen. Verwalten Sie den Administrator. jetzt Sehen wir unsjetztmal an. Gehen wir zurück zu unserer App. Wenn ich auf diesen Benutzer klicke, geben Sie admin in diesem Raum. Administratorberechtigung erteilt. Jetzt habe ich Admin-Berechtigung entfernen. Wenn ich darauf klicke, sehe ich Admin-Berechtigung entfernt. Lassen Sie uns durch unsere Datenbank navigieren. Finden wir diesen Raum, der Platz für diesen Raum ist. Jetzt. Wenn ich Zugriff erteile, können Sie einen neuen Wert in der Datenbank sehen. Und wenn ich den Zugriff entferne, kann ich sehen, dass er aus der Datenbank entfernt wurde. In Ordnung, ich schätze, das geht alles um Sicherheit und rollenbasiertes Management. Lassen Sie uns tatsächlich unsere Änderungen übernehmen und dieses Video beenden. Aber bevor wir das tun, lassen Sie uns diesen Import nach oben verschieben, und dann lassen Sie uns Änderungen übernehmen. Also komm an alles, dann bekomme Commit und wir sagen hinzugefügt Button, um Admin-Zugriff zu gewähren oder zu widerrufen. Alles klar, Perfect. Wir sehen uns im nächsten. 133. Programmatisch mit Haken hinzufügen: Hallo. In diesem Video werden wir pro Grammatical Hover zu Diagrammelementen hinzufügen, und es wird als Grundlage für kommende Videos dienen. Lasst uns loslegen. Unser Pro grammatical wird jedoch jedoch von einem benutzerdefinierten Haken verwaltet werden, und wir haben diesen Haken im Internet beschränkt. Also lasst uns Google öffnen und lasst uns einfach use hooks eingeben und dann Hover verwenden. Dann öffnen wir den ersten Link, der das Code-Snippet erhalten und lassen Sie uns diesen Hook kopieren. Ich werde all diese Funktion kopieren. Dann komme ich zurück zum Code als in benutzerdefinierten Haken am Ende. Ich werde diese Funktion aufrüsten, und ich werde sie von hier exportieren. Und auch muss ich Entwurf für diesen verwenden. Also lassen Sie mich importiert. Und wie ich sehen kann, habe ich diese unnötige Abhängigkeit. Aber das ist nicht genau wahr. Also lassen Sie uns Ja hinzufügen, Lind, Warnung für diese Zeile. Und lassen Sie uns diesen Haken auch ein wenig ändern, anstatt bedingt die Bereinigungsfunktion zurückzugeben . Lassen Sie uns diese Rückkehr hier bis zum Ende bringen. Alles klar, jetzt sind wir bereit mit dem Haken. Lassen Sie uns zum Nachrichtenelement navigieren und hier werden wir diesen Haken verwenden. Also an der Spitze. Wir werden ein neues Wertvolles schaffen, und wir werden die Verwendung jedoch Hook nennen jedoch . Also diese Verwendung Howard Hook. Es gibt uns ein Array aus genau zwei Elementen, wo das erste Element die Referenz ist, die wir dem Element zuweisen müssen. Also lassen Sie uns selbst Referenz nennen und dann tatsächlich die Aufzählung bewertet, die angibt, ob dieses Element derzeit schwebt oder nicht. Also nennen wir es das Selbst ref und lassen Sie es an dieses L I Element übergeben. Also Referenz wird selbst ref sein. Jetzt können wir tatsächlich diesen Anlagewert verwenden und wir können etwas tun, aber das so für jetzt, was ich vorschlage zu tun, Ich will nur Teoh die Hintergrundfarbe ändern, wenn wir schweben. Lassen Sie uns also schlechte dynamische Clustering für dieses Verbündete Element. Also lasst uns diesen Schrumpfen in Klammern rauben und lasst uns Rincon Trip Begrüßung verwenden. Und zuerst werde ich hinzufügen, Autos sind ein Zeiger auf dieses Verbündete Element. Wir wissen also, dass immer wenn wir schweben, etwas passieren wird. Und dann frage ich, ob unser Verbündeter Howard ist, lass es mich in Harvard ändern. Dann werde ich den Hintergrund schwarz von jeweils 0,2% anzeigen. Andernfalls überhaupt kein Klassenname. nun Wenn ichnunzurück zum Code navigiere, kann ich sehen, dass ich immer dann meinen Hintergrund bekommen kann. Das ist es also. Und das ist das Ende dieses Videos. Lassen Sie uns unsere Änderungen begehen. Lassen Sie uns alles auf die Bühne gestellt blieb. Dann lassen Sie uns mit dem Edit Pro grammatical Hover begehen. Alles klar, wir sehen uns in der nächsten. 134. IconControl - Likes (Teil 1): Hallo in diesen beiden Videos werden wir gerne in unserer Anwendung behandeln. In diesem Video werden wir eine Komponente erstellen, die ein Wrapper rund um die Kontrolle sein wird. Ich komme, dass wir dem Nachrichtenelement hinzufügen werden. Gehen wir, Lassen Sie uns zurück auf den Code und lassen Sie uns zuerst definieren, wie wir diese Komponente verwenden werden. Also lasst uns die Nachricht I eröffnen, Tim, und wir werden sie direkt nach einer Zeit platzieren. Also hier wird eine Komponente haben, so etwas wie ich VT und Kontrolle kann. Und dann diese Komponente Nun, außer in den nächsten Requisiten. Also definieren wir zuerst, ob es sichtbar sein wird oder nicht. Für jetzt, lass es sichtbar sein. Dann werden wir sagen, ich kann nennen und für jetzt, lassen Sie es schwer für unsere Likes sein. Dann werden wir auch Tool-Tipp haben, der so etwas wie diese Nachricht sagen wird. Außerdem wird es einen Handler auf Klick-Handler haben. Also für jetzt, lassen Sie es eine leere Funktion sein und es wird auch eine zwei bedingte Requisiten haben. Also zuerst wird Farbe sein und dann wird es Bankinhalt sein. Schließlich wird es Aikens Aiken schließen müssen und, wie ich zu vermitteln, wie ich kann, wollen wir mit Inhalten geneigt angezeigt werden. Deshalb stellen wir Batch-Inhalte als zusätzliches Problem dar. Und für jetzt, sagen wir, dass fünf mag so etwas haben. In Ordnung. Jetzt lassen Sie uns tatsächlich diese Komponente erstellen und sehen, wie es so aussehen wird, hier Unter Nachrichten, Lassen Sie uns Aiken erstellen, VT. Und Kontrolle. Und lassen Sie uns definieren, wie es aussehen wird, bevor wir ein Markup machen. Lasst uns zuerst die Requisiten greifen, so dass wir sichtbar sind. Dann haben wir auch ich nennen kann. Wir haben Tool-Tipp haben wir auf Klick, und wir haben Badge Inhalt Weg. Andere Requisiten werden wir unter Requisiten speichern. Objekt. Okay, also wird es ein Diff mit Klasse Name der Marge links sein, um sagen wir, Stil wird der nächste sein. Also werden wir Sichtbarkeitsstütze setzen, und es wird auf Lee sichtbar sein, wenn es sichtbar ist, auf wahr gesetzt. Also, wenn sichtbar ist, dann sichtbar, sonst ausgeblendet. Okay, gut in diesem Def. Wir müssen gießen. Nehmen wir an, ein bedingter Batch-Inhalt eine bedingte Komponente, und hier ist ein kleiner Trick. Wie Sie das machen können. Es ist nicht wirklich eine wirklich primitive oder offensichtlich. Sagen wir, nähern wir uns. So erstellen Sie eine bedingte Render-Off-Komponente in einer Komponente. Es ist also der Trick. Zuerst haben wir hier gegossen, und Sie Komponente, sagen wir bedingte Abzeichen wie folgt, wird es eine Eigenschaft erhalten, die wird, sagen wir, Zustand, wo ein Wert, den wir wollte anzeigen. Dann werden wir hier bedingte Abzeichen eingießen und als Requisite wir den Zustand passieren und dieser Zustand wird unser Abzeichen Inhalt sein. Und hier werden wir fragen, ob wir eine Bedingung haben, dann gehen wir in den Krieg mit Inhalten ohne Bedingung, was unser tatsächlicher Wert sein wird. Und dann werden wir in Children so rappen. Sonst werden wir einfach Kinder zurückgeben. Also, ja, das ist der Trick. Und wir müssen auch Kinder von unseren Requisiten holen. Es wird so etwas aussehen, aber ich kann sehen, dass etwas nicht stimmt. Also, was passiert hier weg? Ich habe die Klammer vergessen. In Ordnung, das ist es also. Nun, wenn wir viel Inhalt haben, wird diese bedingte Stapel sonst gerendert werden, wir haben Kinder, das ist der gesamte Inhalt, den wir innerhalb übergeben. Okay, aber drinnen werden wir vergehen. Sporen und Flüstern ist die Komponente aus unserem Anzug, die sie für so etwas wie Werkzeugspitze verwendet haben . Also für ein Flüstern, werden wir passieren. Lasst uns ein Platzierungs-Kotelett. Dann werden wir Delay passieren. Es hat auch eine Verzögerung von null als dilly. Verstecken wird auch Zito sein. Delay Show wird auch Null-Trigger sein wird Holler und Lautsprecher sein. Wir werden Tooltip und Tool-Tip-Nachricht übergeben. Wir werden Schuldeigentum wie dieses in diesem Flüstern übergeben oder für einen Auslöser, wir werden Symbolschaltfläche normale Komponente aus unserem Anzug anzeigen. Und dafür wenigstens Aiken, Button, werden wir zuerst alle Ernte gießen, die wir hier erhalten haben, und dann werden wir auf Klick-Handler haben und wir werden auf Klick übergeben, den wir erhalten. Dann werden wir es sagen, als eine Kreisgröße wird sehr klein sein. Und auch kann ich selbst sein wird, kann ich uns importieren lassen. Und für ICANN werden wir Ikone setzen. Ich kann nennen, dass wir auch als Eigentum erhalten. Jetzt scheint es bereit Inside Nachricht Element. Wir können sehen, dass ich bequem ist nicht definiert. Lassen Sie uns importieren und sehen, wie es aussieht. Also, wenn wir jetzt unsere Anwendung öffnen, haben wir Likes. jedoch Wir habenjedochkeine Farbe. Also, was ich hier vorschlug, wir werden einen bedingten Kragen gießen. Also, wie tragbar, das zu tun? haben wir schon getan. So können wir so etwas gießen. Wir können unser Objekt verbreiten, wenn unser Zustand wahr ist oder wir ein leeres Objekt verbreiten können. In diesem Fall werden wir keine Eigenschaft passieren. Also werden wir so etwas wie wenn unser Zustand wahr ist, dann schütten wir die Farbe rot ab. Und sonst werden wir ein leeres Objekt setzen, damit es funktioniert, und es wird denken. Nun, wenn ich eine frische hatte, können Sie sehen, dass ich rote Farbe habe, wenn der Zustand wahr ist. Sonst habe ich falsch. Okay, gut. So funktioniert es. Und übrigens, wenn Sie sich fragen, wohin es gehen wird, wird es hier für diese Requisiten gehen. Und diese Requisiten werden an Aiken Button weitergegeben. Also im Grunde sagten wir Farbe für diesen Aiken-Button. Okay, Also das ist es für dieses Video im nächsten Video, wir werden die Likes und Handy auf Funktionalität anzeigen. Aber wie jetzt, lassen Sie uns dieses Video beenden, indem wir unsere Änderungen begehen. Führt alles in den Bühnenzustand und bekomme dann Commit. Schöpfer, ich kann VT in Steuerkomponente wie diese. Okay, perfekt. Wir sehen uns im nächsten. 135. Funktionalität gefällt (Teil 2): Hey, da in dieser Video-Blase, fügen Sie Funktionalität auf die Schaltfläche „Gefällt mir“. Lass uns gehen. Lassen Sie uns zuerst zur Datenbank navigieren und sehen, wie wir mit unserer Datenstruktur umgehen werden. In jedem Nachrichtenelement werden wir also zwei neue Eigenschaften erstellen. First Property wird wie Count sein, der die Gesamtzahl aus Likes auf dieser bestimmten Nachricht angibt. Und dann werden wir haben, Nehmen wir an, mag es ein Array von Werten mit den Benutzer-IDs sein, die diese Nachricht mochte. Aber anstatt zu speichern und Ray wollte ein Objekt auf die gleiche Weise verwenden wie wir es mit Rooms gesteht, lassen Sie uns zur App navigieren. Und hier lassen Sie uns das erste Nachrichtenelement öffnen. Hier erhalten wir Handle wie Funktion und dieses Handle wie Funktion. Wir werden es hier an diesen eigenen Click-Handler übergeben. Wir werden dieses Handle wie und für Handle nennen, als würden wir Nachricht Punkt i d übergeben. Okay, jetzt navigieren wir nach unten in Textil gs Und hier, wenn wir erstellen und Sie Nachricht, werden wir eine neue Eigenschaft anhängen wie count, und standardmäßig wird es auf Null gesetzt. Okay, jetzt lassen Sie uns zu Nachrichten navigieren, um dodgy s zu indizieren. Und hier, definieren wir Const Handle wie Handler lässt Rapper in. Er wurde im Voraus zurückgerufen. Und jetzt definieren wir unsere Logik. Wir werden es an Nachrichtenelement auf dem ähnlichen Kerzenlicht übergeben, also wird es die Nachricht I d erhalten und die Logik wird tatsächlich die gleiche sein wie mit dem Handle-Admin, weil wir eine Transaktion verwenden werden. Also lassen Sie uns eigentlich alles von hier gefangen und lassen Sie uns es in Griff wie aber statt voraus, ref, wir gehen zu schlechter Nachricht, ref und Nachricht Ref wird Datenbank Ralf als Nachrichten sein. Und dann anstelle der Chat-Idee, werden wir die Nachricht I d verwenden. Okay, dann müssen wir auch diese Funktion in eine Senkenfunktion für die Transaktion konvertieren, anstatt zuzugeben, dass wir eine Nachricht erhalten. Dann werden wir fragen, ob Nachricht existiert, dann ob Nachricht Punkt mag und Nachricht Dar dich mag , ich d aus unserem aktuellen Benutzer. Also lasst uns es von einem anderen Objekt greifen. Lassen Sie uns den aktuellen Benutzer verwenden und wir werden Sie i d. Also, wenn wir haben, wie von diesem bestimmten Benutzer, dann werden wir zuerst löschen dies wie und auch wir wollen unsere wie Joan verringern. Also lasst es uns reparieren, um Nachricht Dog likes. Dann werden wir die Zählung um eins verringern . Also lass uns Junge, meine Nase ist gleich eins. Eine Warnmeldung wird wie entfernt werden. Okay? Andernfalls, wenn wir gießen wollen und Sie mögen, werden wir eine Nachricht wie Conan Plus gleich eins setzen und weil wir dieses mag Objekt gesagt haben , wissen Sie, es kann nicht in Datenbanken existieren -Community hat das auch gehandhabt. Und wenn wir versuchen, etwas zu nicht-existen Objekt hinzuzufügen, erhalten wir einen Fehler. Also fragen wir zuerst, ob keine Nachricht mag. Wenn wir also dieses Objekt nicht haben, werden wir es als leeres Objekt initialisieren. Also Nachricht Likes wird ein leeres Objekt sein. Und nur dann werden wir im Stande sein, Nachricht zu setzen. DOT mag dein i d gleich der Wahrheit. Und dann wird die Nachricht wie bei ihr sein. Okay, perfekt. Nun sagen wir, warten wir und schauen wir uns mal an. Wenn wir versuchen, auf diese Nachricht klicken, haben wir Transaktion fehlgeschlagen, und dies liegt daran, dass es versucht, wie, Anzahl, nicht vorhandene Eigenschaft für vorhandene Nachrichten zu aktualisieren Anzahl, . Also, was ich vorschlug zu tun, ich möchte all diese Passage Dorf ist nur, um die Datenbank ein wenig aufzuräumen. Jetzt sind wir in der Lage, eine neue Nachricht mit den neuen Eigenschaften zu setzen. Also lasst uns eine neue Nachricht schreiben. Und jetzt hat es fünf wie Count und wir können das in Ordnung bringen. Aber für jetzt, wenn wir darauf klicken und wir können sehen, wie, bearbeiten, wenn wir zur Datenbank gehen, wenn wir unsere Nachricht öffnen, können wir sehen, wie zählen eins und mag enthält unseren Benutzer i d. Und wenn wir noch einmal darauf klicken, können wir sehen, wie Likes verdünnt ist und, wie, zählen solche zu Zito. Okay, perfekt. Jetzt lassen Sie uns tatsächlich reparieren unsere Sie ich nicht vergessen, Artikel hier zu Nachricht. Wir müssen Requisiten übergeben, Teoh, ich kann die Kontrolle haben. Also zunächst einmal, wenn wir Farbe aus rot haben, wenn unsere Botschaft gemocht wird, richtig, Also lasst uns arm ist Licht wertvoll, das hier an der Spitze schaffen const sein Leben und wie wir das definieren können. Also zuerst müssen wir sehen, ob diese Nachricht irgendwelche Likes hat. Also lasst uns greifen, Likes und wie zählen aus unserer Nachricht. Und hier werden wir fragen, ob unsere Nachricht irgendwelche Likes hat. Dann legen wir Objektschlüssel ab. Diese mag Array von User-Ideen zu bekommen und dann können wir schlechte Includes, Lassen Sie uns sagen, aus Dar aktuellen Benutzer, nicht wahr? Auf diese Weise können wir erkennen, ob unsere Nachricht von diesem bestimmten Benutzer gemocht wird. Okay, dann gehen wir vorbei. Dies wird gerne hier angezeigt schwächen. Wir werden es in den Zustand bringen, und dann werden wir die Farbe Rot setzen. Okay, dann haben wir dieses sichtbare Eigentum. Und das ist für die Reaktionsfähigkeit von unseren Botschaften. Wenn wir also unser Fenster rezitieren, landen wir auf mobilen Geräten. Auf mobilen Geräten wollen wir unsere Symbole nicht ausblenden. Wir wollen sie immer anzeigen. Dafür können wir Medienabfrage verwenden, um das zu erkennen. Also zuerst, lassen Sie es hier direkt unter Verwendung Hover wir setzen, ist mobil. Und dann werden wir Media Query verwenden, und wir werden fragen, ob wir Markierungen mit 992 Pixeln haben. Also, wenn wir mobil sind, lassen Sie uns tatsächlich neue lebensfähige erstellen. Dass wir sagen können Aiken zeigen Also, wenn wir haben ist mobil oder wenn unser aktuelles Element schwebt, so werden wir sie nur sehen, wenn wir sie auf der Nachricht haben Nur dann können wir Aikens anzeigen , so für sichtbar Wir werden ziehen kann zeigen, dass ich auf Klick kommt Wir Ich werde gießen und dergleichen und für Bankinhalte statt fünf werden wir unsere aktuelle wie Count setzen Okay, gut. Nun werfen wir einen Blick Wenn wir haben, wo wir sehen können, wir haben Symbol Wenn wir die Größe des Fensters ändern Und wenn wir auf mobilen Geräten waren in der Lage, die Eiken zu sehen . Okay, perfekt. Nun, wenn ich auf diese wie Nachricht klicke, kann ich wie zählen sehen und es wird auch in Farbe off rot angezeigt. Das ist es. Und es sieht ziemlich cool aus. Wieder eine Feuergröße? Zurück zu meiner Galle. Ich kann es immer sehen. Das ist es. Und ich schätze, lassen Sie uns unsere Veränderungen begehen. Lassen Sie mich mein Terminal Lead öffnen Schlecht bekommen an alles, als Handle Nachricht wie OK, Perfekt begehen könnte OK, . Wir sehen uns im nächsten 136. Verzögerung von Löschungen: Hey, da. In diesem Video werden wir Delish in off chap Nachrichten für diese Trümmer bei einem anderen Aiken Bt in Kontrolle zu Nachrichtenelement behandeln . Lasst uns gehen. Lassen Sie uns zum Nachrichtenelement navigieren Dodgy? Ja. Und hier neben „Gefällt kann ich die Kontrolle beginnen. Lassen Sie eine andere Aiken zwischen Steuerung, um die Nachricht zu löschen, und es wird auf Lee, um die Nachricht sichtbar sein . Autor. Also Onley-Nachrichtenautor kann das tun. Also lassen Sie uns das kopieren und lassen Sie uns bedingt machen, dass unsere nächste Aiken die Kontrolle wurde. Wenn wir also Autor von der Nachricht sind, dann werden wir in der Lage sein, das zu sehen. Also brauchen wir keine Farbe. Brad, wir brauchen, ist sichtbar. Ich kann nennen, wird in der Nähe sein. Tooltip wird verzögert Diese Meldung Wir brauchen keinen veg Inhalt. Und für das Entklappen werden wir Griffdill es hinzufügen, dass wir von Requisiten erhalten werden. Okay, ich schätze, wir sind hier fertig. Werfen wir einen Blick, wenn ich, aber ich kann sehen, geliefert diese Nachricht, okay, ziemlich cool. Lassen Sie uns nun nicht zwei Nachrichten in Text-Togs einbinden. Und hier lassen Sie uns diese Funktion definieren. Lassen Sie uns die const Griff Dill es ziehen und schnell im Einsatz zurückrufen im Voraus. Lassen Sie uns auch nicht über Abhängigkeiten vergessen und lassen Sie uns es im Voraus an Nachrichtenelement übergeben. Okay, gut. Dieses Handle Delete erhält also eine Nachrichtenidee als Argument. Also lasst uns es packen und ich werde unsere Logik in erster Linie definieren. Wir werden fragen, ob Sie wirklich beabsichtigen, diese Botschaft zu liefern. Vielleicht hat er einfach nur darauf geklickt. Also werden wir fragen, ob Fenster bestätigen, senden Sie diese Nachricht. Also, wenn Benutzer auf Nein klickt, dann werden wir einfach von Dysfunktion zurückkehren. Dann müssen wir hier ein paar Operationen ausführen, wenn wir die Datenbank aktualisieren. Denn wie Sie sich erinnern, wenn wir absichtliche Nachricht hier drüben, müssen wir auch unsere letzte Nachricht Eigenschaft im Zimmer betrachten. Also müssen wir es auch aktualisieren, und wir müssen eine atomare Operation durchführen. Dazu werden wir ein Update-Objekt erstellen, und dann werden wir unsere Datenbank aus dem Stamm aktualisieren, wie wir es zuvor getan haben. Okay, also lasst uns neue Updates erstellen, Objekt, das für jetzt leer ist. Und dann werden wir erste Updates setzen, als die Leute Nachrichten aktualisieren. Dann werden wir die Nachricht aktualisieren. Ich d Annable sagte es zu wissen, dass es die ursprüngliche Nachricht löschen wird, dass, wenn unsere Nachricht zuletzt ist , wir unsere Zimmerinformationen aktualisieren wollen. Also müssen wir zuerst erkennen, wenn unsere Botschaft verloren geht. Dafür werden wir hier eine neue wertvolle schaffen, die wir nennen, ist zuletzt, Lassen Sie uns es über Updates setzen. Und es wird ein Vergleich zwischen unserem aktuellen Zustand und der Nachricht I D also werden wir uns auf Nachrichten beziehen. Dann Nachrichten Punktlänge minus eins. Wir werden die neueste Nachricht von unserem Zustand Array, dass ich d gleich zwei Nachricht I d ist. Also, wenn das wahr ist, dann sind unsere Nachrichten Lust OK, also hier werden wir fragen, ob unsere Nachricht Lust ist als für diese Updates. Objekt. Wir spezifizieren Schrägstriche Räume, Schrägstrich Chat I D. und dann ist die letzte Nachricht gleich der nächsten. Es wird also das vorherige Objekt neben unserem aktuellen erweiterten Objekt sein. Also müssen wir Nachrichten Punktlänge minus zwei, das vorherige Objekt, richtig? Also werden wir es über die letzte Nachricht verbreiten. Also lassen Sie uns Nachrichten als Nachrichten Punktlänge minus zwei weiterleiten. Und auch wir müssen die Nachricht i d angeben um sich für die letzte Nachricht zu erinnern. Also werden wir auch Nachrichten setzen, Nachrichten über Länge minus zwei Punkt i d. Und weil wir versuchen, Nachrichten Punktlänge minus zwei zuzugreifen, könnte dies jetzt sein oder dieses Objekt kann nicht Existenz sein. Also müssen wir es dagegen überprüfen. So können wir das tun, indem wir einfach hier setzen. Wenn unsere Nachricht zuletzt ist und Nachrichten gedacht Länge größer als ein Onley, dann stellen wir sicher, dass dieses Objekt existiert. Okay, dann ist unser nächster Fall zu überlegen, wenn wir nur noch eine Nachricht im Chatraum haben. Und wenn wir es verzögert haben, wollen wir die letzte Nachricht löschen, ähm, Informationen dafür. Wir werden überprüfen, ob unsere Nachricht verloren geht und Nachrichten Punktlänge gleich eins auf Lee ist. Dann werden wir für die letzte Nachricht Mel Value ziehen, um es zu liefern. Und am Ende werden wir unsere Datenbank aktualisieren. Also lassen Sie uns versuchen, Kage. Schauen Sie hier rüber. Dann werden wir anrufen, warten Datenbank Punkt Entwurf Tür Update mit Objekten und lassen Sie uns in irgendetwas umwandeln Funktion . Und lassen Sie uns auch Array von Abhängigkeiten angeben. Also müssen wir Ideen und Botschaften weiden. Und auch um diese Warnung zu vermeiden, Colettes Unterdrücker so. Und lassen Sie uns auch Warnung hier setzen, um Benutzer zu benachrichtigen, dass wir die Nachricht gelöscht haben. Also Nachricht hat Bean erweitert und nicht Nachrichten Nachricht. Und für jeden Fehler werden wir Alarmtür setzen, Fehler eingeben, aber Nachricht. Okay, sieht gut aus. Jetzt schauen wir uns mal an. Lassen Sie mich ein paar neue Nachrichten hinzufügen. Hallo? Sie sind high. Okay, wenn ich also die allerletzte Nachricht in der Datenbank lösche, kann ich sehen, dass die Rauminformationen aktualisiert werden. Und jetzt habe ich die letzte Nachricht auf dort gesetzt, was richtig ist. Nun, wenn ich es tue, nicht die letzte Nachricht, sondern eine davon. Sagen wir hallo. Ich sehe, dass die letzte Nachricht im Raumelement nicht aktualisiert wurde. Das ist richtig. nun Wenn ichnundie letzte Nachricht lösche, habe ich neue Nachrichten. Und wenn ich nur eine Nachricht in der Datenbank habe und wenn ich diese lösche, habe ich an beiden Stellen noch keine Nachrichten. Okay, das ist also gut. Und so werden wir damit umgehen. Alles klar, lassen Sie uns unsere Änderungen übernehmen und dieses Video beenden. Lassen Sie uns alles vergessen und dann begehen. Behandeln Sie erweiterte Nachrichtenzusammenarbeit. Alles klar, wir sehen uns in der nächsten. 137. Aufladen von Komponente - Teil 1: Heiligtümer. In diesem Video werden wir in Funktionalität für Datei-Upload beginnen. Gehen wir, Lassen Sie uns zu Bottom Ordner navigieren und lassen Sie uns Index togs öffnen. Hier werden wir ein neues Symbol hinzufügen, unten zu unserem Import. Hier auf der linken Seite wird es Modellfenster öffnen und von dort werden wir unsere Dateien hochladen. Also lassen Sie uns eine neue Datei im Inneren erstellen. Dieser Ordner wird es Attachment BT und Moto Gs nennen. Lassen Sie uns armes Hallo drinnen und lassen Sie uns es hier innerhalb von Index-Togs verwenden, kurz bevor die Eingabeelemente Attachment Bt und Moto anzeigen würden. Okay, jetzt definieren wir unseren Markt. Also hier müssen wir in schlechte Gruppe Dar unten gießen, denn wenn wir Importgruppe innerhalb verwenden, müssen wir in Port-Gruppen-Schaltfläche gießen, um zu arbeiten und gut aussehen. Also für diese wichtige Gruppen-Schaltfläche, wir Aiken angeben, was wird Anhaftung sein, jetzt müssen wir, um Sie mit moralischen Zustand umgehen. Also lassen Sie uns verwenden Moto State Haken und lassen Sie uns aufwachsen seine offene nah und offen. Wenn wir also auf diesen Boden klicken, öffnen wir unser bewegliches Fenster. Ok, perfekt. Neben dieser Schaltfläche definieren wir das tatsächliche sterbliche Fenster. Also lassen Sie uns Modell importieren. Und in Moto werden wir Mortal Heather, Körper und Fußzeile angeben . Okay, gut für dieses Modell. Wir werden Show-Eigenschaft angeben, die offen ist und auch auf Höhe, wird nahe für Heather sein. Element innen, wir werden Moto Titel in Mortal Titel gießen wir werden angezeigt werden, sind bodenbelegte Dateien. Und lasst uns diesen Dollar von hier für eine Modellfußzeile entfernen. Wir werden einen Grund befriedigen, um unsere Akten zu applaudieren. Also lasst uns neues Knopfelement eingießen und innen werden wir einen Plourde gießen. Oder vielleicht, sagen wir, zum Chat geschickt. Also für jetzt, es wird nur eine Klick-Eigenschaft haben. Und neben diesem Grund werden wir ein kleines Element anzeigen und darin wird sagen, dass Onley-Dateien weniger als fünf Megabyte erlaubt sind. Und lassen Sie uns dieses kleine Element an der richtigen Seite ausrichten. Und auch, lassen Sie es ein wenig aus Rand oben geben. Okay, lassen Sie es uns retten. Und für Körper, lassen Sie uns Hallo für jetzt angeben. Und nehmen wir einen lokalen, um die Hälfte zu sein. So jetzt können wir sehen, dass wir diesen seltsamen Markt wegen dieser def haben. Wir brauchen sie nicht. Wir müssen reagieren. Fragment. Okay, noch einmal. Jetzt haben wir unten Wenn wir darauf klicken, haben wir diese Art von Moto senden an den Tschad und wo nur Dateien weniger als fünf Megabyte erlaubt sind . Unser applaud Element werden hochgeladen. Komponente wird von reaktiv sein. Also lassen Sie uns nach einer Plodder suchen und gehen Sie zu manuell. Dies ist also die Art der Komponente, die wir aus unserem Anzug nehmen werden. Wenn wir Code-Snippet öffnen, rufen wir P all das auf und lassen Sie es uns im Inneren verwenden. Ah, trage Körper statt hallo. Lassen Sie uns einen Portier importieren. Und hier werden wir aus dem Boden gießen gleich zwei. False als Aktion wird nur eine leere Zeichenfolge sein, weil wir es manuell für unverändertes Ereignis behandeln werden. Wir werden auf Veränderung spezifizieren, Heller, das wird schaffen. Wir werden keine Referenz verwenden, da wir alles manuell behandeln werden. Dann werden wir in der Lage, mehrere Dateien und auch am wenigsten Typ hochladen. Wir werden Bildtext angeben. Okay, jetzt müssen wir unseren Zustand für hochgeladene Dateien behandeln. Also lassen Sie uns hier einen neuen Zustand erstellen, dass wir standardmäßig Namen, Datei, Liste und Dateiliste setzen. Es wird eine leere Rate und diese Dateiliste sein. Wir müssen es an diese applaudierte Komponente weiterleiten. Also lassen Sie uns Dateiliste als Dateilistenstatus übergeben. Jetzt müssen wir dies bei Änderung definieren, Handler. Also lassen Sie uns diese Funktion hier und dieses eine Änderungsereignis erstellen, wenn wir uns Feuerliste gibt , die Typ abgelegt ist. Also haben wir im Grunde Array-Off-Dateien, die wir applaudieren müssen. Aber von diesem Strahl müssen wir ein paar Dinge filtern. Zunächst einmal müssen wir Onley-Dateien zulassen, die weniger als fünf Megabyte an Daten sind. Und auch wollen wir die maximale Anzahl von hochgeladenen Dateien einschränken. Nehmen wir an, 25 Also müssen wir zuerst unsere Größe in Bytes definieren, um sie zu beschränken. Also müssen wir fünf Megabyte Bisse bekommen, um das zu tun. Also hier an der Spitze, lassen Sie uns Max Datei Größe wertvoll erstellen, und hier werden wir setzen Also zuerst werden wir 1000 packen, die einen Biss darstellt. Dann werden wir mit 1024 multiplizieren, um ein Megabyte in Bissen zu bekommen und dann mit fünf multipliziert , um fünf Megabyte Bisse zu erhalten. Ordnung, also in diesem unveränderten Handler lässt es schlecht filtern, sagen wir Wert oder wertvoll. Dann werden wir Datei-Array-Punkt-Filter aufrufen Hier werden wir Element erhalten. Und für dieses Element werden wir fragen, ob dieses Element Blob Datei Punktgröße es uns die Größe der aktuellen Datei kleiner oder gleich max Dateigröße Onley gibt. Dann wird es zu unserer gefilterten A Vergewaltigung hinzugefügt. Außerdem von diesem gefilterten Array, möchten wir von diesem gefilterten Array,dass Onley fünf Elemente greift. Also lasst uns Scheibe setzen und aus der Scheibe werden wir Onley 1. 5 Elemente wie das spezifizieren. Also gleich danach werden wir „Feuerstelle“ nennen und wir werden so gefilterte Einblicke einschenken. Okay, wenn wir sagen, dass wir jetzt sind, haben wir dieses Gleichheitszeichen unten. Lass uns alles retten. Lassen Sie uns zurück zur APP navigieren Lassen Sie uns auf diese Schaltfläche klicken und wir können sehen, dass es nicht voll ist mit. Also lassen Sie uns das schnell beheben für applaudierte sie. Wir werden Klassennamen mit 100 angeben. Welcher Sparer jetzt? Und schauen wir uns noch einmal an. Also, wenn ich auf diese Schaltfläche klicke, gehe ich zum Hochladen, Ich kann sehen, dass es voll ist mit Ich kann mehrere Dateien auswählen. Nehmen wir an, ich werde sie alle auswählen. Aber nur die ersten 5 Dateien werden ausgewählt. 12345 Ich kann sehen, dass es tatsächlich funktioniert. Jetzt muss ich Funktionalität hinzufügen, um den Chat-Button zu senden, um alle von ihnen hochzuladen. Ich kann sie auch von hier aus verwalten. Okay, cool. Also lassen Sie uns erstellen Und Sie, Handler, die unser Handler für diese auf Klick auf Chat-Button sein wird. Lassen Sie uns also, sagen wir, auf einem Plourde wird es in einer Spüle, Funktion und Einsicht sein . Zuerst werden wir, sagen wir, den Ladezustand definieren sagen wir, . Okay, also lassen Sie uns erstellen ist geladen und gesetzt wird standardmäßig geladen. Es wird falsch sein. Und das ist geladen. Wir werden für diesen Boden gießen. Also für Behinderte werden wir setzen ist Laden für auf Klick. Wir spezifizieren uns auf eine Plourde. Und lassen Sie uns auch unseren Applaus oder behindert machen. Wenn wir das schaffen, haben sie deaktiviert. Wann wird geladen? Okay, perfekt. Also für einen Plourde werden wir das nächste tun. Lasst uns ziehen, versuchen fangen Block in erster Linie. So wissen wir, dass wir Dateiliste als Array von Dateitypen haben. Es bedeutet, dass wir mehrere Dateien in unsere Datenbank applaudieren. Also, um mehrere Versprechungen zu behandeln, werden wir Versprechen Punkt All verwenden, aber zuerst müssen wir eine Reihe von Versprechen dafür bekommen. Lassen Sie uns wertvolle Applaud-Versprechungen erstellen und wir werden unser Dateilisten-Array versprechen, um eine Reihe von Versprechungen zu erhalten. So Dateiliste Punktkarte wird abgelegt werden. Dann müssen wir auf unseren Speicher zugreifen. Also lasst uns einen Speicher stellen. Dann werden wir Speicherobjekt von MISC Firebase verwenden. Dann ziehen wir die Referenz, und wir werden sie ausdrücken. Teoh, lasst uns Schrägstrich plaudern. Okay, so wie das. Okay, Jetzt müssen wir Diagramm I D packen , aber es ist sehr einfach. Wir können es mit Cues bekommen, Paramus Hook benutzen Programme. Von hier aus werden wir Diagramm I d React Router bekommen. Lass es uns nach oben bewegen. Und für diese Speicherreferenz, dann werden wir angeben lassen ein Kind. Dann werden wir einen Dateinamen gießen und um mit dem zufälligen Namen zu kommen, können wir einfach Datum ab und zu setzen , sagen wir, Scholle Datei dunklen Namen, um es mehr oder weniger randomisiert zu machen. Okay, dann dass Ihre Plourde, wir werden den Port gießen und wir können tatsächlich diese Blockdatei verwenden, die wir von Dateiobjekten haben . Es wird funktionieren. Okay, also ist es fast so. Aber für diese Datei möchte ich Bargeldkontrolle angeben. Heather, um es in unserem Browser für Port einzahlen zu können, werden wir den zweiten Umfang angeben. Es wird Objekt aus sein, machte eine Daten. Also hier geben wir die Bargeldkontrolle an und wir werden das nächste tun, damit es öffentlich wird und dann das Alter markiert. Wir müssen hier angeben, Max, Alter in Sekunden. Also lassen Sie uns drei Tage in Sekunden angeben. Also lassen Sie es sagen, um die Begeisterung der Reise zu stärken. Und jetzt lasst uns unsere Logik machen. Also zuerst werden wir eine Stunde in Sekunden bekommen, das sind 3600. Dann multiplizieren wir mit 24, um einen Tag in Sekunden zu bekommen und dann mit drei multipliziert, um drei Tage in Sekunden zu bekommen. Ok, gut. Gleich danach. , Vergessen Sie nicht,von dieser Callback-Funktion zurückzukehren. Dann bekommen wir das nächste Ding. Dann werden wir ein const ein Plourde Schnappschüsse, eine Plourde Schnappschüsse, die wir nennen werden erwarten Versprechen Punkt. So werden einstündige Dateien hochgeladen. Wir werden ein Array von applaud Snapshots erhalten. Dann, wie Sie sich daran erinnern, Ihre l 4 hochgeladene Datei öffentlich zugänglich zu machen, wissen Sie, es ist auch ein Versprechen, dass wir Gedo anrufen und die Aura senken müssen. Es ist also ein Versprechen. Also wieder werden wir mit einem anderen Bereich der Versprechen enden. Deshalb müssen wir wieder eine neue Reihe von Versprechen abbilden. Deshalb sagen wir, es wird Formversprechen sein. Und hier werden wir Applaud Snapshots Dot Map nennen und von hier aus bekommen wir Pacing Snap Shirt, und dieses Snap Shirt wird uns das nächste geben. Also werden wir ein Objekt zurückgeben, das Inhaltstyp Snap Shore Metadaten Inhaltstyp sein wird . Dann werden wir Namen haben , der geschnappt werden wird. Shore Meta-Datenpunktname. Es wird Dateiname hochgeladen werden, Dateiname, und dann Ihre eigenen wird ein Gewicht, das wir schnappen kurzen Punkt Referenztür greifen können nicht laden Europa so. Das wird also unsere Daten sein, die wir jetzt in der Datenbank speichern werden, um diese Straße verspricht wir neue wertvolle erstellen, die wir Dateien nennen werden. Dann nennen wir ein Gewichtsversprechen Tochter alles geformte Versprechen, und ich hätte unsere Akten, die wir in unserer Datenbank sagen müssen. Also für die Index-Chirurgie, ja, wir werden eine neue Funktion erstellen, die wir im nächsten Video für out verwalten werden. Rufen wir es einfach im Voraus an. Also von Requisiten hier, werden wir eine Funktion nach einem Plourde erhalten, und diese nach dem Upload wird hochgeladene Dateien verwalten und sagte sie in die Datenbank. Also rufen wir an, warten auf eine Plourde und wegen Dysfunktion werden wir unsere Akten von dieser Struktur weitergeben. Dann nach dem Rückruf, werden wir das Laden auf false setzen. Und auch schließen wir unser bewegliches Fenster so. Und für den Fall, dass wir einen Fehler haben, rufen wir das Laden an. Und dann werden wir die Tür besser mit Fehlerpunktmeldung alarmieren. Alles klar, das ist es für dieses Video. Leider können wir es noch nicht testen. Wir können, aber es wird nur Dateien in diesen Speicher hochladen. Im nächsten Video werden wir also weiter daran arbeiten. Und wir werden diese nach dem Upload Funktion erstellen. Aber wie jetzt, lassen Sie uns unsere Änderungen übernehmen und das Video beenden. Also komm an alles und bekomme dann Commit. Anlage erstellt, unten mit einer Floater-Komponente. Alles klar, wir sehen uns im nächsten. 138. In Teil 2 hochgeladen: Hey, da. In diesem Video werden wir nach Upload-Funktion definieren, die wir im vorherigen Video erwähnt Lassen Sie uns zu Index Togs innerhalb Bottom Folder navigieren und hier unten rechts, bevor wir Markup definieren. Lassen Sie uns nach einem Plourde in Verwendung Callback-Funktion eingewickelt erstellen. Und auch, lassen Sie es bis Abhängigkeiten als leer jeden Also lasst uns dies nach einem Plourde im Voraus passieren . Teoh Attachment Bt und sterblich. Und das nach dem Hochladen empfängt Dateien, die wir brauchen, um innerhalb einer Debatten zu gießen, um diesen Anhang zu erinnern schlagen Moto hat seinen eigenen Ladezustand, und das ist Onley innerhalb Modell. Aber drinnen in Jubel. Ja, wir haben diesmal auch Ladezustand für die tatsächliche Eingabe. Also, kurz bevor wir eine Operation in der Datenbank machen, lassen Sie uns auch sagen, applaudiert auf true inside Index togs. Okay, dann, das gleiche wie für auf gesendeten Klick. Wir müssen eine atomare Operation definieren, also werden wir Aktualisierungen als leeres Objekt erstellen. Und lassen Sie uns diese Logik für sagen wir, vier Nachrichtendaten hier drüben und diesen Push-Schlüssel jetzt kopieren , weil wir mehrere Dateien haben, die wir hochladen müssen und diese Dateien in der Rate sind, die wir Dateien für jeden aufrufen werden, um über jede Datei in Dieses Recht wird die Datei erhalten. Und für jede Akte bekommen wir eine schlechte Nachricht und wir werden auch Nachrichtendaten definieren. Also lasst uns diese Logik von On Send gefangen sein Klicken und setzen Sie sie für jede Datei. Also stellen Sie Nachricht zusammen. Und anstelle von Text, werden wir Datei angeben und für Datei werden wir Datei-Objekt angeben, das wir innerhalb der Anlage BT-Modell erstellt haben , die dieses Objekt ist. Okay, jetzt haben wir die Nachricht I d wir haben Updates mit Nachrichtendaten. Sieht nett aus. Jetzt müssen wir auch übertreffen, wenn ich Lust Nachricht, wie wir hier drüben tun, so innen auf ein paar Klick ist es ziemlich einfach. Nun, da wir haben, sagen wir, dieses Aktualisierungsobjekt, das mit diesen Daten gefüllt ist, wie können wir die allerletzte Nachricht greifen? Obwohl es eigentlich ziemlich einfach ist, dauert es nur einige Zeit, um die Logik zu verstehen. Also zuerst werden wir die letzte Nachrichtenidee greifen, die Objektpunktschlüssel von Updates sein wird und dann von diesem Array aus, sagen wir Nachrichten Idee. Wir werden das allerletzte Element aufknallen, das die letzte Nachricht sein wird. Ich OK, dann setzen wir Updates, Zimmer, chatten ich letzte Nachricht. Und anstelle von Nachrichtendaten werden wir Aktualisierungen letzte Nachricht Idee nennen. Und für die Nachricht I d. Wir geben die letzte Nachricht an. Alles klar, und dann werden wir das kopieren. Alles klar, Versuchen Sie, Block von hier zu fangen, und wir werden es hier drüben setzen. Und lassen Sie uns diese Funktion in irgendetwas konvertieren. Funktion. So aktualisiert eine Datenbank Ref Aktualisierungen. Okay, Said senkt Wir brauchen nicht in Armen und es sieht in Ordnung jetzt, lassen Sie uns eigentlich angeben Array der Abhängigkeit ist mit Chat I D und Profil und jetzt sind wir bereit, es zu testen. Jetzt wir nicht zurück zur APP. Lassen Sie mich auf Datei-Upload klicken. Ich werde alle diese Dateien als geöffnet auswählen. Dann schicke ich sie an den Tschad und sehe leere Nachrichten. Allerdings, wenn wir innerhalb der Datenbank schauen, Ich kann vier neue Nachrichten sehen und wir haben eingereicht, wie, Anzahl erstellt bei wir Autor haben. Und wenn wir Datei öffnen, können wir Inhalt, Typ, Typ, Name und Euro Verweis auf unseren Speicher haben. Das ist es also. Und es hat tatsächlich funktioniert. Herzlichen Glückwunsch im nächsten Video. Wir werden alle Dateien anzeigen, die wir hochgeladen haben. Aber jetzt kommen wir in unseren Veränderungen. Lassen Sie uns alles vergessen. Holen Sie sich Commit und speichern Sie Applauded Dateien in D Data Labyrinth. Alles klar, wir sehen uns in der nächsten. 139. Bilder und hochladen Dateien – Teil 3: Hey, in diesem Video werden wir alle unsere hochgeladenen Dateien anzeigen. Lassen Sie uns gehen, Gehen wir zurück zum Code und lassen Sie uns Nachricht öffnen Bytom Komponente der Ort, wo unsere Elemente gerendert werden. Und hier unten statt dieser Pfanne mit nur Text im Inneren, werden wir bedingtes Rendering setzen. Aber zuerst greifen wir nicht nur Text für die Nachricht, sondern auch, sondern auch, sagen wir Datei Jetzt, in diesem anderen, sind wir in der Lage, bedingtes Rendern zu tun. Also, wenn wir Text in unserer Nachricht auf Lee haben, dann werden wir Steuernachricht anzeigen. Denn wenn wir eine Datei in unserer Nachricht haben, dann werden wir eine benutzerdefinierte Funktion erstellen, um Dateien zu rendern. Also lassen Sie es uns nennen, rendern Dateinachricht und drinnen, wir werden unsere Datei übergeben, dann hier oben aus dieser Komponente, werden wir diese Funktion definieren, rendern abgelegte Nachricht, so dass es die Datei und diese Funktion wird uns standardmäßig nur einen Link zurückgeben. Und in diesem Link werden wir Download-Datei Punktnamen gießen. Wenn unsere Datei kein Bild und für einen treff ist, werden wir die Datei Tür Europa gießen. Ok, gut. Nun, wenn unsere Datei ein Bild ist, speichern wir Inhaltstyp innerhalb der Datenbank, so dass wir gegen diese Eigenschaft überprüfen können. Also, wenn Datei-Inhaltstyp Bild enthält, dann werden wir dif Element innerhalb dieses def zurückgeben, werden wir ein Bild als Schaltfläche gießen. Wenn wir also darauf klicken, öffnen wir das Moto-Fenster. Und auch werden wir diese Bodenansicht Original haben, um uns auf den anderen tippen und die volle Größe zu sehen . Also für diesen Tag, wenn wir Klassennamen von der Höhe bis zu 20 angeben und dann innen, werden wir Bild Bt in Moto erstellen und für das in Dur zwischen Modell, wir Wunden passieren, die abgelegt werden. Ihr l- und auch Dateiname wird abgelegt werden. Name der Ente. Jetzt müssen wir tatsächlich dieses Bild, Schönheit und Moto erstellen . Also innerhalb von Nachrichten. Lassen Sie uns neue Datei Bild VT in Moto Don't Yes erstellen. Und wie immer werden wir ein Model gießen. Aber wir werden es um Reaktionsfragment als innen wickeln. Anstelle der Schaltfläche, werden wir in Port off Typ Bild setzen. Es macht diesen Import fungiert als eine Schaltfläche, obwohl es sich um ein Bild handelt. Also für alternative, beginnen Sie eine diese Datei und für Eigenschaften angeben, wir werden Quell- und Dateinamen angeben. Also lassen Sie uns schlechten Quell- und Dateinamen. Und wie ich sehen kann, habe ich den falschen Dateinamen. Lassen Sie mich es also durch Bild Bt im Sterblichen ersetzen. Und lassen Sie mich es mit Bild Bt und Moto umbenennen. Okay, also importieren Sie das Bild vom Typ für die Quelle. Wir werden die Quelle für auf Klick angeben. Wir werden angeben, dass offene Schulden vom Gebrauch Modellstaat Gebrauch sterblichen Zustand greifen, so ist offen, offen und geschlossen. Und wir werden auch angeben, ob Sie Klassennamen hier drüben, das ist Max mit off 100 max, versteckt 100. Und mit wird Alpha sein. Okay, gut ist so für die Eingabe. Das ist es. Jetzt wollen wir eigentlich Motile definieren. Also lasst uns schlechte sterbliche Komponente als Mortal Door Heather, Körper und Fußzeile, Körper und Fußzeile. Also in Heather, werden wir sterbliche Titel Modell Tür Titel zeigen und wir werden den Dateinamen hineingießen und uns auch mit Todesfällen befassen. Und das jetzt in Essen er wir werden nur einen Link zu einem externen Wasserhahn angeben. Also werden wir ein und ein treff wird Quelle sein und wir werden Teer angeben, leer für die neue Registerkarte. Und wir müssen auch Beziehung spezifizieren. Kein Öffner, kein Rap Ferrer. Ja, so schätze ich. Und diese Komponente ist nicht selbstschließend. Wir werden die ursprüngliche Ansicht innerhalb und innerhalb der Ansicht Modell Körper würde das eigentliche Bild anzeigen . Also lasst uns ein Bild-Tag Dan setzen, für Wunden. Wir werden Wunden spezifizieren. Und für die Höhe, sagen wir, 104 mit, Sagen wir, auch 100 aus wird lassen Sie es Datei. Okay, jetzt lassen Sie uns verwenden Dies ist offen für Show Eigenschaft auf Höhe wird in der Nähe sein und es sieht OK jetzt lassen Sie uns diesen Import nach oben und innerhalb der Nachricht Element verschieben. Lassen Sie uns diese Komponente importieren. In Ordnung, jetzt schauen wir uns mal an. Wenn ich die App aktualisiere, sehe ich nicht laden Datei, Name, Download, Dateiname und ich kann Bilder sehen. Also lassen Sie uns schnell zu beheben sagte Statt dieser Klammern, lassen Sie uns beide geschweiften Klammern. Und jetzt werfen wir einen Blick, so dass wir tun, diese Datei laden. Ich kenne diese Akte nicht. Wenn wir darauf klicken, werden wir tatsächlich anfangen zu downloaden, und ich sehe immer, dass wir Bilder haben und wenn wir darauf klicken. Wir haben diese Ansicht original, und wenn wir darauf klicken, kommen wir zum neuen Hahn. Okay, es sieht ziemlich gut aus. jedoch In Lust Nachrichten haben wirjedochleeren Raum, also lasst es uns schnell reparieren. Lassen Sie uns zu Ihrem Raumelement navigieren und hier innerhalb der letzten Nachricht Text. Lasst uns das nächste setzen. Also, wenn wir keinen letzten Nachrichtentext haben, dann werden wir die letzte Nachricht Punkt Datei Punkt Name angeben und das war's. Jetzt schauen wir uns mal an. Wir haben einen Dateinamen, okay, ziemlich cool. Und das ist es im Grunde. Lassen Sie uns nun dieses Video beenden und unsere Änderungen übernehmen. Lassen Sie uns alles vergessen. Holen Sie sich Commit und lassen Sie uns sagen, hochgeladene Dateien für die Tat anzeigen. Wir sehen uns in der nächsten. 140. Audio-Nachrichten Record und hochladen – Teil 4: Hallo. In diesem Video werden wir eine Option zu einem Plourde User Recorings direkt aus dem Browser hinzufügen, so dass wir in der Lage sein, Audio-Nachrichten an den Chat zu senden. Lasst uns gehen. Also, wie werden sie damit umgehen? Nun, da wir bereits den Code für den Datei-Upload haben, wird es relativ einfach sein. Wir müssen nur einen Weg finden, wie man die Stimme des Benutzers aufzeichnet. Dafür. Wir werden React benutzen, Mike Library. Es ist eine Bibliothek, die Benutzerstimme aufnehmen und dann visualisieren bietet. Aber wir werden diese Visualisierungsoption nicht verwenden. Wir brauchen nur die Aufzeichnung. Also lassen Sie mich diese Bibliothek installieren. Ich werde diese Empfehlung nur kopieren, als in mehr Terminal. Ich werde es hinrichten. Und während es unter Bottom Ordner ausgeführt wird, lassen Sie uns neue Datei pflanzlichen Namen erstellen. Sagen wir Audio-Nachricht Bt in doggy esque. Denn jetzt wird es nur ein leerer Deve sein. Und lassen Sie uns diesen Index-Togs unten verwenden. Also hier, direkt nach der Anlage, Beat und Moto Lassen Sie uns Rodeo verwenden meine sagte, Sie sind TTN und auch lassen Sie uns nach dem Upload übergeben, weil wir Audio-Nachrichten hochladen werden. Also innerhalb dieser Komponente, werden wir nach dem Upload erhalten. Und jetzt lassen Sie uns unseren Markt gut definieren. Es wird fast das gleiche wie für die Befestigung schlagen Moto sein. Also lassen Sie uns Eingabegruppe unten von hier kopieren und als unser Markt eingefügt. Also dann lassen Sie uns importieren Importgruppe Schaltfläche für entclipped. Wir werden unseren eigenen Handler haben und lassen Sie uns auch das Symbol importieren. Und denn ich kann mein Krähentelefon benutzen? Okay, gut. Nun, wie wir in der Lage sind, dies zu verwenden, reagieren meine Kleiber Lassen Sie uns zur Verwendung und zum Beispiel gehen. Also lassen Sie uns das Importteil kopieren und es hier oben platzieren. Dann lassen Sie uns tatsächlich die Komponente verwenden. Und schauen wir uns an, welche Art von Requisiten wir passieren müssen. Also zuerst haben wir diesen Datensatz, und wenn ich auf dem Grundstück schweben, sagte zu wahr Aufnahme beginnen. Also brauchen wir den Staat, um zu kontrollieren. Wenn wir mit unserer Aufzeichnung beginnen wollen, lassen Sie uns eine erstellen. So wird es sein, ist Rekord in. Bullen wird standardmäßig aufgezeichnet, es wird auf false gesetzt und wir werden diesen Zustand übergeben, um Eigenschaft aufzuzeichnen, die für Klassennamen , wir werden Anzeige keine setzen, um irgendein reagierendes Mike Element anzuzeigen, aber um ihre -Funktionalität. Also, für einmal, hör auf. Dies wird unser Handler sein, wenn wir die Aufzeichnung haben und wir es hochladen möchten. Dafür werden wir auf einem Plourde-Handler erstellen. Also lassen Sie uns eine Plourde anziehen und im Voraus werden wir es in Gebrauch zurückrufen. Also, lassen Sie es jetzt leer lassen und auf Daten, wir brauchen das nicht, denn wenn wir zur Verwendung scrollen, können wir sehen, dass, wenn Daten es optional ist, aufgerufen wird, wenn eine Kanalhustenreihenfolge verfügbar ist wir brauchen das nicht. Wir brauchen keine Wurffarbe und Hintergrundfarbe, weil wir diese Komponente einfach nicht anzeigen , die wir auch übergeben müssen. Ich meine, tippen Sie auf diese Komponente, um sicherzustellen, dass wir MP 3 erhalten. Ehemalige. Also lassen Sie uns meinen Typ passieren und dann lassen Sie uns Audio MPA drei beruhigen. Okay, jetzt gut, bereit zu gehen. Also zuerst, lassen Sie uns dies beim Klicken definieren. Also lassen Sie es uns hier im Laden setzen und optimieren wir es mit Verwendung kalt zurück im Voraus weil wir einfach Said ist geladen anrufen und wir werden unseren Bullen Wert hier umkehren . Okay, jetzt gut für beim Hochladen, wir werden die nächste Logik gegossen. Es wird korrelativ Lee das gleiche wie innerhalb von Attachment BT und Moto sein. Also müssen wir Speicher referenzieren, damit wir diese Logik von hier kopieren können, als wir sie hineinlegen werden . Versuchen Sie es hier zu fangen. Wir werden dieses Applau-Versprechen kurz bekommen. Also müssen wir es in eine Senkenfunktion konvertieren. Also Speicherreferenzprüfung, ich d. Lassen Sie uns auch Chat I d. Von der Verwendung Paramus Haken als für die Lagerung greifen . Wir müssen es von ISC Firebase importieren, als für Kind für Dateinamen, die wir gegossen werden. Nicht dieser Dateiname, aber wir werden einfüllen. Sagen wir, Audio als Unterstreichung. Und dann öffnen wir String-Interpolationsdaten ab und zu am Ende, wir werden Tochter MP drei als für Blob-Datei setzen. Was müssen wir für die eigentliche Datei angeben, wenn wir reagieren? Mike on stop Eigenschaft gibt uns diese Aufzeichnung von Daten. Da wir Javascript verwendet haben, haben wir keine Typen. Und wir können nicht überprüfen, welche Art von Daten wir hier erhalten. Aber was wir tun können, können wir tatsächlich eine Funktion direkt hier drüben setzen, um die Intelligenz zu bekommen. Also erhielten wir diese Daten hier drüben. Und wenn ich Daten Dar setze, kann ich Blub hier drüben haben. Dies ist also ein Typ von Objekt entwickelt, das wir in Firebase-Speicher hochladen können. Also lassen Sie uns Daten Hund Blow Cash Control setzen. Wir werden es so lassen, wie es jetzt ist. Wir müssen auch die eigentliche Datei angeben, die wir innerhalb der Datenbank setzen, nicht innerhalb des Speichers. Also lasst uns es von hier aus greifen Befestigung, bt und Modell. Ich werde diese Objektstruktur kopieren. Dann werde ich eine wahre Datei erstellen und dann werde ich sie so platzieren. Also Snapshot, Mediendaten. Hugh R L Okay, gut. Jetzt müssen wir eigentlich Onley nach einem Plourde mit einer Reihe von Dateien anrufen, die wir applaudieren wollen , weil wir nur eine haben. Wir können nur ein leeres Array setzen und dann unsere Datei hineinlegen. Also, jetzt haben wir eine Art von Rate, richtig. Also für alle Fehler, werden wir Warnung Dar Fehler Fehler Punkt Nachricht dann für Bereich der Abhängigkeiten setzen. Wir gehen nach dem Hochladen vorbei und teilen ich . Außerdem müssen wir eine Art von einem Ladezustand definieren. Also lasst uns neue lebensfähige Schulden schaffen. Wird sagen, ist das Hochladen Lassen Sie es sagen, applaudiert. Standardmäßig wird es falsch sein und wir werden diese Funktion direkt vor einem Plourde aufrufen und auf true setzen. Also nach Applaus oder vielleicht direkt davor, wir werden sagen, ist applaudiert auf false und auch im Falle eines Ackerbaus auch Satz genannt wird auf falsch applaudiert . Also jetzt zu Eingabegruppe Bt und wir können deaktiviert Onley übergeben, wenn hochgeladen wird. Und wir müssen unseren Benutzer irgendwie benachrichtigen, wenn wir die Aufzeichnung machen, damit er das verstehen kann . Ok, deine Stimme wird dafür aufgezeichnet. Wir werden einen bedingten Klassennamen ziehen. Also, wenn wir Aufzeichnung haben, dann werden wir jeden Kumpel Blinzeln angeben. Und das ist der Klassenname mit der CSS-Animation, die ich in einer der CSS-Klassen definiert habe . Jetzt sieht es gut aus und alles andere sieht gut aus. Jetzt können wir die Funktionalität testen. Ich habe es nicht gestartet, also lassen Sie mich die AB ausführen, jetzt können wir sehen, wie der Entwicklungsserver gestartet wird. Okay, warten wir ein paar Sekunden, bis die APP ausgeführt wird. Okay, ist geladen. Jetzt versuchen wir, das aufzuzeichnen. Also, wenn ich diesen Knopf drücken, können Sie sehen, dass jetzt, hier habe ich Diese Registerkarte ist mit Ihrer Kamera. Wir mikrofonen dieses Symbol. Und auch, wenn ich nicht meine Erlaubnis hätte, Mikrofon zu benutzen, hätte es mich darum gebeten. Und jetzt werde ich benachrichtigt, dass meine Stimme es jetzt aufnehmen wird. Wenn ich also noch einmal auf diesen Button klicke, kann ich sehen, dass ich hier einen neuen Datei-Upload habe. Und wenn wir in die Feuerbasis gehen, als in den Tschad, dann können wir all unsere Akten haben. Und auch Audio-Nachricht. Okay, das ist es also. Im nächsten Video werden wir darüber sprechen, wie wir in der Lage sind, diese Audio-Nachricht in der ersteren anzuzeigen, die direkt schwächen . Hören Sie sich diese ältere Nachricht im Browser an, Aber für jetzt, lassen Sie uns unsere Änderungen zu begehen. Lassen Sie mich anrufen, bekommen Sie alles, dann, wer begangen hat und lassen Sie uns angeben, zusätzliche Option, eine Option zum Aufzeichnen und eine schlechte Audio-Dateien. Alles klar, wir sehen uns in der nächsten. 141. Audio- und Delete Teil - Teil 5: Hey, da. In diesem Video werden wir hochgeladene Benutzer-Audiodatensätze anzeigen. Und auch werden wir ein weiteres Problem beheben, das auftritt, als wir mit dem Datei-Upload begannen. Lassen Sie uns nie zurück zum Code und öffnen Sie uns Nachricht Element den Ort, wo wir unser Element rendern . Also hier überprüfen wir gegen die Zeit der Inhaltsdatei. Also lasst uns hier noch eine if-Aussage hinzufügen und wir werden gegen Audios überprüfen. Also werden wir eine Akte fragen. Inhaltstyp umfasst Audio. Also, wenn dies der Fall ist, werden wir ein Audio-Element zurückgeben, so dass für diese Reihenfolge in der Lage sein wird, Steuerelemente zu verwenden. Und lassen Sie uns auch schlechtes Quellelement es wird ein selbstschließendes Element sein. Quelle wird eingereicht werden, Herr, Herr, Ihr L und Typ werden odio MPA drei sein. Und wenn dies vom Browser nicht unterstützt wird, dann werden wir zeigen, dass Ihr Browser das Audio-Element nicht unterstützt. Ok? Und lasst uns Odeon von hier entfernen. Und jetzt haben wir in diesem Jahr verschlankt Warnung Medienelemente wie ein Audio muss eine Spur für Untertitel haben . Das ist in Ordnung, aber wir haben keine Cop Schienbeine. Deshalb müssen wir diese Warnung deaktivieren. Lasst uns das machen. Speichern wir es und lassen Sie uns diesen Unterdrücker bewegen. Jetzt können wir sehen, dass wir diesen Track haben, damit wir ihn spielen können. Ich kann meine Stimme hören, so dass sie tatsächlich funktioniert und das ist es für Audio-Nachrichten. Es war ziemlich einfach jetzt über andere Probleme, die entstehen, wenn wir begannen, mit Philip Oumzugehen Philip O Wann war krank ID die letzte Nachricht oder eine der Nachrichten mit Dateien, als wir es nur tun Nachricht innerhalb der Datenbank. Dateien aus dem Speicher werden jedoch nicht verdünnt. Was ich meine ist, lassen Sie mich versuchen, diese ältere Nachricht zu löschen. Wenn ich also das lösche, das ich in den Speicher gehe, aktualisiere ich es. Ich kann sehen, es ist ihr zu stehlen, um das zu beheben. Wir müssen unseren Mantel reparieren. So können Sie zurück zu Index-Togs navigieren. Inside Botschaft ist der Ort, an dem wir liefern. Unsere Botschaft ist, so dass dies Dorffunktion behandelt wird. Also hier müssen wir irgendwie auch Datei delish ausführen, wie tragbar das zu tun. Also innerhalb der Nachricht Element, wenn wir anrufen, lassen Sie es uns finden. Wenn wir behandelt aufrufen, gelöscht, wir übergeben Nachricht i D. Allerdings wissen wir nicht, ob diese Nachricht eine Datei hat oder es ist nur eine Textnachricht. Also lassen Sie uns auch eine schlechte Datei zu diesem Handle Löschfunktion. So, jetzt wissen wir, dass, wenn es eine Datei so innen, wie bis der Deckel wir auch Datei erhalten und direkt nachdem wir dill es Nachricht innerhalb Datenbank. Wir können auch noch einen Versuch machen, Block hier rüber fangen, und wir können das nächste tun. Also, wenn wir eingereicht haben, dann werden wir diesen Try Catch-Block hier drin setzen, und wir werden zuerst den Verweis auf diese Datei in der Firebase-Geschichte greifen, damit wirsagen wir , abgelegt rau nennen können sagen wir , . Wir können Speicher als Referenz aus Ihrer Hölle abrufen und gibt es Versprechen zurück oder nicht wissen, es scheint nicht so Referenz von Ihrem L. Und dann werden wir die Datei Tür angeben, Sie sind raus. Dann können wir einfach Datei Ref Door Dill es nennen, also wird dies definitiv ein Versprechen sein. Und im Falle eines anderen, werden wir Alert jemals Alarm Fehler angeben. Und hier ist ein sehr wichtiger Moment zu fangen. Stellen wir uns vor, wir liefern die Botschaft und das scheitert. Also, wenn das scheitert. Dadurch wird versucht, die Nachricht zu löschen. Um sicherzustellen, dass, wenn dies fehlschlägt, auch der nächste Code fehlschlägt. Wir müssen von diesem Catch-Block zurückkehren, wenn wir einen Fehler haben. Also, jetzt haben wir dies eine Senke bei einer Funktion, die keinen Rückgabewert erwartet. Wir können die noch einmal die Ja, Lind Warnung für die gesamte Datei unterdrücken . Und jetzt sieht es gut aus. Also lassen Sie uns zuerst manuell löschen diese Geruchsmeldung, die wir sie aufzeichnen. Und wenn ich versuche und erweitert die neueste Nachricht hier drüben, wenn ich erweiterte Nachricht gelöscht wurde. Und wenn Sie in meine Datenbank schauen, habe ich zwei Bilder. Aber wenn ich mich jetzt erneuere, habe ich nur einen. So wurde alles erfolgreich behoben. Okay, jetzt lassen Sie uns unsere Änderungen begehen. Lass uns alles bekommen, dann bekommst du Commits. Nehmen wir an, angezeigte Audio-Nachrichten und Fix File delish in, wenn Nachricht zugestellt wird . In Ordnung. Perfekt. Wir sehen uns in der nächsten. 142. Group nach Daten: Hey gibt es in diesem Video mobile Gruppen-Chat-Nachrichten nach Datum, so dass wir in der Lage, Chat passen in datumsbezogene Nachrichten aufgeteilt. Okay, lass uns nie wieder zum Code zurückkehren und mal sehen, wie wir uns dem nähern werden. Also zuerst brauchen wir eine Art Funktion, die unsere Nachrichten nach Daten gruppiert. Also lasst uns eins erstellen. Öffnen wir Helfer Togs. Und hier unten, lassen Sie uns neue Funktion erstellen, die die Gruppe kaufen benennen Es wird ein Array als erstes Argument erhalten , und dann wird es Gruppierung Schlüsselfunktion erhalten. Es wird ein kalter Rücken und lassen Sie mich erklären, wie wir dieses Mädchen mit Funktion benutzen werden. Also werden wir es so nennen. Das erste Argument werden wir Nachrichten übergeben, Array und dann Gruppierung. Schlüsselfunktion ist ein Rückruf, der ein Element aus diesem Array erhält. Also in unserem Fall Nachrichtenelement, dann wird alles, was wir von diesem Callback zurückkehren, unser Gruppierungsschlüssel sein. Also in unserem Fall ist es Datum. Also werden wir die Nachricht abgeben, die ich bei so etwas erstellt habe. Dann ist es gewachsen, wird uns ein Objekt zurückgeben, bei dem jeder Schlüssel dieser Gruppierungsschlüssel sein wird, den wir von diesem Rückruf zurückgeben. Also, wenn wir das Datum zurückgeben, dass es US-Nachrichten nach Datum gruppieren wird. Also lassen Sie uns so etwas sagen, wir haben ein Datum wie dieses und dann werden wir Array aus Nachrichten haben die sich auf dieses Datum beziehen und so weiter, und so eine. Okay, ich schätze, das ist klar. Jetzt lassen Sie uns diese Funktion erstellen. Lass mich ungewöhnlich, Dad, und wir werden Array-Punkt reduzieren, damit es nicht reduziert wird, einen Rückruf erhält. Und zweites Argument ist der Anfangswert des Zustands. Es wird also nur ein Objekt sein. Und für das co zurück erste Argument ist Akkumulator, wir werden ein Ergebnis verwenden, und dann der aktuelle Wert aktuelle Element gerade zu dem Element geht in Ordnung von jeder Iteration werden wir Ergebnis zurückgeben und dann werden wir das nächste tun zuerst, wir gießen Gruppierungsschlüssel wertvoll, und wir werden Gruppierung Schlüsselfunktion aufrufen und wir werden Element Einsicht übergeben. Auf diese Weise werden wir in der Lage sein,auf Nachrichtenelement innerhalb dieses Rückrufs zuzugreifen. Auf diese Weise werden wir in der Lage sein, Okay, gut. Jetzt werden wir gegen das Null-Tal oder das nicht existierende Tal überprüfen. Also, wenn Ergebnis Gruppierung Schlüsseleigenschaft nicht existiert, dann werden wir es wie sonst initialisieren. Wir erhalten eine Warnung oder einen Fehler, wenn wir versuchen, etwas auf nicht vorhandenes Objekt auszuführen . Also werden wir den Ergebnisgruppierungsschlüssel setzen und dann werden wir es als leeres Array zitieren. Ordnung, dann, wenn das existiert, dann werden wir das Ergebnis Gruppierung Schlüsselpunkt Push aktuelle Element setzen und das ist es. Jetzt sind wir in der Lage, es zu benutzen. Lassen Sie uns Nachrichten öffnen, indexieren Togs, und lassen Sie uns den Ort finden, an dem wir Nachrichten rendern. Also gerade jetzt ist es nur diese Kartenfunktion hier drüben. Lassen Sie uns es tatsächlich kopieren und erweitert. Und anstelle dieser Kartenfunktion gehen wir zu unseren eigenen benutzerdefinierten funktionalen Rendernachrichten. Der Tod wird erschaffen. Also hier lassen wir const grander Nachrichten und es wird eine Funktion sein, und innerhalb davon wird diese Nachrichtenkarte setzen. Aber lasst es uns vorerst kommentieren. Und hier werden wir Gruppe von so nennen, lasst uns arme const Gruppen. Dann werden wir gruppieren durch anrufen. Wir werden Nachrichten unseren Zustand des ersten Arguments übergeben und dann in Schlüsselfunktion gruppieren, so dass es Nachrichtenelement und Problemgruppe nach Daten erhalten wird. Also, um Element zu spezifizieren erstellt, aber erstellt Anzeige zu erinnern, es ist nur ein Datenbank-Zeitstempel. Es ist kein Datumsobjekt, das wir verwenden oder in JavaScript anzeigen können. Also lassen Sie uns es in ein spätes Objekt konvertieren, und dann passen wir an diesem Datum Objekt mit dem Datum String an. Alles klar, jetzt haben wir Gruppen und wir müssen Elemente erstellen, die wir in J sechs innerhalb Hund schieben und anzeigen . Lassen Sie uns also Objektschlüssel erstellen, dann Gruppen und für jede Methode angeben. Also, was hier passiert, dass wir jedes Datum durchlaufen werden, jeden Schlüssel innerhalb des Gruppenobjekts. Also werden wir uns hier und für jeden Tag verabredet haben. Zuerst werden wir Elemente Array erstellen. Also lassen Sie es Elemente lassen, die wir ändern werden. Und für diese Gegenstände, zuerst, werden wir unser erstes Element drängen. Das wird ein Date sein. L I Element. Also lassen Sie uns neue l I innerhalb Rebel angezeigt Datum und Klassenname wird Text Center Rand wäre nicht eins und Pad und auch müssen wir Schlüssel angeben, die Datum sein wird, und es ist einzigartig in diesem. Gruppen arrangieren. In Ordnung. Nun müssen wir auch alle Nachrichten zu diesem bestimmten Datum übertragen, damit wir neue Nachrichten erstellen können . Jeder und wir werden diese Kartenfunktion hier drüben benutzen. Also werden wir Gruppen Datum gießen, um auf alle Nachrichten zuzugreifen, die zu diesem bestimmten Datum, über das wir gerade iterieren. Also gruppieren Sie ST-Punkt-Karte und wir werden jede Nachricht dem Nachrichtenelement von hier aus zuordnen. Lassen Sie es uns kopieren und löschen Sie es. Wir brauchen es nicht mehr, also werden wir es so kartieren, und ganz am Ende werden wir einfach Gegenstände verdunkelte Katze nennen und dann Nachrichten, Ordnung? Und das ist es eigentlich. Und am Ende dieser Funktion werden wir Gegenstände zurückgeben, und sie werden zum Dummen gerendert. Es heißt also, dass Artikel nie zurückgetreten werden. In Ordnung, also lasst uns const setzen, Speichern wir es und schauen wir uns mal an. Wenn wir navigieren,sehe ich keine Nachricht. Wenn wir navigieren, Lassen Sie mich etwas andere Syntax versuchen. Nun, wenn wir frisch sind, können wir Aikens haben. Okay, also lasst uns das benutzen statt Dose cat. Also, was wir hier tun, um alle unsere Artikel in Push zu verteilen. Also werden sie als separate Argumente behandelt, um zu schieben. Also, anstatt Cower-Nachrichten wie diese zu übergeben, haben wir sie so weitergegeben. 12345 Alles klar, das ist also, was dieser Spread-Operator in diesem Fall tut. Okay, also jetzt haben wir, sagen wir, Donnerstag, 18. Juni, wenn ich Hallo setze. Jetzt habe ich den 19. Juni, so dass es tatsächlich funktioniert. Und jetzt haben wir diese hübsche kleine nette Gruppierung. In Ordnung, das ist es also. Und ich schätze, wir sind hier fertig. Lassen Sie uns unser Video beenden. Lass uns eingießen, alles holen, dann bekommst du ein bisschen. Und lassen Sie uns gruppierte Nachrichten nach Datumsangaben für die Wirkung angeben. Wir sehen uns im nächsten. 143. Pagination und Kontrolle der Position: Hallo. In diesem Video werden wir die Paginierung innerhalb des Chats behandeln. Im Moment laden wir alle Nachrichten aus der Datenbank und das ist nicht wirklich gut. Also in diesem Video werden wir das Zahlen und auch wir werden dieses Problem beheben. Wenn wir die Seite aktualisieren oder zwischen Chats wechseln, werden wir nicht nach unten scrollen. Lass uns gehen. Die Frage ist also, wie Sie mit der Paginierung in Firebase umgehen können? Nun, es gibt ein paar Ansätze und die häufigste ist nur Sie wieder Teoh neue Chat-Nachrichten abonnieren Jedes Mal, wenn wir einen neuen Teil laden, Dies ist der Ansatz, den wir nehmen. Wir können einen anderen Ansatz Teoh nur alte Nachrichten auf dem ursprünglichen Herrn senken und dann neue Updates abonnieren. jedoch nicht funktionieren, Dieser Ansatz wirdjedoch nicht funktionieren,denn wenn wir alte Nachrichten einmal auf Lee laden und wir eine der Nachrichten aktualisieren , wird sie nicht in Echtzeit aktualisiert. Das ist also nicht unser Fall. Wir wollen alle Nachrichten aktualisieren, und sie alle müssen in Echtzeit sein. Deshalb werden wir den ersten Ansatz verwenden. Also können Sie zu Index Punkt gs innerhalb von Nachrichten navigieren und hier oben, wir werden zuerst unsere Größe für die Seite angeben. Lassen Sie es Seitengröße von 15 sein. Jetzt müssen wir in unserer Komponente geblieben erstellen, die unsere aktuelle Grenze darstellt. Also lassen Sie uns Limit erstellen und Limit setzen. Standardmäßig ist dieser Status gleich der Seitengröße. Okay, gut. Jetzt schauen wir uns rein. Nutzen Sie die Tatsache, wo wir unsere Nachrichten holen. Also haben wir diese Nachricht, ref, die nicht auf diese Verwendung von Tatsache oder Tagen beschränkt ist, weil es keine internen Werte verwendet , so dass wir es sicher hier nach oben verschieben können. Alles klar, gut. Jetzt müssen wir hier funktionieren, um erste Botschaft zu locken und zu Herrn mehr Nachrichten, wenn wir auf den Button oben klicken. Also werden wir eine neue Funktion erstellen, nur um die Logik zu teilen. Also hier, vor der Verwendung der Tatsache, dass wir eine neue Funktion Lord Nachrichten erstellen und wir werden es in Gebrauch einschließen Rufen Sie zurück im Voraus, um es zu optimieren. Und lasst uns diese Logik hier drüben in Lord Botschaften setzen. Und löschen Sie dieses Abonnement nicht. Es ist wirklich wichtig, sich von Benutzerfakten abzumelden. Also, jetzt haben wir dieses Kind RG hier drüben als Abhängigkeit lassen Sie uns bearbeiten. Und wenn Sie Nachrichten neu laden, wir auch sicher, dass wir uns von alten Nachrichten abgemeldet und die neuen Updates abonniert . Also hier, kurz bevor wir unsere neuen Daten erhalten, rufen wir die Nachricht ref dot aus, um sich von den vorherigen Updates abzumelden. Ordnung, jetzt, in dieser User-Tatsache, wir Lord Nachrichten anrufen, und wir werden innerhalb einer Reihe von Abhängigkeiten angeben, und wir werden den Chat entfernen , weil von nun an Es ist nicht Ablassen von diesem Verwendungseffekt. Okay, gut. Und was ist mit Limit? Und was ist mit Lord More Funktionalität? Lassen Sie uns große neue Funktion neben Lord Nachrichten, die wir auf niedriger mehr nennen können auch Rapper im Einsatz zurückrufen. Und was sollten wir drinnen hineinlegen? Wir werden einfach Lord Botschaften mit unserer Grenze nennen, die wir innerhalb des Staates haben. Also jetzt müssen wir Lord Botschaften und Begrenzung als Abhängigkeiten angeben und das war's. Das ist alles für diese Funktion. Nun, innerhalb Lord Nachrichten erhalten wir Grenze, die wir erhöhen wollen, wenn wir auf Lord More klicken. Also hier werden wir ein Limit haben. Und wenn wir versuchen, neue Nachrichten für unseren Abfrage-Builder, können wir diese Eigenschaft namens Limit angeben, um zuletzt. Also die Anzahl von Notizen, die in dieser Abfrage enthalten sind, und wir werden Limit angeben, oder weil wir bereits begrenzt hörbar deklariert haben, nennen wir es nicht zu begrenzen und lassen Sie es hier vorbei. Und falls wir überhaupt keinen Wert haben legis befriedigen Seitengröße Nur ein kleiner Fullback hier drüben . Und jedes Mal, wenn wir einen neuen Teil von Nachrichten senken, müssen wir unser derzeitiges Limit erhöhen. Richtig? Wenn wir also auf diesen Button klicken, wird unser nächstes Limit unser aktuelles Limit plus Seitengröße sein. Also hier werden wir setzen Grenze gießen, und dann werden wir auf vorherige, vorherige plus Seitengröße verweisen . Okay, jetzt müssen wir diesen Boden definieren, und wir müssen diesen Entladen mehr Handler für diesen Grund setzen. Also hier ganz unten, wo wir unser Markup rendern, werden wir die nächste Logik setzen. Also müssen wir fragen, ob wir Nachrichten und Nachrichten haben Don't Length ist größer oder gleich unserer Seitengröße Onley. Dann werden wir ein anderes l I Element im Inneren zeigen wir Knopf setzen und innen unten werden wir tiefer mehr gießen. Nun lassen Sie uns ein paar Klassennamen hinzufügen. Also für diesen Verbündeten werden wir eine Steuerzentrumsspanne oben zwei und Marge unten auf ebenfalls setzen. Und auch für auf Klick, wir werden eigene niedriger mehr angeben. Und auch wir werden es mit der grünen Farbe, nicht rot setzen . Das gefällt mir nicht. Alles klar, gut. Sehen wir uns mal an, was wir getan haben. Wenn wir unsere Seite jetzt öffnen, wie ich, aktualisieren Sie sie noch einmal. Wir können sehen, jetzt haben wir Onley 15 Nachrichten und wenn ich auf mehr laden klicken, können Sie sehen, dass mehr Nachrichten geladen wurden. Das ist es also. Das ist es, was passiert. Also jetzt, wenn wir unsere Seite zunächst laden, haben wir unser anfängliches Abonnement Onley vier Seitengröße, die derzeit 15 ist. Wenn wir dann auf Lord More klicken, wird dies mit unserem aktuellen Limit gestartet, das wir erhöhen, und es wird auf 30 erhöht werden , und wir werden von diesen Updates abbestellen und wir werden neue Updates abonnieren . Das ist also, was im Hintergrund passiert. Alles klar, , was ist mit unserer Schriftrolle? Wie Sie sehen können, ist es ziemlich kaputt, weil, wenn wir neue Nachrichten gesenkt. Wir Bohnen krochen jedes Mal an die Spitze. Das ist nicht gut, also müssen wir es irgendwie kontrollieren. Nun, dafür müssen wir Referenz verwenden, um das eigentliche Element zu erhalten, damit wir seinen Scroll-Besitz manipulieren können . Dafür, Lassen Sie uns neue Referenz hier erstellen. Und es wird,sagen wir, selbst Ref mit gebrauchten Ref-Haken sein sagen wir, . Okay, dann werden wir den Verweis auf unser „l-Lement „weitergeben. Also Referenz wird Selbstreferenz sein. Und jetzt fangen wir an, es zu manipulieren. Also zuerst, für unseren anfänglichen Verwendungseffekt, wenn wir unsere Seite zunächst laden, wollen wir bis ganz unten scrollen, oder? Also hier werden wir Note spezifizieren und wir werden selbst Ref Punkt Strom referenzieren, um den tatsächlichen Verweis auf unser Element zu erhalten . Und hier, gleich nachdem wir unsere Nachrichten geladen haben, können wir Knoten scrollen oben gleich keine Scrollhöhe gießen. Und es wird Lloyds Sache. Ich habe jemals das Problem mit diesem Ansatz ist, dass, weil diese Botschaften des Herrn eine asynchrone Operation ist und dies synchron ist, so dass dies ausgeführt werden könnte, bevor dieser Herr Botschaften mit seinem Denken getan hat, so ist es wichtig, es wie jeder denken Operation dafür. Wir werden es um die eingestellte Zeit wickeln unsere und wir werden etwas wie 200 Millisekunden angeben . Auf diese Weise stellen wir sicher, dass dies auf Lee ausgeführt wird, wenn Lord Nachrichten fertig sind und wenn alle Elemente, die wir anzeigen möchten, auf der Seite angezeigt werden. Alles klar, jetzt schauen wir uns mal an. Wenn ich die Seite aktualisiere, kann ich sehen, dass ich nicht gedacht habe, aber ich bin nach unten scrollen. Ja, ich kann das sehen. Eine kleine Verzögerung von 200 Millisekunden. Aber das ist in Ordnung, oder? Daran ist nichts falsch. jedoch Jetzt werde ichjedochnach unten gescrollt. Ok? Unser nächster Ansatz ist es, diese Krähe Position tatsächlich zu halten, wenn wir auf Lord More klicken. Also sind wir nicht nach oben gekratzt. Nun, für das in Lord, mehr in erster Linie. Lassen Sie uns noch einmal auf unsere aktuellen Elemente verweisen. Also beachten Sie, dass selbst ref Strom sein wird. Bevor wir dann auf Lord More klicken, müssen wir die vorherige Höhe von unserem Scroll-Element von unserer Scroll-Position wissen. Wenn wir also neue Elemente gesenkt haben, erhalten wir die neue Höhe und dann können wir diese Werte subtrahieren. Also hier werden wir alte Höhe wertvoll gießen. Und hier werden wir Knoten-Scroll-Höhe gießen. In Ordnung, dann, nach unseren Nachrichten, rufen wir die „Timeout“ wieder an, um unsere Operation wieder asynchron zu machen. Mit einer Zeitüberschreitung von 200 Millisekunden und dann innerhalb, wir neue Höhe angeben, die keine Scrollhöhe sein wird. Und dann werden wir Knoten scrollen oben gleich neue Höhe minus alte Höhe angeben. Alles klar, jetzt retten wir es. Lassen Sie uns dieses Tempo entfernen und schauen wir uns an. Jetzt scrollen wir nach unten, und wenn ich auf Lord More klicke, können Sie sehen, dass diese Krähenposition beibehalten wird. Okay, es sieht also ziemlich gut aus. Wie geht's dir? Es gibt noch einen Fall zu handhaben. Immer wenn ich etwas im Chat schreibe, sagen wir hallo. Sie können sehen, dass ich nicht nach unten scrollen. Also müssen wir das in Ordnung bringen. Und im Idealfall wollen wir es so etwas machen. Wenn wir also mehr als 50% in unserem Chat gekratzt haben und wir etwas eingeben, wollen wir nach unten scrollen. jedoch an, Nehmen wirjedoch an,wenn wir nach alten Nachrichten suchen. Und wenn wir etwas oder jemand anderes eingeben, wollen wir nicht nach unten scrollen. Richtig Dafür müssen wir auch unsere Logik definieren. Hier oben, wir eine neue Funktion erstellen, die sicher nach unten scrollen wird, und es wird diese selbst ref aktuelle erhalten. Also hier werden wir Notiz setzen, und hier werden wir die nächste Logik setzen. Und auch können wir zweites Argument angeben, das wird sagen wir Schwelle sein, die,sagen wir, sagen wir, 30% von standardmäßig sein wird. Okay, hier werden wir den Prozentsatz von unserer Scroll-Position berechnen, und dann werden wir den Vergleich zurückgeben. Wir werden den Bullen in Wert verwandeln, wenn unser Prozentsatz, den wir hier definieren, größer ist als die Schwelle, die befriedigt wurde. Okay, also Prozentsatz wird die nächste Logik haben. Zunächst einmal multiplizieren wir unseren Wert mit 100%. Dann teilen wir diesen Wert durch keine Scrollhöhe Miner, keine Client-Höhe, und diese Logik wird uns den Prozentsatz geben. Und als voller Rücken werden wir nur Null bieten. Ok? So können wir jetzt Dysfunktion verwenden, um festzustellen, ob wir wirklich nach unten scrollen müssen, wenn wir die Schwelle hassen. Okay, also lass mich das kopieren und zu den Botschaften des Herrn gehen und hören, was wir tun werden. Beginnen Sie uns beruhigen const wieder. Sagen wir, Knoten und dann werden wir selbst Ralf dunklen Strom referenzieren und was es tun wird. Wir werden es direkt setzen, nachdem wir Nachrichten gesetzt haben. Dann werden wir fragen, ob wir mit unserem aktuellen Knoten nach unten scrollen und den Schwellenwert auf 30% Onley halten sollen . Dann gießen wir kein Scrollgespräch und dann keine Scrollhöhe, okay? Und eigentlich, weißt du was? Wir können diese Notiz nach oben setzen, um sie wiederzuverwenden. Okay, so wie das. Jetzt schauen wir uns mal an. Also lassen Sie mich mehr Nachrichten laden. Lassen Sie mich nach oben scrollen. Und gerade jetzt, wenn ich eine neue Nachricht tippe, bin ich nicht nach unten gerollt. jedoch Wenn ichjedochmehr als 30% scrolle und wenn ich hike tippe, kann ich sehen, dass ich nach unten scrollen werde. Das ist also ein Kerl. So können wir mit der Paginierung umgehen. Und so können wir unsere Scroll-Position steuern. Okay, ich schätze, es war nicht zu verwirrend, weil für mich, auf den ersten Blick, es waas Alles klar, also lassen Sie uns unsere Änderungen begehen. Lassen Sie uns ziehen, um alles zu bekommen, Commit zu bekommen und sagen wir, es Paginierung und Kontrolle der Scrollposition. Perfekt. Wir sehen uns im nächsten. 144. Bereitstellung zum to: Hey, wie jetzt, unsere Chat-Anwendung hat alle Kernfunktionen implementiert. Das einzige, was fehlt, sind wirklich Zeitbenachrichtigungen. Um es zu implementieren, müssen einige Dinge getan werden, um Ways Project zu feuern. Wir werden darüber im nächsten Abschnitt sprechen und diesen Abschnitt auf eine gute Notiz zu beenden, lassen Sie uns unsere aktuelle Tschad mit Firebase Hosting offene Feuerbasis bereitstellen, die Jason im Straßen-Ordner zum Hosting-Objekt befindet . Lassen Sie uns hinzufügen vor bereitgestellten Haken NPM laufen gebaut Rechnung Skript ist in Paket Jason definiert. Jetzt ist es so einfach wie die Eingabe von Firebase deploy vom Terminal aus. Mit diesem Befehl werden alle Teile des Projekts bereitgestellt, die in der Firebase Jason erkannt wurden . Dazu gehören Datenbankregeln und Hosting. Wir könnten auch separate Teile bereitstellen, indem Sie Firebase bereitstellen, Dash Dash nur Hosting, nachdem der Commander fertig ist, können wir auf den Host in Abschnitt innerhalb Firebase Dashboard gehen. Hier finden wir einen Euro, um auf unsere Bab App zuzugreifen. Es wird zwei von ihnen geben. Verwenden Sie die, die Sie mehr mögen, beide funktionieren. Firebase verfolgt auch Bereitstellungen und wir können auf jeden Bereitstellungsdatensatz im Versionsverlauf zurücksetzen Lassen Sie uns die App öffnen, um zu sehen, dass es tatsächlich funktioniert. Schön. Sieht gut aus und ziemlich schnell. jedoch fehl, Facebook Logan schlägtjedoch fehl,wenn jemand außer uns versucht, sich anzumelden, um es zu beheben. Gehen wir zu Google und Time. Facebook für Todesfälle, Klicken Sie auf meine abs als Chat-Anwendung wählen. Gehen Sie zu den grundlegenden Einstellungen für die Datenschutzrichtlinie. Euro Copy Website Curole und eingefügt hier als blättern Sie nach unten. Klicken Sie auf und Plattform und stellen Sie sicher, dass Sie Ihre Rhapsodie hinzugefügt haben. Klicken Sie auf Änderungen speichern, als gehen Sie zum Dashboard und drehte diese, die oben, um sicherzustellen, dass es zeigt Leben. Und das war's. Alles klar, das war das letzte Video in diesem Abschnitt. Im nächsten Abschnitt werden wir über benutzerdefinierte Kamin-Backend mit Cloud-Funktionen sprechen. Wir sehen uns dort. 145. Firebase: Hallo. Dieser Abschnitt widmet sich Echtzeitbenachrichtigungen und Cloud-Funktionen. Echtzeit-Benachrichtigungen werden mit brandbasiertem Cloud-Messaging implementiert, für das eine benutzerdefinierte Rückgabe erforderlich ist. Und deshalb nutzen wir Cloud-Funktionen. Damit wir fortfahren können, müssen wir unser Feuerrennprojekt auf die Blaze Anlage mit aktuellen Firebase Preisaktualisierungen von nun an aktualisieren , genannt Funktionen erfordern Blaze Plan, da die Verwendung einiger Google-Cloud-Dienste, die nicht verfügbar im kostenlosen Platt Blaze Plan übergeben wird. Du gehst Moto und das bedeutet nicht, dass wir bezahlen müssen. Alle diese Dienste werden mit wirklich Generälen gegeben. Prediger, vertrau mir die gegebenen Quoten, du wirst nie die zahlende Grenze heizen, aber es liegt ganz an dir. Bitte lesen Sie mehr über blaze Plan auf der Feuerbasis Preisseite, um mit dem Blaze Plan zu arbeiten. Gehen Sie zum Firebase-Dashboard, Klicken Sie unten auf Upgrade und wählen Sie Blaze Plan. Wenn Sie noch keine Zahlungsquelle haben, wird Google Sie nach Ihren Fahrzeugdetails fragen und danach wird es das Projekt aktualisieren, um zu überprüfen welchen Plan? Schneidprojekt verwendet. Schau dir einfach den linken Boden an. Jetzt werden wir alle im nächsten Video sagen, wir werden über Cloud-Funktionen und Server weniger Architekturen sprechen. Wir sehen uns dort 146. Was sind Serverless und Container?: Hey, reden wir über Server weniger. Klingt ziemlich cool, oder? Um besser zu verstehen, was es serverlos ist. Lassen Sie uns klug, wie normaler Server wieder funktioniert in bereitgestellt Server laufen und warten auf Verbindungen. Hier ist nichts falsch, aber hier ist ein kleiner Nachteil. Wir haben keine Benutzer, während Server weiterhin Ron und Verbraucher-Ressourcen. Nicht sehr vorteilhaft ist es, wenn ein Server, der bereitgestellt wird, bei Bedarf ausgeführt wird. Oder es ist besser zu sagen, dass Code auf Abruf auf Lee ausgeführt wird, wenn er benötigt wird. Wenn der Zugriff von niemandem im Decodieren ist, wird er nicht ausgeführt. Die meiste Zeit wird Serverless Ansatz vorgestellt. Informeller Server Letzte Funktionen. Jede Funktion wird separat bereitgestellt und verfügt über einen eigenen Ausführungskontext. Wenn es Funktion bereitgestellt wird, hat es ein eigenes Http, Ihr l, das verwendet wird, um die Funktion zu untersuchen. Dein L ist wie ein Trigger, um den Code auszuführen. Es gibt keinen tatsächlichen Server am Ende. Es gibt nur Code, der bei Bedarf ausgeführt wird. Unter der Haube wird die ganze Magie von Docker-Containern angetrieben. Ein Container ist ein kleines wie überwältigendes Paket aus Was auch immer mit virtuellen Maschinen eingefügt wird, das gesamte Betriebssystem ist so begeistert mit Containern auf Lee. Der Inhalt, der darin gespeichert wird, ermöglicht es, mehrere Container auf einem Betriebssystem auszuführen . Jede bereitgestellte Funktion, mit all ihrem Code und Abhängigkeiten, wird in einen eigenen Container gelegt, der bei Bedarf trans wenn die Funktion ausgelöst wird. Container müssen jedoch auch gehostet und bereitgestellt werden. Samba Recht Dies wird von Cloud-Anbieter gesteuert und verwaltet. Darum brauchen wir uns keine Sorgen zu machen. Und da alles für uns verwaltet wird, brauchen wir uns auch keine Sorgen um Skalierung und Wartung zu machen. Bereitgestellte Kampagnen werden automatisch basierend auf Anzahl Off-Aufrufen skaliert. Jetzt wissen wir, dass jeder Server weniger Funktion ein separates Stück Code ist, der auf Lee ausgeführt wird, wenn tatsächlich eine Funktion verwendet wird, ist sich nicht bewusst, von einer anderen, wie wir in der Lage sind, Code über mehrere Funktionen zu teilen . Beispielsweise müssen alle bereitgestellten Funktionen auf eine freigegebene Variable oder eine andere Funktion zugreifen. Es hängt ab und Cloud-Anbieter mit Feuer. Code der Base-Cloud-Funktionen wird im globalen Bereich freigegeben. Was sind die Nachteile, dass der Haupt Start genannt wird, wenn Code für eine Weile nicht ausgeführt wird , dass der Funktions-Container in den Ruhezustand geht. Wenn jemand versucht, auf den Code-Container zuzugreifen, dreht sich und es dauert einige Zeit. Dies ist so genannter Kaltstart. Es hängt von mehreren Faktoren ab. Zum Beispiel, wie groß ist die Dekodierung für diese Funktion? Oder wie viele Abhängigkeiten nachweisen, nachdem ein Code ausgeführt wurde, bleibt der Container für eine Weile im erwärmten Zustand und wartet auf nachfolgende Anfragen. Es bedeutet, dass der Kaltstart nicht stattfindet. Aber nach einiger Zeit, wenn es überhaupt keine Anfragen gibt, wird der Behälter schlafen gehen, und das nächste Mal werden wir die Kälte sehen. Beginnen Sie mit Server Less. Die Preisfindung wird anhand der Anzahl Off-Aufrufe und der Dauer der Ausführung ausgewertet. Firebase Cloud-Funktionen haben kostenlos abreißen Millionen kostenlose Aufrufe pro Monat, und das ist erstaunlich. Jetzt wissen wir, was weniger dient und was Cloud-Funktionen sind. Ich hoffe, es hat dir gefallen. Wir sehen uns in der nächsten. 147. Cloud – Wie ist alles vernetzt?: Hallo. Lassen Sie uns über Firebase Cloud Messaging sprechen. Was genau ist das? Cloud-Messaging ermöglicht es uns, Echtzeit-Benachrichtigungen an Benutzer zu senden. Wenn wir auf der Website sind, können wir eine Benachrichtigung aus dem Nichts bekommen. Wenn die Website und der Browser geschlossen sind, können wir systemeigene Benachrichtigungen auf Mobilgeräten erhalten. Es wird eine Benachrichtigung sein, als ob es eine echte mobile Anwendung unter der Haube war, verwendet es Browser, Boucher, FBI und den Hauptnachteil, dass es eingeschränkte Unterstützung und Browser und einige Betriebssysteme hat . Okay, lassen Sie mich den vollständigen Zyklus von Firebase Cloud Messaging erklären. Jeder Benutzer hat also ein eindeutiges Token, das Benutzergerät darstellt. Wir erhalten dieses Token vom Benutzer und speichern es in der Datenbank. Dieses Token sollte später nicht öffentlich verfügbar sein. Fire Base verwendet dieses Token, um eine Benachrichtigung an das Benutzergerät zu senden, um Benachrichtigungen auf dem Gerät zu erhalten . Wir werden einen Servicemitarbeiter einrichten. Wie du dich erinnerst. Es ist ein Mittelmann-Skript, das im Browser sitzt. Siedler Arbeiter werden oft verwendet, um einige Hintergrundaufgaben zu profi. Benachrichtigungen sind ein gutes Beispiel. Es wird eingehende Nachricht abfangen und Browser verwenden. Bush ap I Es wird die Benachrichtigung angezeigt. Für die Tat. Jetzt weißt du, wie es funktioniert. Im nächsten Video werden wir zur Ziege kommen. Wir sehen uns, dass 148. Device in der Datenbank speichern: Hey dort in diesem Video, wir werden Benutzer Geräte-Token zu bekommen und speichern Sie es in der Datenbank. Aber bevor wir das im vorherigen Video tun, als wir unsere Anwendung eingesetzt haben, bekommen wir dieses Hosting Bargeld und auch wir modifizierten Feuer basierend auf Jesus. Also zuerst, lassen Sie uns öffnen und ignorieren. Und lassen Sie uns Punkt Firebase fuller hinzufügen, um zu ignorieren, um sicherzustellen, dass wir diesen Ordner nicht verfolgen . Alles klar, gut. Nun lassen Sie uns unsere Änderungen zu begehen und sagen wir, bekomme Commit, Bereitstellen der App Perfect Now Ich habe bereits die Dokumentation für Firebase Cloud Messaging geöffnet, und von hier aus müssen wir Web-Anmeldeinformationen erhalten. Und das sind freiwillige Anwendungsserver-Identifikationsschlüssel. Das ist also der kaputte Schlüssel, den wir brauchen, um Firebase Cloud in erster Linie einzurichten . Also gehen wir zum Dashboard, als lassen Sie uns gehen, um es Einstellungen zu nähern und dann zu Cloud-Messaging von hier. Unter Web-Konfiguration müssen wir ein neues Schlüsselpaar generieren. Also lasst uns auf diesen Boden klicken und das ist unser dampfer Schlüssel, den wir verwenden werden. Es ist öffentlich, damit wir es teilen können. Ich meine, teilen Sie es nicht, aber es ist öffentlich verfügbar Jetzt gehen wir zu unserer Anwendung. Lass es uns tatsächlich laufen. Und dann lasst uns Oakland Firebase Doggy an erster Stelle stehen. Also hier werden wir Firebase-Messaging importieren, dann hier unten. Wir werden überprüfen, ob es vom Browser unterstützt wird, so können wir Anti-Export const. Messaging. Dann fragen wir, ob Firebase gestorben ist. Messaging wird unterstützt. Also, wenn es so ist, dann rufen wir App Dot Messaging auf, um die Instanz zu erhalten. Andernfalls wird gesagt, dass es nicht dann unten. Wir müssen es einrichten, um diesen Vapid-Schlüssel zu verwenden, den wir generiert haben. Lassen Sie uns also fragen, ob wir Messaging unterstützt haben. Also, wenn wir die Instanz haben, dann rufen wir Messaging an, benutzen öffentlichen Vapid-Schlüssel. Sie können dies in ihrer Dokumentation finden. In Ordnung, also lassen Sie uns diesen Schlüssel kopieren und ihn hier einfügen. Okay, gut. Und ich muss einen Handler für unsere Nachrichten einrichten. Lassen Sie mich das erklären. Nachrichten oder Benachrichtigungen sind in zwei Arten verfügbar Vordergrundnachrichten und Hintergrundnachrichten. Hintergrundnachrichten sind die Nachrichten, die behandelt werden, wenn unser Tab oder Browser geschlossen ist und Vordergrundnachrichten sind diejenigen, die sichtbar sind, wenn wir die Website scrollen Daher müssen Vordergrund-Nachrichten innerhalb der App behandelt werden. Hintergrundmeldungen werden von Service Worker behandelt. Also hier werden wir Nachrichten über Nachricht anrufen und für Wissen ist es so zu halten, wie es ist. Daten des Konsulats. Also werden diese Abonnements, sagen wir, unsere Vordergrundbotschaften behandeln. Okay, sagen wir mit und jetzt lassen Sie uns zu dekodieren, um Benutzergerät in der Datenbank zu speichern. Also lasst uns Profilkontext öffnen. Das ist also nicht der Ort, wenn wir in unseren Benutzer schauen. Also hier, wir müssen es schaffen. Und wenn ich die Dokumentation erneut öffne, kann ich sehen, dass ich diesen Code kopieren kann, um das aktuelle Registrierungstoken zu erhalten. Also, eigentlich weißt du eigentlichwas? Lassen Sie mich das kopieren und uns irgendwo hier unten einfügen. Aber zuerst müssen wir sicherstellen, ob Messaging vorhanden ist. Also werden wir überprüfen, ob Messaging existiert, die ich von MISC Firebase importiert habe. Also, wenn das der Fall ist, dann werde ich diesen Code beschleunigen, und vielleicht lassen Sie mich ihn in eine Spüle umwandeln wartet Index. Also lassen Sie mich einen Versuch fangen Block hier drüben setzen. Dann werde ich Nachrichten gießen, Token holen. So wird es const Tokcan sein. Nehmen wir an, aktuelles Token gleich wartet auf Messaging. Holen Sie sich Token und lassen Sie uns in Facing Funktion konvertieren. Okay, perfekt. Dann werden wir überprüfen, ob aktuelles Token existiert. Lassen Sie das alles kopieren. Also, wenn dieses aktuelle Token existiert, dann werden wir einige Dinge tun. Wir brauchen es nicht einmal, als im Falle aus Fehler werden wir in der Konsole und bei unserem aufgetretenen angezeigt . Okay, gut. Jetzt lass es uns tun. All das. Und los geht's. Jetzt müssen wir dieses Token in der Datenbank speichern. Dafür können wir Datenwege Dar Graph und der Ort oder der Pfad, den wir unsere Token starten , gleich zwei FC m Token Schrägstrich Token I d und dannSchrägstrichBenutzer i d. Schrägstrich können wir Datenwege Dar Graph und der Ort oder der Pfad, den wir unsere Token starten, gleich zwei FC m Token Schrägstrich Token I d und dannSchrägstrichBenutzer i d. Choke Ins auf der Rückseite. Und okay, also wird es FC m Token sein. Dann werden wir nach aktuellem Token, und als Kind werden wir Objekttürbenutzer abschütten. I d i d. Aus dem aktuellen Benutzer. Ok. Perfekt. nun die Dokumentation nach unten scrolle, kann ich sehen, dass das Token auch aktualisiert werden kann, also müssen wir das auch dafür behandeln. Lassen Sie uns dieses Stück Code kopieren und es neben diesem Strike Hedge-Block wie folgt setzen und dieses eigene Token aktualisieren es ist ein Abonnement. Es bedeutet also, dass wir uns dafür in Zukunft wieder abmelden müssen. Hier, Anti hacken in dir die Tatsache, dass Let's Armer Joe erfrischen kann, ich bin U-Boot, okay? Und wir werden auf Token oder frisch zu dem schrecklichen gießen. Und hier unten, wenn wir uns abmelden, werden wir überprüfen, ob Witz und Aktualisieren auf sub, Dann werden wir diese Funktion zwei Monate davor aufrufen und das gleiche Handy tun in der Cleanup-Funktion. Okay, gut. Nun, was wir hier tun müssen, lassen Sie uns auch in irgendetwas umwandeln. Funktion. Also, hier werden wir einen Sing setzen, und tatsächlich wird die Logik irgendwie dieselbe sein, also können wir sie einfach kopieren und so hier drüben platzieren. Okay, gut. Jetzt sind wir bereit zu gehen, aber weil wir direkt zur Datenbank auf den Pfad, den wir nicht zu Sicherheitsregeln hinzugefügt haben, müssen wir sie leicht ändern. Also lassen Sie uns zur Datenbank gehen, dann gehen wir zu Regeln. Und hier fügen wir einen neuen Eintrag hinzu. Also lassen Sie mich den Disc-Status wie diesen kopieren, dann werde ich den Status durch FC M-Token ersetzen. Dann werden wir einen Witz bekommen. Und ich D und mobil erlauben Read nie. Weil wir niemandem erlauben möchten, auf unsere Token zuzugreifen. Und für richtig Onley ist der Benutzer, das ist derzeit Sinan in der Lage, sein eigenes Token zu speichern. Richtig, also werden wir überprüfen, ob ein neuer Datenpunktwert ist. Also, wenn der Benutzer i d, den wir auf dieses Token schreiben, ich t gleich zwei von Ihnen. Ich d. okay. Gut. Jetzt lassen Sie uns genießen und es sieht gut aus. Jetzt gehen wir zu unserer Anwendung. Lassen Sie uns auffrischen. Okay, jetzt perfekt. Lassen Sie uns den Rat öffnen, um zu sehen, ob wir keine Warnungen haben. Okay, wir haben den Redakteur True. Wurde Toking, konnten die Standarddienstmitarbeiter nicht registrieren. Okay, das ist also gut. Und weil wir noch keinen Service-Mitarbeiter haben, bekommen wir diesen Eintrag. Das ist gut, aber dieser Fehler sagt, dass es funktioniert. Jetzt lassen Sie uns unsere Änderungen übernehmen. Und im nächsten Video werden wir Service Worker einrichten. Also lassen Sie uns gießen, bekommen Sie alles und lassen Sie uns überprüfen, welche Art von anderen empfangen werden sollen. Unerwartete Erklärung des Rates. Okay, das ist gut. Lassen Sie uns begehen. Und sagen wir, bearbeiten Sie Firebase-Messaging und speichern Sie Erstickungsbenutzer-Token in der Datenbank. Perfekt. Wir sehen uns im nächsten 149. Service Worker hinzufügen: Hey, da. In diesem Video werden wir weiterhin Firebase-Cloud-Messaging einrichten und einen Service-Mitarbeiter einrichten . Also habe ich bereits zur Firebase-Dokumentation navigiert und dann wähle ich empfangene Nachrichten aus. Also in diesem Abschnitt kann ich lesen und Sie können mehr über Vordergrund- und Hintergrundnachrichten lesen, aber wir sind an Service Worker Datei interessiert. Also lassen Sie uns nicht zu unserem Code vergessen und das erste, was wir tun werden, aber werden tatsächlich die Regeln gefangen , die wir im vorherigen Video mit FC M-Token erstellt haben. Also lassen Sie uns das alles kopieren, dann gehen Sie zu Datenbank Narren Jason und fügen Sie alle von ihnen hier jetzt über Service Worker. Also, wie Sie sehen können, ist dies tatsächlich der Service-Workercode. Rufen wir es sein. Und innerhalb Öffentlicher Ordner, lassen Sie uns neue Datei Firebase Messaging-Dienst Worker doggy s erstellen. So muss es mit diesem Dateinamen übereinstimmen. Es ist sehr wichtig, weil dies der Name ist, der von der Feuerbasis als Zerfall erkannt wird . Jetzt lassen Sie uns alles einfügen, was wir hier haben, und wir können es tatsächlich tun. All diese Kommentare so, dann brauchen wir die Nachricht nicht. Unglaublich. Und auch, lassen Sie es lint für die gesamte Datei deaktivieren. Ok, gut. Jetzt für diesen Konflikt hier, müssen wir unseren Konflikt initialisieren, den wir in unserer Anwendung initialisieren. Also lasst uns den Feuerplatz Dodgy eröffnen. - Ja. Und lassen Sie uns einfach dieses Objekt kopieren und es hier einfügen, so dass es Firebase SDK innerhalb von Service-Worker initialisiert . Und auch müssen wir sicherstellen, dass die Version, die wir hier importieren, mit unserer sdk-Version im Paket Jason übereinstimmen muss . Also lasst es uns öffnen. Und hier haben wir 7.15 jetzt hoffen wir in Service-Arbeiter, es hat 7.15. Das ist in Ordnung. Jetzt speichern wir es. Und ich habe den AB schon geleitet. Jetzt gehen wir zurück zur APP. Lassen Sie mich es jetzt aktualisieren, Wie Sie innerhalb des Rates sehen können, Ich habe überhaupt keine Warnungen, Also können wir zu unserer Datenbank navigieren. Und wie Sie jetzt sehen können, habe ich hier FC m Token. Wenn ich es öffne, habe ich das ziemlich entlang Benutzer ich d-Token und dass ich meinen Benutzer i d habe und das ist es tatsächlich bevor wir unsere Änderungen begehen, weil wir einen neuen Service-Worker mit Firebase Cloud-Messaging im Inneren verwenden . Wir brauchen eigentlich keinen Service-Worker durch Create React App. Also, was ich in Zukunft vorgeschlagen habe, werden wir das brauchen. Ist der lokale Host wertvoll? Also lassen Sie es von hier kopieren und in Helfer wie diese stecken und lassen Sie uns von hier aus exportieren . Jetzt speichern wir es Und lassen Sie uns Service, Arbeitsdatei und innen nach GS oder Index-Togs löschen . Lassen Sie uns diese Kommentare löschen. Wir brauchen sie nicht mehr, und jetzt können wir unsere Änderungen begehen. Also nochmal, lasst uns alles an Bord gehen und dann Commit bekommen. Und lassen Sie uns an ihm sagen, Service-Arbeiter auf, dass sagte Perfect, Wir sehen uns in der nächsten. 150. Cloud-Funktionen und Node Version Manager (NVM) einrichten: Hey, da. In diesem Video werden wir Cloud-Funktionen in unserem Firebase-Projekt einrichten. Lass uns gehen. Gehen wir zurück zu V s Code. Öffnen wir das Terminal. Und hier müssen wir nur Feuerbasis eingeben. Du brauchst Funktionen. Dann wird es uns mit ein paar Fragen auffordern. Lasst uns schlagen. Ja. Dann wählen wir Javascript. Dann vier Jahre Lind, wählen wir aus. Ja, und lassen Sie uns alle Abhängigkeiten installieren. Okay, gut. Wenn wir innerhalb von Funktionen schauen, wurden einige Dateien für uns erstellt. Ja, Lynn RC mit bereits vordefiniertem Konflikt. Lass es uns nicht bemorden. Dann haben wir Ignorieren Index Dodgy s und verpackt Jason bekommen, Also Index Punkt gs in Cloud-Funktionen ist ein Einstiegspunkt von Index-Togs. File RealAge, um separate Cloud-Funktionen zu exportieren, die separat bereitgestellt werden. Okay, drinnen Fahrrad. Es ist Jason. Hier finden wir ein paar Abhängigkeiten. Also ja, Lind und auch Firebase Admin und Funktionen. Diese beiden Pakete ermöglichen es uns, auf Fire Base vom Backend zugreifen und wir können auch ein paar Skripte finden . Definieren Sie hier, um tatsächlich Ron Funktionen Emulator in der lokalen Umgebung zu dienen, als wir etwas namens Shell haben und es ist Firebase Shell, um unsere Funktionen tatsächlich zu testen und auch dann haben wir Protokolle und andere Dinge wie Deploy und Start für Start-Skript . Da wir unsere Funktionen lokal testen werden, schlug ich vor, Ron statt Shell zu dienen. Also lassen Sie es dienen und speichern wir unsere Datei. Und auch, weil wir auf unsere Datenbank lokal und per Feuerbasis zugreifen werden. Es wird als nicht vertrauenswürdige Umgebung erkannt. Wir müssen eine Art von Authentifizierung oder Anmeldeinformationen zur Verfügung stellen, damit es funktioniert. Dafür müssen wir zurück zu unserem Dashboard navigieren. Dann müssen wir zu den Projekteinstellungen gehen und von hier zu Service-Konten gehen. Wir müssen den neuen privaten Schlüssel nicht senken. Also lasst uns eins erstellen. Es wird uns eine Jason-Akte geben. Öffnen wir es und lassen Sie uns den Inhalt kopieren. Gehen wir zurück zum Code. Und hier in Funktionen, lassen Sie uns neue Datei-Service-Konto erstellen, tut Jason und lassen Sie uns alles, was wir Koppett haben. nun sicher, Sienun sicher,dass Sie diese Datei hinzufügen, um ignoriert zu werden. Das ist sehr wichtig. Also hier fügen wir Service-Konto, dass Jason, so dass diese Datei muss nicht öffentlich verfügbar sein. Dies ist nur für uns, für die lokale Entwicklung. Okay, gut. Nun, wenn wir die Service-Konten hier wieder öffnen, können wir einen kleinen Codeausschnitt finden, also lassen Sie es uns kopieren und öffnen Sie den Index Punkt Js. Also hier haben wir Funktionen an der Spitze und Firebase-Funktionen. Lass es uns so platzieren. Und lasst uns auch den Admin fangen und VARS durch konstante Gut ersetzen. Jetzt müssen wir einen Service-Kontopfad angeben, der diese ist und dann setzen Sie es hinein, admin initialisieren bei, wenn wir Cloud-Funktionen verwenden. Bevor wir etwas tun können, müssen wir Firebase Admin als verfallen initialisieren und für die lokale Entwicklung müssen wir es so initialisieren, um auf die realen Daten zugreifen zu können, um auf riel Datenbank zuzugreifen . Das ist es im Grunde. jedoch Es gibtjedocheine wichtige Sache für Cloud-Funktionen. Wenn wir das Paket der Jason hier öffnen, haben wir Motoren eingesperrt. Knoten acht angeben. Die Sache ist, dass Firebase Cloud-Funktionen auf Lee zwei keine GS-Versionen unterstützt werden, entweder acht oder 10 und kürzlich haben sie die Unterstützung für Knoten Version acht vollständig gelöscht. Also jetzt Firebase Cloud-Funktionen sind grundsätzlich ohne GIS-Version verfügbar. Ted, das könnte gerade ein kleines Problem sein. Wir verwenden keine Js Version 12 und wir müssen unsere Cloud-Funktionen irgendwie mit Note Version 10 verwalten . Dafür müssen wir zwischen verschiedenen bekannten Jess-Versionen wechseln. Dafür müssen wir keine zusätzliche Software senken, die No Version Manager genannt wird. Dafür müssen wir keine zusätzliche Software senken, Diese Software ermöglicht es uns, zwischen verschiedenen Versionen auszuschalten. Keine GS in einem Befehl. In Ordnung, gehen wir zu Google. Und dann lassen Sie uns einfach tippen und VM, die Lassen Sie uns auf Versions-Manager auf dem Get Hop notieren gehen. Und dieses Repository ist auf Lee für Linux- und Mac OS-Benutzer. Bitte folgen Sie diesem Tutorial und installieren Sie und VM auf Ihrem Computer. Wenn Sie von Windows nach unten kommen, scrollen Sie nach unten zu zwei Fenstern Teil Und hier beschränken wir Neid M für Windows und klicken Sie dann auf Download. Jetzt werden Sie auf dieser Seite enden, dann klicken Sie auf N V M Richten Sie ZIP-Datei und installieren Sie dann Neid M. Okay, Nachdem Sie Neid M auf Ihrem Computer installiert haben, gehen Sie zu Ihrem Terminal und dann rufen Sie einfach Neid M Version oder Neid em. Strich-Version. Okay. Und VM-Version danach, um Nein zu installieren, nur Version 10. Lassen Sie mich meinen Befehl und die M-Liste ausführen. Es wird alle meine nicht lokal installierten GS-Versionen auflisten. Für Cloud-Funktionen benötigen wir also etwas von der 10. Version. Also nennen wir benvy M install und dann 10.20 Punkt eins. Nach dieser Notizversion wird Manager installieren und vor allem alles für Sie. Sie brauchen sich um nichts zu kümmern, um dann zwischen verschiedenen Versionen zu wechseln. Keine GS schwächen, einfach Typ und VM verwendet. Sagen wir 8 16 zu. Und jetzt verwende ich diese Version off note. Und wenn ich tippe und VM 10.20 Punkt eins verwende, benutze ich jetzt diese Version. Das ist es. So können wir verschiedene Versionen abschalten. Keine Gs, bitte stellen Sie sicher, dass Sie diese installiert haben, da sonst, wenn Sie keine Version 10 lokal installiert haben, wir Ihre Funktionen nicht lokal ausführen können. Alles klar, jetzt, um dieses Video zu beenden, lassen Sie uns unsere Änderungen übernehmen. Also lasst uns alles vergessen. Dann bekomme Commit und lass uns sagen, richte Cloud-Funktionen mit Neid ein. M perfekt. Wir sehen uns im nächsten 151. Meldungen Flow in: hallo In diesem Video möchte ich schnell den Ablauf für das Senden einer Benachrichtigung erklären. Zunächst einmal, in den Daten, bitte. Für jeden Raum gibt es ein weiteres Feld namens FC M-Benutzer. Es wird in Rafe User-Ideen sein, die Benachrichtigungen auf der Rückseite erhalten. Und wir werden eine Cloud-Funktion erstellen, die von unserer Chat-Anwendung als Admin zwei Definition aufrufen wird, zusammen mit Anfrage werden wir von mächtigen Namen und Benachrichtigungsnachricht senden. Dann mit Crew my D erhalten wir mit Crew my DBenutzer-IDs, die Benachrichtigungen mit ihren Ideen erhalten. Wir werden ihre Geräte-Token abfragen und dann eine Benachrichtigung mit den Token der Token senden, bevor wir beginnen. Ich möchte nur darauf hinweisen, dass es drei verschiedene Arten von Cloud-Funktionen gibt. Gullible auf Anfrage und Trigger auf Anfrage Funktionen haben einen eigenen Euro senden in einer Anfrage. Die Verwendung des Euro ist die einzige Möglichkeit, auf die Funktion zuzugreifen. Rufen Sie einen Darm Funktionen haben auch ihre eigenen neuralen, aber in Firebase-Client als Zerfall, die, die wir im Browser verwenden, gibt es eine spezielle Methode, um diese Art von Funktion nach ihrem Namen aufzurufen, nicht nach Euro und auch aufrufbar Funktionen analysieren und validieren Benutzer JWT-Token automatisch. Firebase verwendet JWT-Token, um Benutzer zu autorisieren, und wir beschäftigen uns nicht direkt mit ihnen. Trigger-Funktionen haben keine eigenen neuralen, und sie reagieren auf Lee zwei verschiedene Datenbank-Dokument-Ereignisse wie eigene erstellen bei Aktualisierung und Besitz Illit. Wir könnten angeben, dass jedes Mal, wenn ein Dokument auf diesem Pfad erstellt wird, diese Cloud-Funktion wird jemals ausgeführt haben. In unserem Fall brauchen wir nur eine Art von Funktionen leichtgläubig, leicht zugänglich und Benutzer aus seinem Protest für uns. Jetzt hast du eine bessere Vorstellung, was wir tun werden. Wir sehen uns in der nächsten. 152. FCM -Cloud-Funktion erstellen: Heiligtum. In diesem Video werden wir unsere eigene gepflügte Funktion erstellen, um Benachrichtigungsnachrichten zu senden. Lass uns gehen. Zunächst einmal öffnen wir diesen Code, als lassen Sie uns zu Funktionen gehen, Index-Togs und, lasst uns ungewöhnlich, diese De Fold Cloud-Funktion, die bereits ziemlich für uns finden. Speichern wir diese Datei. Dann lassen Sie uns Terminal öffnen und navigieren Sie zu Functions Ordner in Paketen und wir haben NPM Start-Skript ausführen . Also lasst uns es laufen und schauen wir uns mal an, was passieren wird? Zunächst einmal wird es nicht alle benötigten Emulatoren für verschiedene Dienste aus Kamin senken, wie AM ein Führer für Funktionen. Das ist in Ordnung. Danach werden Sie diese Art von Nachricht sehen, und es wird sagen, dass die erste HTTP-Funktion initialisiert ist und verfügbar auf diesen Ural und auch wir haben diesen lokalen Host für 1000 Funktionen. Also lasst uns das kopieren. Gehen wir zum Browser und lassen Sie uns dieses ländliche öffnen, um zu überprüfen, was passieren wird. Dies ist wie ein Dashboard, in dem wir steuern, welche Dienste wir vor Ort entwickelt haben. Also im Moment haben wir nur Funktionen. Bin ein Führer und es ist auf diesem Port verfügbar, und wenn wir zu Protokollen gehen, können wir das sehen. Jetzt haben wir eine http-Funktion initialisiert, so dass wir dieses Jahr kopieren können. L Und dann können wir auf diese Funktion zugreifen. Und aus der Antwort können wir Hallo von der Feuerbasis sehen. Das ist, was wir in dieser Funktion haben. Abtrotzig. Das ist es also. Das ist es, was unsere Cloud funktioniert. Aber jetzt lassen Sie uns den Emulator stoppen. Wir brauchen sie nicht. Und lassen Sie uns auch diese Art von Funktion löschen, weil dies eine zweifache eins ist und wir sie nicht brauchen. Aber bevor wir dies tun, möchte ich nur darauf hinweisen, dass jede Funktion, die aus indizierten oci ja exportiert wird, als Funktion behandelt wird. Also, was es innerhalb von Funktionen tun wird. Wir erstellen einen neuen Ordner namens Ser C Inside. Wir werden neue Datei FC M doggy s gießen Von hier werden wir unsere Funktion exportieren und dann werden wir sie von hier aus wieder exportieren. Okay, also lassen Sie es uns so behalten, wie es ist. Vielleicht werden wir diese Funktion im Voraus benennen. Sagen wir, schicken Sie FC M. Und im Moment, lasst uns es kommentieren. Ok. Gut. Jetzt in FC M. Lassen Sie uns Funktionen und Admin importieren. Und von hier aus werden wir unsere erste Funktion exportieren. Wird es benennen. Exporte exportiert Sand fc M. Also müssen wir Funktionen aufrufen. Dann müssen wir https gießen, und dann müssen wir auf Abruf stellen. Also diese Funktion, die standardmäßig kommt, war auf Anfrage Art der Funktion, die sie wollen, aber wir werden erstellen wird auf Abruf sein. Okay, also erhält diese Funktion bei kalter Funktion zwei Argumente. Also, wenn wir jedoch, wir können Daten und Kontakte sehen, Also Daten sind diese Daten, die wir zusammen mit Anfrage übergeben und wir können es innerhalb des Kontextes zugreifen enthält einige Kontextinformationen wie Benutzerinformationen und Benutzer JWT Token. Geh. Jetzt. Da wir diese Funktion aus FC M Dodgy s Datei exportieren, können wir innerhalb Index-Togs importiert werden. Also hier können wir Const eingeben. Lassen Sie mich f gleich eingeben, als wir den Quellordner referenzieren und dann f c M g s.. Also von Dysfunktion, wir exportieren und FC M Jetzt müssen wir es zerstören. Und dann von diesen Index-Togs werden wir es wieder so exportieren. So exportiert Sand FC M wird FC M Funktion gesendet werden, die wir von FC M Datei erhalten. In Ordnung. Und wir haben diese Warnung, die besagt, dass eine leere Zeile erwartet wird. Okay, lass es mich so sagen. Jetzt müssen wir unsere Funktion schreiben. Okay, also zuerst müssen wir überprüfen, ob unser Benutzer anwesend ist. Wenn die Person, die versucht, auf diese Funktion zuzugreifen, tatsächlich authentifiziert ist, haben wir bereits Benutzer durch diese Art von Funktion analysiert und validiert, was schuldhaft ist. Jetzt müssen wir nur überprüfen, ob der Benutzer tatsächlich geparst wird. Wenn der Benutzer also nicht analysiert wird, bedeutet dies, dass der Benutzer nicht anwesend ist. Okay, dafür können wir hier eine Hilfsfunktion erstellen, die wir check if off check nennen werden. Wenn es innerhalb dieser Funktion authentifiziert wird, werden wir den Kontext übergeben, und dann werden wir ihn von unserer Funktion so aufrufen. Überprüfen Sie, ob aus und dann passieren wir den Kontext. Und von diesem Scheck, wenn aus, werden wir das nächste tun. Wenn der Kontext-Punkt-Auth hat, hat er das Objekt im Inneren. Also, wenn ich Kontext gieße und dann Dar hier beschränkt. Also, wenn dieser Kontext nicht aus ist undefiniert. Wenn wir also kein Objekt haben, werden wir neue Funktionen werfen. Dar Https HTTP-Fehler Also das ist Paschall. Nehmen wir an, Syntax, die einen Fehler gibt, um unseren Grund abzulehnen, wird authentifiziert sein und die Nachricht wird sein. Sie müssen angemeldet sein. Okay, gut. Hier sind wir fertig. Unser nächster Schritt besteht darin, auf Daten zuzugreifen, die wir von der Anfrage erhalten. Sie steht unter diesem Datenobjekt zur Verfügung. Hier drüben. Es ist bereits für uns geparst. Also von diesem Objekt können wir die nächsten Werte zerstören, wir werden den Tschad schleifen. Ich d dann Titel aus dem Raum oder lässt den Titel der Nachricht. Und dann schicken wir auch eine Nachricht. Okay, gut. Jetzt müssen wir unsere Zimmerdaten mit diesem Stuhl abrufen. Ok, von hier aus werden wir einen Raumabblick haben. Ok, von hier aus werden Und jetzt müssen wir darauf zugreifen. Unsere Datenbankdatenbank kann von der Serverumgebung mit Firebase Admin als verfallen zugegriffen werden. Also hier an der Spitze, lassen Sie uns eine neue lebensfähige Datenbank, und dann rufen wir Admin-Datenbank an. Verwendung der Datenbank aus der Serverumgebung ist sehr ähnlich wie wir auf sie von abgelehnt zugreifen. Okay, jetzt können wir Datenbank anrufen, dann setzen wir rau, und jetzt müssen wir von Daten zugreifen. Also haben wir Zimmer als Schrägstrich Raum I D. Das wird Chat sein, i d. In unserem Fall gibt es das Versprechen zurück. Deshalb können wir hier drüben weglegen. Und lasst uns auch eine Spüle setzen, um es gültig zu machen. Also, nachdem wir Referenz haben, rufen wir einmal und dann wir schlechten Wert. Jetzt bekommen wir einen Raum-Snapshot, dann können wir die einfache Kontrolle machen, ob Raum Snap Shore existiert. Wenn es also nicht existiert, werden wir False zurückgeben. Ok. Von dieser Funktion sendet es nur eine falsche Anfrage zurück an den Client. Wenn wir diese Funktion aufrufen, dann müssen wir Raumdaten erhalten, um eine Benutzer-IDs zu erhalten. Also, lassen Sie uns Gerichtssaaldaten und dann werden wir vom Snapshot-Tür-Wert aufzeichnen. Jetzt müssen wir überprüfen, ob unser aktueller Benutzer ein Admin ist. So können wir tatsächlich die Nachricht senden, weil diese Funktion von einem Benutzer innerhalb des Tschad aufgerufen werden kann . Aber dieser Benutzer ist kein Administrator, und daher ist dieser Benutzer nicht in der Lage, die Nachricht zu senden. Okay dafür, wir müssen gegen Benutzer überprüfen zugibt so zuerst, Wie Sie sich erinnern, alle unsere ein Rennen in den Arbeiten gespeichert sind Objekte, also müssen wir sie in normale Javascript-Arrays für das Inside transformieren Helfer. Wir haben bereits Dysfunktion in Array umgewandelt. Kopiere es einfach von hier und lege es hier unten. Jetzt können wir eine Hilfsfunktion erstellen, um zu überprüfen, ob der Benutzer die Nachricht tatsächlich senden kann. Wir können eine neue Funktion unten wieder erstellen, und wir werden sie nennen. Überprüfen Sie, ob erlaubt. Und wieder wird es Kontext erhalten. Und auch es wird Chatzugibt erhalten. Ok. Und hier werden wir fast den gleichen Scheck machen. Also wenn nein, sagen wir, Chad, fügen Sie Mons Hund enthält Kontext aus, und dann Sie i d. Also, wenn Benutzer, der versucht, auf diese Cloud-Funktion zuzugreifen, ist in der Liste von Chad Adnan. Also, wenn das nicht der Fall ist, dann schicken wir wieder genau die gleiche Nachricht hierher. Und vielleicht sagen wir eingeschränkten Zugang. Alles klar, gut. Jetzt können wir diese Funktion hier drüben aufrufen. Überprüfen Sie, ob erlaubt, werden wir Kontext innerhalb übergeben, zusammen mit Transformation zu Array-Raumdaten zugibt. Okay, perfekt. Unser nächster Schritt besteht darin, tatsächliche Nutzerideen zu erhalten, die Benachrichtigungen erhalten. Dafür. Wir werden einen neuen wertvollen FC M-Benutzer setzen. Und wieder, wir werden Transform to Array aufrufen, und wir werden Raumdaten FC M-Benutzer setzen. Okay, jetzt werden wir alle Benutzer-Token bekommen. Dafür. Ich schlug vor, wieder eine Hilfsfunktion zu erstellen, die wir get user-Token nennen werden. Scrollen wir nach unten. Und hier werden wir eine neue Funktion erstellen, Benutzer-Token erhalten, damit es Benutzer I D und er wird alle Benutzer-Token bekommen. Also werden wir unsere Datenwege aufrufen, und wir erhalten Benutzer-Token. Momentaufnahme. Okay, also wird es unschuldige Funktion und Logik wird die nächste sein. Also werden wir Datenbank Ref nennen. Dann werden wir auf FC M-Tokens verweisen. Dann werden wir nach Wert bestellen, und wir werden gleich dem Benutzer I d setzen und dann alte Token zu bekommen, werden wir einmal Wert nennen. Okay, perfekt. Und vergessen Sie nicht, am Anfang zu warten. Jetzt haben wir Benutzer-Token Snap Shirt. Wenn wir also keine Benutzer-Token haben, hat Snap Short Kinder. Also hier überprüfen wir, ob tatsächlich dieser bestimmte Benutzer irgendwelche Token hat. Wenn dieser Benutzer keine Kinder hat, bedeutet dies, dass dieser Benutzer keine Token hat. Also können wir einfach eine leere zurückgeben, Eric. Also, wenn der Benutzer Token hat, dann rufen wir Objektpunktschlüssel und dann Benutzer-Token Snapshot-Punktwert auf. Weil wir, wie Sie sich erinnern, wie Sie sich erinnern,unsere A Raise in den Eisenbahnen als Objekte aufbewahren. Und indem wir dieses Objekt von Schlüsseln aufrufen, erhalten wir die tatsächlichen Benutzer-Token. Okay, gut. Jetzt können wir diese bekommen Benutzer-Token aus unserer Cloud-Funktion und für Papa aufrufen, weil wir Benutzer-Token für mehrere Benutzer erhalten müssen, die wir Promise verwenden müssen, um es so optimiert wie möglich zu machen. Okay dafür Hier werden wir einen neuen wertvollen Benutzer erstellen. Token, Versprechungen. Und was wir tun werden. Wir werden jeden FC M-Benutzer abbilden. Wir werden es kartieren. Also wird jeder Benutzer i d zugeordnet werden, um Benutzer-Token versprochen zu bekommen. Und in ihm wird dieser Benutzer I d. Okay, gut. Jetzt werden wir unser Ergebnis erhalten. Oder sagen wir, wir werden Benutzer-Token Ergebnis erhalten und wir werden anrufen, erwarten Versprechen. Nicht alle Benutzer-Token versprechen, aber die Sache ist, dass Versprechen, dass alle uns ein Array von Ergebnissen wie diese zurückgeben und unsere Benutzer-Token versprechen, so dass jedes get Benutzer-Token Versprechen uns ein Array von Benutzer-Token zurückgibt. Auf diese Weise werden wir mit einem verschachtelten Array wie das enden. Also für den ersten Benutzer werden wir diese Token haben. Also zum zweiten, können wir diese und so eins und so weiter bekommen. Um das zu vermeiden, müssen wir unseren Eric abflachen. Dafür können wir Dot Reduce-Methode aufrufen, die auf einem Rennen verfügbar ist und den Bereich abflachen. Ok. Dafür werden wir Benutzer-Token Ergebnis dann reduziert aufrufen, so dass es eine Callback-Funktion erhalten wird. Und das zweite Argument ist der Anfangswert. Also wird der anfängliche Brunnen ein leeres Array sein. Und diese Doktrin Verwendung zuerst ist der Akkumulatorwert , der wird, Sagen wir, angesammelt, Filkins. Und zweitens wird der aktuelle Wert sein, der Benutzer-Token ist. Diese Funktion wird also für jeden Benutzer-Token für jedes Element ausgeführt. OK, und hier werden wir einfach verschmelzen. Diese beiden löschen mit dem Spread-Operator. Also werden wir Akkumulator-Token und Benutzer-Token aufrufen . Auf diese Weise werden wir mit einem flachen und Array enden, wo jedes Token wie ein normaler Wert ist . Okay, geh es jetzt. Lassen Sie uns weiter, dann werden wir überprüfen, ob Token Punktlänge gleich Null ist, die von dieser Funktion zurückkehren wird , weil wir keine Token haben, um zwei zu senden. Und wie die Frage ist, dass wir Token haben, wie wir in der Lage sind, unsere Nachrichten zu senden, für die wir navigieren können, um durch seine Dokumentation zu schießen. Also das habe ich von früheren Videos. Aber wenn ich zur Serverumgebung auf der linken Seite gehe und dann gesendete Anfragen hier erstellt habe, können Sie mehrere Möglichkeiten finden. Wie kann ich eine Nachricht senden, um das Gerät anzugeben? Allerdings brauchen wir nur eine, die Nachrichten an mehrere Geräte gesendet wird, weil wir mehrere Token haben und wir eine Nachricht zu senden haben. Also lassen Sie mich einfach eine Nachricht kopieren , und ich werde sie hier setzen, und ich werde es F-C-M-Nachricht nennen. Also ich waren Daten werden nicht so aussehen, weil jede Nachricht auch eine andere Struktur haben kann . Es kann diese Art von Objekt mit Datenthema und Token haben jemals Dies ist Onley für benutzerdefinierte Benachrichtigungen. Wir brauchen nichts Brauch. Dafür brauchen wir eine normale Benachrichtigung. Wir müssen dieses Objekt leicht ändern. Anstelle von Daten werden wir ein schlechtes Benachrichtigungsobjekt im Inneren. Und dieses Benachrichtigungsobjekt hat zwei Schlüssel, die Titel und auch Körper sind, was die tatsächliche Benachrichtigungsnachricht ist. Also für Körper, werden wir eine beruhigende Nachricht sehen, die wir von Datenobjekt innerhalb dieser Cloud-Funktion erhalten. Also lasst uns eine Nachricht schreiben. Und für Titel, können wir unseren benutzerdefinierten Titel gießen, der wird betitelt werden, dass wir mit Anfragen und auch Raumnamen gesendet. Okay, also lasst uns schlechter Raumtitel. Also lassen Sie uns Titel und dann von Datentür Name setzen. Auf diese Weise werden wir Titel und vom Namen daneben haben. Aber lassen Sie uns vielleicht Raumnamen in Eltern erleichtern, so dass es ästhetischer aussieht. Ok, geh es. Werfen wir einen Blick darauf, wie wir das senden können. Wir können Admin Dot Messaging getan verwenden, sagte Multicast, und dann Nachricht. Okay, gut. Also müssen wir Admin Dot Messaging verwenden. Lassen Sie uns hier verfügbar erstellen, genannt Messaging auf. Rufen wir Admin-Messaging an. Ok. Perfekt. Jetzt können wir diesen Code tatsächlich kopieren. Lassen Sie mich nur die erste Zeile kopieren, weil wir die Versprechen in Texas nicht nutzen werden. Wir werden einen Think weg verwenden. Also lassen Sie mich const Admin-Messaging anrufen. Ich werde es durch Messaging ersetzen, dann senden Sie Multi Cast und wir werden FC M Nachricht senden, und wir werden es in eine wahre setzen, die Batch antwortet, und dann werden wir auf diesen Befehl warten. Okay, gut. Jetzt ist die Sache, dass Token ungültig sein können oder Token ablaufen können, da, wie Sie sich erinnern, auf Ablehnungs-Token aktualisiert werden können. Wenn das Token aktualisiert wird, ist das vorherige Token nicht mehr gültig. Dies ist also der Fall, wenn wir Token fehlgeschlagen sind. So können wir tatsächlich dieses Code-Snippet verwenden, um zu erkennen, welche Token fehlschlagen, und dann können wir sie aus der Datenbank liefern. Lassen Sie mich dieses Code-Snippet kopieren, und ich kann es so nennen, so dass wir viel Antworten haben und wir überprüfen, ob viel reagiert. Fehleranzahl ist größer als Null als bei allen butterigen Scones-Antworten. Wir schauen uns die Antworten an und prüfen, ob unsere Antworten erfolglos waren. Das ist also der Fall. Wir haben alle fehlgeschlagenen Token auf diese geschlagene Token-Rate geschoben. jedoch Wir wollenjedochetwas mit ihnen machen. Richtig? Wir wollen auch unsere Datenbank löschen. Dafür ziehen wir diese fehlgeschlagenen Token hier nach oben, und wir werden das nächste tun. Dafür ziehen wir diese fehlgeschlagenen Token hier nach oben, Also werden wir unsere fehlgeschlagenen Token aktualisieren. Mit diesem Druck im Inneren entfernen wir diese Konsul Sperre. Und jetzt, da wir alle gescheiterten Token haben, können wir unsere Datenwege tatsächlich aufrufen, bis es alle diese Token hier am Ende gibt, werden wir ein neues Array von Versprechungen erstellen, die wir mit Versprechen Punkt alle wieder ausführen werden , weil wir , bis es mehrere Token aus der Datenbank. Dafür können wir schaffen entfernen Versprechungen wertvoll. Und wir werden jedes gescheiterte Token zuordnen, um so gescheiterte Token-Punktkarte zu versprechen. Dann werden wir Token haben, und wir werden Datenbank Dot Draft nennen. Dann rufen wir FC M Jokinen an als Tokcan und dann die Tür entfernt. Okay, perfekt. So werden wir auf diese Weise am Ende mit einem Strahl aus, entfernen Versprechungen, und am Ende unserer Cloud-Funktion, können wir zurückkehren Versprechen denken alle nennen und wir werden ihn von Versprechungen gießen und dann für den Fall aus jedem Fehler können wir tatsächlich Punktfang Syntex hier anstelle eines Denkens erwarten. Weil dies unsere letzte Operation ist und in diesem Fall besser lesbar aussieht. Also im Falle eines anderen, werden wir Fehlerpunktnachricht zurückgeben. Okay, perfekt. Das ist es also. Das ist unsere Funktion, und so werden wir es verwalten. Ich schätze, das war's für dieses Video. Und im nächsten Video werden wir anfangen, unseren Kunden zu aktualisieren. Wir werden diese Funktion testen und was ich vorschlug zu tun. Wie Sie in Dateien sehen können. Hier, wir haben Sie, d. Bach. Lassen Sie uns diese Datei hinzufügen, um ignoriert zu werden. Sie ich oder vielleicht werden wir alle suchen Dateien zu ignorieren hinzufügen. Wir brauchen sie nicht. Okay, cool. Und wir haben diese Warnung besagt, dass erwartet, um Wert zurückzukehren. Okay, vielleicht können wir tatsächlich unsere Ja Fussel aktualisieren, damit wir eine konsistente, konsistente Rendite setzen würde Null sein. Ok. Und es scheint, als hätten wir hier schon einen irgendwo. Lassen Sie es uns auf Null setzen. Und lassen Sie es uns hier liefern, um diese Art von Warnung in unserer Datei zu vermeiden und auch für den Islam , Darcy, weil wir mehrere es ling Dateien in unserem Projekt haben. Einer im Stammordner und einer hier. Wir wollen auch sicherstellen, dass wir Option Route gleich zwei hinzufügen. Wahr. So wird es jetzt durch Decode erkannt. Okay, perfekt. Also für jetzt sind wir fertig. Lassen Sie uns unsere Änderungen begehen. Gehen wir also nie wieder zum Stammordner zurück. Dann rufen wir an, bekommen alles und dann bekomme Commit und sagen wir, bearbeiten Sie Cloud-Funktion, um FC M-Nachrichten zu senden . Perfekt. Wir sehen uns im nächsten. 153. Fehler Fix beseitigen: He, da. Im vorherigen Video, als wir schickte FC M Cloud-Funktion erstellt haben, habe ich ein paar Rechtschreibfehler gemacht, die ich in diesem Video beheben möchte. Der erste Fehler liegt in den Raumdaten zugrunde. Wir möchten Daten vom Raum-Snapshot-Punktwert erhalten, also lassen Sie es uns reparieren. Teoh Raum Snapshot Punktwert, dann ist der zweite Fehler innerhalb halb cm Benutzer. Wir wollen unsere Daten von DAR FC M-Benutzern anstelle von FC M-Benutzern transformieren. Dann, wenn wir scrollen nach unten zu FC ein Nachrichtenobjekt hier. Wir haben Registrierungstoken verwendet, und dieser Fehler kommt vom Kopiertempo aus der Firebase-Dokumentation. Also lasst uns es entfernen und lasst uns Token setzen und das gleiche Handy tun in fehlgeschlagene Token nicht schieben, weil wir sicherstellen wollen, dass wir Token von unseren Token erhalten, eine Vergewaltigung. Wenn wir dann nach unten scrollen, wird das allerletzte sein. Du musst eingeloggt sein und das war's. Alles andere sieht gut aus. Jetzt. Speichern wir die Datei und übernehmen Sie unsere Änderungen. Lassen Sie uns alles vergessen, dann bekomme Commit und lass uns sagen, korrigiere Rechtschreibfehler. Perfekter CEO im nächsten 154. Meldungen mit Cloud-Funktionen senden: Hey, da. In diesem Video arbeiten wir mit Kunden zusammen und erstellen ein Modellfenster, aus dem wir eine Anfrage an unsere Cloud-Funktion senden und dann eine Benachrichtigung an Absi senden. Uhm, Benutzer. Gehen wir, Gehen wir zurück zu B s Code. Und zuerst, lassen Sie uns Feuer Base Duchy s öffnen und lassen Sie uns Funktionen Paket importieren. Also oben werde ich Import-Firebase-Schrägstrichfunktionen einfüllen. Nun grüßen wir eine neue Instanz. So exportieren Sie const Funktionen App DAR-Funktionen. Und als er öffnete, sagt Parenti, dass Sie hier eine Region sehen können. Die Sache mit Cloud-Funktionen, dass sie standardmäßig in mehreren Regionen verfügbar sind. Sie sind in der Region U. S Ost verfügbar . Für europäische Nutzer ist das nicht großartig. Deshalb müssen wir die Region von unserer Funktion abwechseln. Dazu navigieren wir zu FC M Dodgy s an der Stelle, an der wir diese Funktion erstellen. Und innerhalb dieser Definition, lassen Sie uns eine weitere Kette aus einer Region hinzufügen und innerhalb Blase angegeben, dass diese Funktion auf Europa West drei Region ausgeführt wird . Sie können angeben, welche Region Sie möchten. OK, also Europa West drei Und jetzt, wenn wir diese Instanz initialisieren, müssen wir Europa West drei passieren, damit es funktioniert. Und auch wenn wir diese Funktionsinstanz in unserem Client verwenden, wird es versuchen, auf die rial Cloud-Funktion zuzugreifen, die bereits bereitgestellt ist. Aber für die lokale Entwicklung ist das nicht gut. Deshalb müssen wir hier unten überprüfen Wenn wir derzeit in der lokalen Entwicklung dann werden wir Funktionen verwenden. Amma später, dass wir mit MP Enron laufen, starten Sie innerhalb Functions Ordner. Also, hier, wenn wir gehen, um zu überprüfen, ob lokalen Host und ist lokalen Host zuvor in Videos Wir exportiert es von hier haben wir extrahiert Dies ist lokaler Host wertvoll aus Service Worker Datei erstellt von Creek React App und jetzt werden wir es verwenden. Okay, so ist der lokale Gastgeber. Lassen Sie es uns importieren. Also, wenn das der Fall ist, dann sagen wir Funktionen, benutzen Funktionen. EMLeader und wir müssen das Europa dafür angeben. Gehen wir zu Functions Ordner in unserem Terminal. Und hier werden wir jive und PM Ron beginnen und sehen uns die Ausgabe. In Ordnung. Wie Sie sehen können, läuft unser Funktions-Emulator auf dem lokalen Host 5001. Also müssen wir hier http als lokalen Host und 5001 angeben. In Ordnung, jetzt sind wir alle bereit, unsere verstorbenen. Jetzt lassen Sie uns das eigentliche Moto erstellen. Also gehen wir zum Chat-Fenster oben. Und in diesem Ordner werden wir jede Datei erstellen, die wir geschickt FC M Bt in Moto gs nennen . Und tatsächlich werden wir Code kopieren und einfügen von Lass uns navigieren, um Raum Beat und Moto zu schaffen , also werden wir all das nennen und es hier platzieren. Jetzt fangen wir an, Dinge zu ersetzen. Also zuerst werden wir es umbenennen, um FC M Bt und Modell zu senden, und lassen Sie uns diese Komponente tatsächlich innerhalb von Index-Togs innerhalb des oberen Ordners verwenden . Also hier, anstatt dies zu tun, werden wir fragen, ob unser Benutzer admin ist, dann zeigen Sie uns bitte. Senden FC M Bt und Moto. Alles klar, gut. Jetzt beginnen wir, Komponente zu ersetzen. Zuerst werden wir unser Motil für unser Formular überprüfen, damit wir keinen Namen und keine Beschreibung haben. Wir werden Titel und Nachricht haben, die wir an unsere Cloud-Funktion senden, so Titel und Nachricht und ist erforderlich. Wir sagen, Titel ist erforderlich und Nachrichtentext ist erforderlich. Okay, gut. Lassen Sie uns nun diesen Import löschen, als unsere ursprüngliche Form wird betitelt werden und Nachricht jetzt lasst uns importieren motile State wieder verwenden. In Ordnung, also haben wir Form. Der Wert ist für ihn geladen. Grob beim Einreichen. Okay, wir werden es etwas ändern. Also, eigentlich, löschen wir diesen Teil und behalten ihn so. Jetzt, hier, in Js sechs. Wir werden das entfernen, Steve komplett. Wir werden diesen Klassennamen entfernen, und wir werden ihn als Reaktionsfragment belassen. Also für die Schaltfläche, werden wir das Aussehen von primär angeben und die Größe wird extra klein sein, als es nicht eine Blockkomponente und Farbe sein wird. Lassen Sie uns die Standardfarbe behalten. Also, weil ich kann, werden wir angeben, dass ich eingehalten habe. Cast und wir werden sagen, Broadcast-Nachricht statt gesendet FC M. Lassen Sie uns ein wenig kreativer sein. Also für Model, das ist in Ordnung. Lassen Sie uns den Titel ändern, um Benachrichtigung Teoh Zimmer Benutzer als für dieses Formular zu senden. Es sieht gut aus für Formulargruppe. Wir werden es ändern. Teoh Titel Formular-Steuerelement Name wird Titel und Platzhalter werden geben Nachricht Titel als vier Beschreibung. Wir werden es wieder in Nachricht ändern. Es wird ein Textbereich-Komponente unseres Namens wird Nachricht sein. Dieser Name muss mit unserem Statusschlüssel übereinstimmen , der Titel und Nachricht ist. In Ordnung, also bitte, Inhaber muss so etwas wie und die Benachrichtigungsnachricht sein. Okay, gut. Und für diesen Knopf am unteren Rand. So Aussehen, primäre auf klicken Sie auf Block senden. Okay, es sieht gut aus. nun Lassen Sie unsnunnur den Text ändern, um eine Nachricht so zu veröffentlichen. Okay, gut. Werfen wir nun einen Blick auf die Spitze. Wir haben nicht benötigte Warnung und auch einen notwendigen Firebase-Import. Nehmen wir an, wir navigieren zurück zum Tschad. Und jetzt haben wir dieses moralische Fenster, also geben Sie einen Titel und eine Nachricht ein. Alles klar, jetzt definieren wir die Funktionalität. Was wird also bei Submit passieren? Wir müssen eine Anfrage an unsere Cloud-Funktion senden. Und wie Sie sich erinnern, ist unsere Cloud-Funktion eine aufrufbare Funktion, und wir verwenden Funktionen als verfallen. Deshalb wird es so einfach sein. Also lassen Sie uns Kitsch-Block hier drüben versuchen. Lassen Sie uns beiseite legen, wie folgt nach oben geladen wird, also innerhalb des banalen Kitsch-Blocks, wir werden das nächste tun, zuerst werden wir alle wertvollen gesendeten FC M erstellen und dann werden wir Funktionen als verfallen aufrufen , die wir von Firebase Dodgy S. Dann rufen wir https leichtgläubig an. Und hier müssen wir den Funktionsnamen angeben, den wir aufrufen möchten, also ist dies sehr wichtig. Also innerhalb Index-Togs exportieren wir senden FC M Cloud-Funktion. Das ist sein Name. Alles klar, also lassen Sie es uns kopieren. Und hier werden wir angeben, dass wir gesendete FC M Cloud-Funktion aufrufen werden. Diese Methode https leichtgläubig, gibt uns zurück und Sie Funktion, die wir aufrufen müssen, um tatsächlich eine Anfrage an Cloud-Funktion zu senden . Ordnung, das ist nicht die Anfrage selbst. Also jetzt müssen wir anrufen oder aufrufen ate Sand FC M mit Daten, die wir an Cloud-Funktion übergeben möchten . Und dann werden diese Daten hier unter diesen Daten verfügbar sein. Also, was wir tun werden, werden wir ein Gewicht nennen als FC M geschickt Und im Inneren werden wir vorbei Chat I d. Wie Sie sich erinnern, müssen wir Tschad I d Titel und Nachricht erhalten. Also, Chet Idee, wir müssen es zuerst bekommen. Also lasst uns hier und die Top-Char i D. Hughes Programme setzen. Okay, gut. Also haben wir überprüft, ich d und auch wir müssen Titel und Nachricht senden, was unser Formularwert ist. So können wir es einfach so in diesem Objekt verteilen, und jetzt wird es die Anfrage senden. Also am Ende werden wir gesagt haben, ist das Laden solcher Kleinigkeiten. Dann werden wir sat Formwert auf den Anfangswert nennen. Also anfänglich für und auch wir werden dieses Motorfenster schließen. Also, im Falle einer Warnung oder im Falle eines anderen, werden wir Alarm rufen, als an unserer und dann jemals Dock-Nachricht mit der Idee Nein. Sieben Sekunden. Und auch im Falle eines Erfolgs, werden wir Alert-Info angeben und wir sagen Benachrichtigung. Hat die Bohne gut geschickt? Sieht ziemlich genial aus. Sehen wir uns jetzt an, wie ich hier sehen kann, muss ich es nach oben verschieben. In Ordnung, lassen Sie uns navigieren. Gehen wir zur Broadcast-Nachricht. Lassen Sie uns etwas Super angeben und veröffentlichen. Nachricht und Benachrichtigung wurden gesendet. Jetzt schauen wir uns mal an. Wenn wir unser Terminal öffnen, können wir sehen, dass in unserem rechten Terminal, wo wir Cloud-Funktion laufen, wir können sehen, dass beginnende Ausführung beendet ist, so dass es tatsächlich funktioniert. Werfen wir einen Blick in unseren Rat. Wir sehen nichts. Und vielleicht wollen wir versuchen, es noch einmal zu schicken, um zu sehen, was passieren wird. Und lassen Sie uns Netzwerk-Tap öffnen. Also sagte ich die Nachricht. Dann können Sie sehen, dass die Anfrage an den lokalen Host Chat gesendet wird. Web up Europa war drei Sand FC um, habe ich jemals gesehen, dass das Ergebnis falsch ist. Und das liegt daran, wie Sie sich erinnern, in unserer Cloud-Funktion, überprüfen wir gegen Raumdaten FC M-Nutzer. Aber jetzt, in unserer Datenbank, wenn wir unsere Zimmer öffnen, haben wir noch keine FC M-Nutzer. Wir müssen es ändern. Also können navigieren, um Raum Bt und Moto zu erstellen und hören, was wir spezifizieren werden. Also für zugibt, werden wir auch aktuellen Benutzer Ihre i d verwenden. Aber auch, wir werden FC um Benutzer angeben. Der erste Admin. Der Ersteller aus diesem Raum erhält standardmäßig auch eine Benachrichtigung. Also lassen Sie es uns so kopieren. Nehmen wir an, wir sind und jetzt müssen wir die bestehende Gruppe ändern, aber das lassen Sie uns eigentlich zuerst unseren Benutzer i d. von hier kopieren . Dann lassen Sie uns auf dieses Pluszeichen klicken und sagen wir FC M-Benutzer. Dann wieder, Pluszeichen. Lassen Sie uns unseren eigenen Benutzer hinzufügen. Ich d Und dann für den Wert. Lasst uns für die Wahrheit. Dann fügen wir diesen Wert hinzu. , Lassen Sie uns versuchen,noch einmal eine Nachricht zu senden, also werde ich etwas Dummes sagen. Okay? Benachrichtigung wurde gesendet. Wenn ich meinen Konsul jetzt geöffnet habe, kann ich sehen, dass ich ein neues Konsul Log erhalte, das von Firebase Dodgy s stammt. Und wenn ich diese Datei öffne, kann ich sehen, dass es von dieser Nachricht auf Nachricht kommt. Also habe ich von der Benachrichtigung, Ich habe Körper und Titel. Nun, das einzige, was ich hier tun muss, ist, diese Benachrichtigung tatsächlich benutzerfreundlicher anzuzeigen . Warten Sie. Nun, das wird ziemlich einfach mit Toast oder Benachrichtigungskomponente zu tun sein, die von unserem Anzug kommt . Was wir tun werden, wir die Benachrichtigung als Toast aus unserem Anzug importieren. Warum? Ich benutze hier. Benachrichtigung hat Toast auf keine Benachrichtigung, da die Benachrichtigung auch als global wertvolles innerhalb des Fensters Objekt im Browser verfügbar ist. Es könnte also verwirrend sein und wir könnten einfach etwas machen. Nur um sicherzustellen, dass wir eine benutzerdefinierte Komponente verwenden, haben wir es dosiert genannt. Also hier drinnen auf Nachricht. Wir gießen so etwas wie, wie Sie sich erinnern, wir haben eine Benachrichtigung. Objekt innen, damit wir es von hier aus zerstören können. Benachrichtigung. Und dann rufen wir wieder an, wir werden Chur diesmal aus dem Titel und dem Körper der Benachrichtigung zerstören . Also, jetzt haben wir diese zwei Schlüssel und wir rufen Toasttür in vier. Dann werden wir Titelbeschreibung und Beschreibung gießen wird Körper und alt sein, so Dauer Null. Also, was es tun wird, wird es Gericht und Sie komponieren eine Benachrichtigungskomponente aus unserem mit diesem Titel mit diesem Körper, das ist die Beschreibung. Behalten Sie, dass wir diese Informationen durchlaufen müssen und dann die Dauer auf Null gesetzt ist, so dass sie nie von selbst geschlossen wird. Wir müssen diese Benachrichtigung manuell schließen. Alles klar, jetzt lassen Sie uns genießen und schauen wir uns mal an. Also, wenn ich so etwas wie ein Low und dann ist das Körper und veröffentlichte neue Nachricht Jetzt habe ich diese Benachrichtigung und das ist es. Allerdings gibt es noch eine coole Sache. Wenn ich auf etwas wie diese veröffentlichte Nachricht klicke und wenn ich auf diese Schaltfläche klicke und dann schnell zwischen Taps wechseln. Jetzt erhalte ich diese Benachrichtigung. Ziemlich cool, richtig? Das ist es also. Und so wird es funktionieren. Und alle Benutzer, die diese Broadcast-Nachrichten abonniert haben, erhalten sie auf ihren Geräten. Entweder ist es PC oder Mobilgerät oder was auch immer Gerät zu verwenden. Aber das ist, was wir im nächsten Video verwalten werden. Moment sind wir hier fertig. Lassen Sie uns unsere Änderungen begehen. Öffnen wir unser Terminal. Hier ist eine gute Sache. Es gibt uns Firebase Warnung sagen, dass mit einem nicht spezifizierten Index. Also lassen Sie uns tatsächlich hinzufügen, und Sie indizieren zu unseren Datenbankregeln. Also lasst es uns öffnen. Und, wie Sie sehen können, erwägen Sie, Index für den Wert bei FC M-Token hinzuzufügen. Gehen wir also zu FC M-Token. Dann werden wir Index hinzufügen. Also lassen Sie uns von irgendwo kopieren und es hier drüben setzen und Index auf wird Punktwert sein. OK, jetzt veröffentlichen wir diese Änderungen. Lassen Sie uns alle kopieren. Gehen wir zu Datenbankregeln, Jason, und lassen Sie uns sie so ersetzen. Okay, schau, erzielte. Jetzt lassen Sie uns unsere Änderungen übernehmen. Endlich. Also lass mich alles aufhalten, dann werde ich alles erledigen und dann begehen. Und dann werde ich sagen, verwalten FC M von Werk namens Cloud-Funktion und schickte FC M Perfect. Wir sehen uns im nächsten. 155. FCM verwalten: Hallo. In diesem Video erstellen wir ein neues Modellfenster. Immer werden Benutzer fragen, ob sie Benachrichtigungen erhalten möchten oder nicht. Lass uns gehen. Gehen wir zurück zum Code und unter Chat-Fenster Topordner. Lassen Sie uns eine neue Datei erstellen. Fragen FC M Bt und Modell. Lasst uns voll diese Komponente gehen. Es wird mit dem Akt Frackman abgedeckt. Und als Auslöser werden wir Aiken-Knopf für Aiken gießen. Wir werden angeben, ich kann Komponenten und für ich kann Komponente zitieren. Ich kann Podcast nennen. Diese ich kann Button auch blauen Kragen Größe wird klein sein und es wird auch ein Kreis sein. Lass es uns retten. Gehen wir zu Index Herzogtum Ja, im oberen Ordner Und lassen Sie uns diese Komponente in dieser Symbolleiste benutzen, direkt vor einem Detroit Beach und Robert. Lass uns schlecht fragen FC M Beach in Moto. Nehmen wir an, warten Sie und lassen Sie uns einen Blick jetzt, Wie Sie sehen können, habe ich diese gebrochene Markierung oben, und das ist, weil, wenn wir bearbeiten Zimmer Strand Intro Burr öffnen waren nach oben in dif Element. Lassen Sie uns es entfernen und lassen Sie uns Fragment reagieren. Nun, wenn wir einen Blick werfen. Alles ist gut ausgerichtet. Perfekt. Jetzt lassen Sie uns weiter bauen unsere fragen FC und geschlagen und Moto. Also lasst uns hier ein Motelfenster definieren. Im Inneren werden wir sterbliche Kopfzeile als Körper und Fußzeile haben. Lassen Sie mich alle angeben. Also in Heather, werden wir sterbliche Punkttitel haben und die Leute sagen nicht Tee Urlaub. Erlaubnis. Okay, gut. nun etwas im Körper anzuzeigen, Umnun etwas im Körper anzuzeigen,müssen wir wissen, ob unser derzeitiger Benutzer bereits FC M-Nachrichten empfängt. Dafür müssen wir einen anderen Wert in unseren Kontext gießen. Gehen wir zu Tschad Togs. Dies ist also Seite, wo wir einige Kontextdaten über unseren aktuellen Raum übergeben haben. Hier können wir unsere FC M Benutzer bekommen, Also lassen Sie uns schlechte FC M Benutzer wertvoll. Dann werden wir Transformation zu Array als aktuelle Raum FC M-Benutzer aufrufen. Jetzt müssen wir unseren Bullen holen. So werden wir erstellen wird FC M empfangen und wir werden fragen, ob FC missbräuchliche Array US aktuellen Benutzer enthält . Deine verdammte Vergangenheit. Dies empfängt FC und Bullen zu unserem aktuellen aus dem Kontext. Jetzt speichern wir es und im Inneren fragen FC M Between Moto, wir erhalten ist Empfang FC M von der Verwendung aktuellen Raumhaken. Ok, perfekt. Aber für Selektor, lassen Sie uns geben Wert wird FC M Good empfangen. Jetzt zum Modell brauchen wir den sterblichen Zustand. Also lassen Sie uns dieses Modell Zustandshook verwenden und Sie erhalten, wie immer, ist offen, nah und offen. Also für sterbliches Fenster, werden wir Show-Eigenschaft angeben, die auf Verstecken offen sein wird. Du wirst nah dran sein. Und auch werden wir eine andere Requisiten angeben, die wir vorher nicht verwendet haben, wie Größe. Lassen Sie uns extra klein angeben und auch Hintergrund wird statisch sein. Alles klar, jetzt lassen Sie uns unser bedingtes Rendering nach innen gießen, aber bevor Sie mich diese Angelegenheit schnell reparieren lassen und auch hier, und wir brauchen das nicht. Also in der Fußzeile, um diese rote Linie für einen köstlichen Put-Button mit Text hoch und innen Körper zu vermeiden , wird bedingte Rendering setzen. Also werden wir fragen, ob FC M empfangen wird dann werden wir ein Diff-Element mit Klassennamen aus dem Textcenter setzen. Und in diesem Dave, werden wir setzen Ich komme mit Klassennamen von Text grün und Rand unten drei, so kann ich nennen wird überprüfen Kreis und Größe wird fünfmal groß sein. Und neben diesem, Ich kann Wir liefern H sechs Titel mit Text. Sie sind abonniert Broadcast-Nachrichten, die von Anzeige Mons aus diesem Raum gesendet werden. Alles klar, gut. Nun, wenn wir keine Nachrichten abonnieren, dann werden wir wieder eine andere live mit Klassennamen aus dem Textcenter zeigen dieses Mal ein anderes Symbol mit Klasse. Nennen Sie Text Blau und Rand unten drei als auch. Also kann ich nennen, wird befragt werden. Kreis und Größe wieder fünfmal groß. Nun neben diesem Aiken wieder, h sechs Titel. Und möchten Sie meine Nachrichten abonnieren, die von Werbeanzeigen aus diesem Raum gesendet werden? Okay, gut. Neben diesem bedingten Rendering werden wir einen weiteren Text gießen. Also lasst uns p-Tag und Klasse setzen. Name wird Marge oben zwei sein, und wir werden sagen, um Benachrichtigungen zu erhalten, stellen Sie sicher, dass Sie nicht Urlaub in Ihrem Browser erlauben. Alles klar, gut. Lassen Sie uns genießen und werfen Sie einen Blick. Also, bevor wir das tun können, lassen Sie uns auf Klick-Handler für Aiken Schaltfläche gießen. Lassen Sie uns aufmachen und schauen wir uns mal an. Okay, wenn ich also auf diesen Button klicke, habe ich Benachrichtigungen. Erlaubnis? Sie sind abonniert, um Benachrichtigungen zu erhalten. Stellen Sie sicher, dass Sie Benachrichtigungen in Ihrem Browser zulassen. Außerdem wäre es schön, wenn wir eine Art Wert hätten, der angibt, ob wir die Berechtigung haben oder nicht. Denn wenn wir diese Seite Informationen hier öffnen, haben wir unterschiedliche Berechtigungen beschränkt, wie zum Beispiel für Standort, Mikrofon und Benachrichtigungen. Wenn dies also auf Blockierung gesetzt ist, können wir nichts empfangen. Deshalb ist es gut, hier anzuzeigen. Aber dass die Erlaubnis erteilt wird, waren nicht dafür. Setzen wir es neben diesem P-Tag-Berechtigungsindikator. Also werden wir Erlaubnis sagen. Dann lassen Sie uns an Bord Doppelpunkt und dann setzen bedingte Rendering. Also setzen wir Benachrichtigung und Benachrichtigung ist das globale Objekt im Fenster im Browser. Wenn ich jedoch sehen kann, dass dies Benachrichtigungen ap I ist Also, wenn die Benachrichtigungspunkt-Berechtigung zwei grunzt entspricht , dann werde ich ein gesponnenes Element anzeigen, das Grunzen sagt und uns einen Klassennamen absetzen Text grün Andernfalls, wenn wir nicht die Erlaubnis haben, werden wir Spanne mit Text de Nacht anzeigen und Klassenname wird Text gelesen werden. Perfekt. Aber jetzt kann ich es retten, weil es scheint, als hätte ich irgendwo besser. Alles klar, lasst uns diesen Pitak bis zum Ende so machen. Okay, sieht gut aus. Jetzt schauen wir uns mal an. Wenn ich dieses Fenster jetzt geöffnet habe, habe ich eine Berechtigungsfront. Es sieht aus, jetzt müssen wir unsere Funktionalität definieren. So innen Fußzeile. Lassen Sie uns zuerst einen Schließen-Knopf setzen. Also lassen Sie mich eine rekapitalisierte machen und auf Klick wird in der Nähe sein. Und direkt vor dieser Schaltfläche werden wir unsere Haupttasten für Funktionalität setzen. Also werden wir fragen, ob unser Benutzer FC M erhält dann werden wir Button mit Text setzen. Ich habe meine Meinung geändert, denn wie Sie sich erinnern, haben wir diese Frage. Möchten Sie Nachrichten für Farbe abonnieren? Wir werden grün angeben und für unclipped werden wir auf Abbrechen Funktion nur in einem Moment erstellen . Andernfalls werden wir, wenn wir keine Benachrichtigungen erhalten, eine andere Schaltfläche zitieren. Aber Text Ja, ich möchte abonnieren. In Ordnung. Zum Aufklappen werden wir außer und für eine Farbe gießen. Wir werden auch grün arbeiten. Alles klar, lassen Sie es uns retten. Und jetzt definieren wir zuerst unsere Funktionen. Lassen Sie uns aufgießen. Abbrechen am. Abbrechen und hier werden wir auf unsere Datenbank verweisen. Also lassen Sie uns Datenbank setzen, die wir aus Firebase-Datei als Referenz importieren. Und die Leute spezifizieren Zimmer, Schrägraum I D oder Chat I D, dass wir von Gebrauch Paramus Hook bekommen. Also chatten i d. Er wird von der Verwendung Dauerwellen erhalten. Lassen Sie uns diesen Import nach oben verschieben, als wir FC M-Benutzer referenzieren und für Kind, das ist aus dem aktuellen Benutzer. Lassen Sie uns wichtig aus aktuellen Benutzer Sie ich d nicht entfernen. Wir werden dieses Objekt einfach aus unserer Datenbank entfernen. Gut. Nun lassen Sie uns die zweite Funktion definieren, die außer ist und die andere Nationalität wird ziemlich ähnlich lästig sein. Kopieren Sie das, Nipper. Und anstatt dieses Kind zu entfernen, werden wir es auf die Wahrheit setzen. In Ordnung? Perfekt. Jetzt lassen Sie uns wirklich getestet. Also lasst uns unser Motil öffnen und hier klicken wir auf Ich habe meine Meinung geändert und jetzt können Sie sehen, dass Konditionalität eintritt funktioniert. Und wenn wir in die Datenbank schauen, gehen Sie in Zimmer Jetzt haben wir keine FC M-Benutzer. Wenn ich auf Ja klicke, tue ich. Jetzt haben wir FC M-Benutzer mit meinem Benutzer i d Einsicht, Aber um es ein wenig benutzerfreundlicher zu machen. Lassen Sie uns tatsächlich eine andere Farbe für unseren Aiken-Button definieren. So werden wir Aussehen sagen. Wenn unser Benutzer FC M erhält, dann werden wir Standard-Aussehen gießen. Sonst werden wir Geist setzen und werfen einen Blick, was passieren wird. Also, wenn ich sage, was jetzt habe ich diese Farbe blau hier drüben mit dem normalen Aussehen. Alles klar, wenn ich jetzt meine Meinung ändere, habe ich dieses Geisterbild ohne die Farbe im Boden. Okay, gut. Das ist es also. So sind wir in der Lage, unsere Benutzer zu verwalten, aber sie wollen abonnieren oder nicht. Wenn sie also nicht abonnieren, bedeutet dies, dass sie keine Benachrichtigung erhalten, die von dieser moralischen Form gesendet werden. In Ordnung, also schätze ich, das war's für dieses Video. Und dies ist die Zeit für uns, unsere Veränderungen zu begehen. Öffnen wir unser Terminal und dann gehen wir zu Dar und bekommen dann Commit. Lassen Sie uns ein Mann Alter FC M Benutzer mit dem fragen FC M vtm Moto perfekt, um diese Reise zu beenden. Lassen Sie uns Bush alles online, um aufzustehen. Holen Sie sich Bush Ursprung Muster, nachdem es fertig ist. Lassen Sie uns laufen, Firebase bereitstellen und genießen Sie unsere Chat-Anwendung online. Ich freue mich, sagen zu können, dass wir mit diesem Projekt fertig sind. Wir haben alles umgesetzt, was wir wollten. Die Echtzeit-Benachrichtigungen, Administratorrollen, Benutzerpräsenz. Wir haben alles an Ort und Stelle. Es wird noch ein paar weitere Videos über das React-Konzept geben, die wir in diesen drei Projekten nicht behandelt haben . Trotzdem hoffe ich, dass es für uns beide eine wertvolle Erfahrung war. Und ich hoffe, dieser Kurs gibt Ihnen, wofür Sie gekommen sind. Danke dafür. Zeit und Geduld. Wir sehen uns das nächste Mal. 156. Schlüsselfunktionen: Hey, in diesem Abschnitt werden wir Reaktionsfunktionen behandeln, die fast jede reguläre Produktionsanwendung hat . Aber wir hatten keine Chance, sie in unseren Projekten einzusetzen. Alles, was hier behandelt wird, wird auf unsere endgültige Projekt-Chat-Anwendung angewendet werden , um uns mit dem Code Doppelreferenz offizielle Reaktionsdokumentation zu helfen. Ich empfehle Ihnen, es selbst zu lesen, um besser zu verstehen, wie reagieren funktioniert. Wir sehen uns im nächsten Video. 157. React: Heiligkeiten. In unserem ersten Video geht es um React. Portale und Portale ist nur ein Weg Teoh. Rendern Sie etwas mit reagieren außerhalb def mit idealen Früchten. Was ich meine, wenn wir unsere Chat-Anwendung öffnen und wenn wir unsere Elemente inspizieren, wir wissen, dass alle unsere Elemente, alle unsere Komponenten, unsere App geht unter diesem dif mit Idee schrieb richtig, Jedoch, Werfen wir einen Blick, wenn wir ein Modellfenster öffnen, wo es gerendert wird. Also, wenn ich das durch acht neue Chaträume geöffnet habe, können Sie das hier unten sehen. Ich habe diesen Dialog, und wenn ich ihn öffne und wenn ich es inspiziere, können Sie sehen, dass mein neues Modell Chatham außerhalb dieser Route gerendert wird. Dafür werden Portale verwendet. Dies ist nützlich für so etwas wie Modellfenster oder Tooltips oder Hovers. Ich weiß nichts, was Mieter es außerhalb der Hauptkomponente behandeln muss. Dies ist sehr nützlich, wenn wir uns mit Z Index CSS-Eigenschaft beschäftigen. Lassen Sie uns also nie zurück zur Dokumentation und schauen wir uns hier Beispiele an, die Sie Wörter lesen können , die ich Ihnen gerade gesagt habe, indem Sie sich dieses Beispiel ansehen, es könnte zu kompliziert sein, zu verstehen, was los ist. Anstatt also das Klassenmotil aus der Dokumentation zu kopieren , ,zu ändern, öffnen wir unseren Code. Ich bereits Iran die Anwendung und andere Komponenten. Lassen Sie uns ein neues Dateimodell erstellen. Lassen Sie uns eine neue Komponente erstellen. Und hier, anstatt diesen Dave aus der Dokumentation zurückzugeben, können wir sehen, dass wir in der Lage sind, React zu verwenden, keine Portal-Methode zu erstellen. Also statt dieses def, lasst uns zurückkehren. Erstellen Sie Portal und es wird automatisch für uns importiert. Und wenn ich Parteien öffne, wie ich sehen kann, dass hier ich Kinder habe und dann Element Alles klar, Behälter. Also für Kinder werden wir Kinder stellen, die zu dieser sterblichen Komponente gehen werden. Also hier werde ich eure Kinder vernichten. Und dann werde ich es passieren, um Porto als unseren Container zu erstellen. Muss ein anderes div sein, das Probleme innerhalb des Index-html definieren. Also hier haben wir schon diese andere mit der Idee Satu Road. Lassen Sie uns nun einen weiteren Tag erstellen, wenn dies ein Container für unsere Modellfenster sein wird. In Ordnung, also hier werden wir Dave erstellen und ich d wird Modellroute sein. Speichern wir es und innerhalb von Modell-Togs. Wenn wir die Dokumentation öffnen, können wir es mit Dokument bekommen. Holen Sie sich Element von I. D. Also lassen Sie uns das kopieren. Lassen Sie uns es hier an der Spitze stellen und Portal als zweites Argument zu schaffen, werden wir moralischen Weg passieren. Ok, perfekt. Jetzt lass es uns retten. Und es sagt, dass reagieren wird erklärt. Nie benutzt. In Ordnung, also lassen Sie es uns vielleicht entfernen. Jetzt lass uns aufmachen. Vielleicht unterschreiben Seite. Und hier, lassen Sie uns dies willkommen zum Chat machen. Lassen Sie uns ihren Besuch ausführen, wenn in unserem Modellfenster. Also hier werden wir Modell aus unserer Datei importiert, die wir erstellt haben, nicht aus unserem Anzug. Also lassen Sie uns diesen Import entfernen, und ich möchte ihn aus unserer Datei importieren. In Ordnung. Scheint, als ob es aus unserem Anzug importiert. Lassen Sie uns es manuell aus dem Komponentenmodell importieren. Perfekt. Also in diesem Modell, werden wir unsere def mit Textmitte setzen. Nun, wenn wir nie wieder zu unserer App kommen Wenn wir uns jetzt abmelden, können Sie diese willkommen sehen. Chad befindet sich und der Boden Und wenn ich zu Elementen gehe und wenn ich meinen stummen Baum hier unten inspiziere , kann ich sterbliche Route sehen. Und innerhalb dieser Modellroute haben wir unser Willkommen auf dem Stuhl unter Textmitte beschränkt. Dies ist also ein Dies wird in Ihren Augenbibliotheken wie unsere CLR für Modellfenster und für Tool-Tipps verwendet. Zum Beispiel, wenn wir erstellen mussten, reagieren sie Anwendung ohne die Verwendung von Tear I-Bibliothek und wir mussten motile Fenster implementieren. Höchstwahrscheinlich würden wir React-Portale verwenden, weil sie außerhalb unserer wichtigsten selbstbewussten Leckerbissen gerendert werden. Sie können es praktischer Onley finden, wenn Sie in es auf einem realen Weltbeispiel zu bekommen. Das ist in Ordnung, wenn du es nicht ganz verstehst. Aber glauben Sie mir, das ist das Schlüsselkonzept, das Sie zumindest wissen müssen. Ok. Vielen Dank. Wir sehen uns in der nächsten. 158. Error: Hey, da. In diesem Video werden wir über ihre Brötchenbäume sprechen. Gehen wir zurück zum Gericht und lassen Sie uns hier anmelden. Was wird passieren, wenn wir sagen, einen Fehler in dieser Komponente werfen? Lassen Sie uns schlecht werfen neuen Fehler. Etwas Schlimmes passiert. Jetzt sagen wir was und schauen wir uns an. Wenn ich die Farbe auffrischen, können wir sehen, dass wir nie und etwas Schlimmes passiert haben. Und die Sache ist, dass diese eingeben ist auf gefangen. Es bedeutet, dass es durch reagieren aufgerufen wird, aber nicht von uns, und schließlich reagieren wird den gesamten kompetenten Baum, was wirklich schlecht ist, wenn wir eine Produktion bereit durch Anwendung, um zu verhindern, dass wir bessere Brötchen Bäume haben die Grenzen sind Komponenten, die alle diese Art von Buchstaben fangen und die Anzeige bei Fullback Sie I, zum Beispiel, eine Nachricht, dass diese ausgelagerten abgestürzt. Bitte aktualisieren Sie es. Wenn wir also die Dokumentation öffnen, haben wir ein offizielles Beispiel beschränkt, wie man eine einfache Antwort-Butt-Baum-Komponente erstellt. Und für die meisten Fälle ist das genug. Es sei denn, Sie haben eine wirklich ausgeklügelte Fehlerprotokollierung oder ich weiß nichts, was ich vorgeschlagen habe, möchte ich zu einer Live-Demo gehen? Dann möchte ich, dass Sie dieses Beispiel öffnen und von hier werde ich das kopieren. Geben Sie Bunge re Klasse. Lassen Sie mich das alles kopieren. Dann werde ich dekodieren öffnen und dann innerhalb von Komponenten, werde ich dir eine Datei erstellen, die jemals Bun gery ist. Und im Inneren werde ich diese klassenbasierte Komponente setzen. Und seien Sie nicht beängstigend über diese Komponente, dass sie klassenbasiert ist. Ich werde alles erklären, was hier stattfindet. Also lassen Sie mich importieren, reagieren von reagieren. Und auch wir haben viele Ja Länge Warnungen. Lassen Sie uns alle deaktivieren. Ich klicke einfach auf Quick Fix und deaktiviert für die gesamte Datei. Dasselbe werde ich auch hier tun. Jetzt lass es uns retten. Und was hier im Konstruktor vor sich geht, definieren wir in Ihrem Zustand , der ein Objekt mit immer und Fehlerinformationen ist, als eine kompetente Urkunde Catch, Lifecycle Hook oder Lifecycle Event zu verwenden . Wir fangen jeden Fehler auf, der in dieser Komponente passiert, okay? Oder zu seinen Kindern. Wenn wir einen Fehler haben, aktualisieren wir diesen Zustand, dann innerhalb der Rendermethode. Wenn wir irgendwelche Fehler in unserem Zustand, die gespielt wird die Fullback ey. Und ansonsten, wenn alles in Ordnung ist, rendern wir einfach alle seine Kinder. Okay, ziemlich einfach. Um diesen Editor zu verwenden,müssen wir unseren ganzen Baum in diesen Brief einwickeln. Um diesen Editor zu verwenden, Bunbury. Also lasst uns Abdel Gs öffnen. Und hier werde ich für immer Haufen wir Komponenten, die wir erstellt haben. Lass mich das alles retten. Dann navigiere ich zurück zu meiner App. Ich werde den Verstärker auffrischen und jetzt habe ich noch diese Reaktionswarnung. Das liegt daran, dass wir im Entwicklungsboot sind. jedoch Wenn ich esjedochjetzt schließe, anstatt Seite zu signieren, habe ich diese etwas eine falsche Nachricht mit den Details im Inneren. Und wenn ich meinen anderen Brötchenbaum öffne, kann ich sehen, dass im Falle eines Fehlers das genau das ist, was ich rendere und es kann angepasst werden Bias. So sind wir in der Lage, jede andere innerhalb des Y in jeder produktionsfertigen Anwendung zu fangen . Das ist ein Muss. Das coole Ding an unseren Grenzen, dass wir mehrere Komponenten erstellen können. Zum Beispiel haben wir jetzt den globalen Herman-Baum gesetzt. Wenn ein Fehler innerhalb des zuständigen Baums erzeugt wird, dann wird es durch diese Buchstabengrenze erfasst und stattdessen jede Komponente entfernt. Es wird diese Nachricht mit etwas angezeigt, wenn betrunken. Nehmen wir an, wir haben eine Menge von Komponenten und Knopf oder zerkleinert, wenn nicht bar abgestürzt. Wir wollen nicht alles entfernen, was für diese Situationen richtig ist. Wir können mehrere andere Grenzen setzen, zum Beispiel pro Komponente oder pro Seite. Also für das Signieren der Seite, kann ich seinen eigenen geben Brötchenbaum so ziehen. Dann kann ich für immer eine weitere Komponente mit einem anderen Markt erstellen. Und dann kann ich eine andere Seite an ihrem Brötchenbaum reiben. Also auf diese Weise, wenn Fehler innerhalb der Homepage erzeugt werden, wird es von diesen anderen Brötchen DRI gefangen werden und dann das U Y. Das ist in diesem Buchstaben Brötchenbaum aufgeführt wird angezeigt. Die Frage ist, warum? Und lief gut. Evers kann von allem produziert werden. Es kann ein Fehler innerhalb des Codes sein, den wir nicht kontrolliert haben, oder wir vermeiden es einfach. Oder vielleicht kann es ein Netzwerk sein, zum Beispiel, wenn etwas Online-Zugriff sein muss. Aber aus dem Nichts ging Internet herunter und die Komponente konnte nicht auf diese Weise rendern, wird es durch Eingabe Brötchenbaum in Käfig gekämmt werden und es ist sehr wichtig zu verstehen, dass diese Art von Fehlern nicht von jemals gefangen werden . Brötchen Bäume an ihren Brötchen Bäume fangen andere Onley verwandte Teoh Rendering. Nun schätze ich, wir brauchten das eine Art besseres Bunbury in unserer Chat-Anwendung. Also denke ich, das ist ein guter Zeitpunkt, um unsere Änderungen zu begehen. Also lassen Sie uns diesen Thron wegschütten. Sie Airline Inside Signing und lassen Sie uns eine globale jemals Brötchenbaum für unsere Chat-Anwendung setzen und lassen Sie uns unsere Änderungen begehen. Also werde ich eingießen. In Ordnung, lassen Sie mich das Terminal neu starten. Ich werde setzen, bekommen alles und dann begehen und dann besser Brötchenbaum hinzufügen. Perfekt. Ich hoffe, es war umfassend und nicht zu kompliziert. Wir sehen uns im nächsten. 159. Codeaufteilung: Hey dort in dieser Videoblase, sprechen Sie über Code-Splitting im Reakt-Modus, Splitting ist eng mit faul Laden in reagieren gekoppelt, getötet, Splitting bedeutet, um Komponenten zu laden, Abhängigkeiten oder vielleicht sogar CSS Dateien. Wenn wir die Dokumentation durchlesen, können wir diesen Bündelungsabschnitt sehen, wo es heißt, dass, wenn wir eine Anwendung erstellen, wir die endgültige JavaScript-Datei haben. Und in der Tat, wenn wir in unser Projekt schauen und wir gehen zu den neuesten erstellt statischen und eifersüchtigen Skript hier, beschränken wir ein paar Jobs, tolle Dateien. Und wie Sie sehen können, sind sie vergrößert und gleichzeitig ziemlich groß. Das ist also, wo unsere Logik hingeht. Aber mit Laserbeladung sind wir in der Lage, mehr Brocken aus unserer Anwendung zu erstellen. Und auf diese Weise können wir eine Last unserer JavaScript-Chunks auf Lee legen, wenn sie benötigt werden. Zum Beispiel, wenn Sie in unsere Anwendung schauen, brauchen wir im Grunde keine Anmeldeseite jetzt. Wir brauchen Onley, wenn wir nicht autorisiert sind, oder? Es wäre also sinnvoll, Lazy Load Sign und Seitenkomponente. Also, wenn wir zur Dokumentation gehen und wenn wir nach unten scrollen, um das eigentliche Beispiel mit reagieren, faul reagieren Lisi ist eine Technik im Inneren reagieren auf faule Lastkomponenten. Wir können dieses Beispiel verwenden, um unsere Anmeldeseite faul zu laden. Lassen Sie uns diese Codezeile kopieren, als ich zu Abla GS Place navigieren werde, wo wir die Signaturkomponente hier gerendert haben. Ich werde diese andere Komponente bezahlen, und ich werde sie durch Sinan ersetzen. Und dann werde ich den Pass kopieren, um sich in Seite zu melden. Und dann werde ich auch faul importieren, anstatt Tinte so zu verwenden. Und auch muss ich Verdächtige importieren, wie wir aus der Dokumentation sehen können, denn wenn wir faul, niedrig, dim Ojul, kann es einige Sekunden oder Millisekunden dauern, um dieses Modul zu laden. Und während es geladen wird, um Fleshing zu vermeiden, könnten wir etwas Fullback verwenden. Du ich so etwas wie das Laden. Deshalb müssen wir immer Spannung geben. Also lassen Sie es mich kopieren, und mein Prediger fehlt. Also lassen Sie mich es abbrechen und tatsächlich die App gestartet. Vielleicht wird es funktionieren. Okay, also werde ich Verdächtigen eingießen, dass ich mich anmelden würde und ich werde es so sagen, jetzt kann ich meine Bewerbung wieder essen und mich speichern lassen und jetzt müssen wir uns so mit Verdächtigen anmelden und lassen Sie uns den alten Import entfernen Anmeldeseite abmelden. Nun, wenn ich es speichere, muss ich auch Spannung importieren. Nun, wenn ich sage, wo und wenn ich zurück zum Gericht navigiere, wenn ich die App aktualisieren, wenn ich auf Inspect klicke und wenn ich den Netzwerk-Tap geöffnet habe, lassen Sie mich abmelden und achten. Welche Datei wird geladen? Also, wenn ich auf diesen Button klicke, sahen Sie dieses kleine Flackern mit Ladedef, das wir als voll zurück hier setzen, während dieses Rückfall Sie. Ich habe gezeigt, dass wir das Stück von unserem Mantel geladen haben. Und wenn wir es hier öffnen, haben wir unsere USA eingeschränkt oder sehen die Unterzeichnung von Seiten. Das ist also, was es bedeutet, unsere Anwendung zu teilen. Wenn Sie eine wirklich große Anwendung erstellen, wahrscheinlich, wenn jemand Ihre Website zum ersten Mal startet, werden die meisten Ihrer Komponenten wahrscheinlich nicht benötigt. Diese Technik ist wirklich wichtig zu verstehen. Und ein gutes Beispiel wäre, nur Twitter Rap-Seite zu öffnen und zu sehen, dass überall, wenn Sie nur die Website laden, können Sie Spinner sehen, die sie faul laden viel, so dass sie faul laden alle Komponenten laden, um die anfängliche Paketgröße zu reduzieren weil es wirklich wichtig ist. Wenn ich die App aktualisiere, können Sie sehen, dass viele Dateien hier geladen wurden, wie ein Chunk Haupt Chunk, und wir wollen Haupt Chunk so klein wie möglich halten, weil anfängliche Lord von der Website wichtig ist. Alles klar, also geht es hier um Laserbelastung? Ich hoffe, es war umfassend. Nun lassen Sie uns tatsächlich unsere Änderungen an der Chat-Anwendung übernehmen. Also lasst uns eingießen, Dar ansteigen und dann engagieren. Fügen Sie faul Floating perfekte CEO in der nächsten. 160. Schlussbemerkung: Hallo. Jetzt kennen Sie alle modernen Dinge, die benötigt werden, um eine große produktionsfertige Reaktionsanwendung zu erstellen. Geben Sie ihm ein wenig mehr Übung und Sie werden definitiv alles aufbringen, was wir abgedeckt haben . Hier ist eine Aufgabe für Sie. Gehen Sie durch die Reaktionsdokumentation und verlassen Sie sich auf Themen, die Sie während des Kurses noch nicht gehört . Es gibt viele subtile Details, die beim ersten Glas nicht zu sehen sind. Stellen Sie sicher, dass Sie verstehen, warum Sie diese Technik verwenden. jetzt betrifft, sind wir mit diesem Abschnitt fertig. Wir sehen uns im nächsten. 161. Zusammenfassung – Wissen, das du gewonnen hast.: Hallo, Sie haben es sehr gut gemacht. Sie bauen drei separate Reaktionsprojekte unterschiedlicher Komplexität auf. Sie können stolz sagen, dass Sie Erfahrung in der Reaktionsentwicklung haben. Lassen Sie uns nun zusammenfassen, was Sie in diesem Kurs gelernt haben. Ich werde alles in seinen eigenen Kontext aufteilen. Die Gerichte begannen mit allgemeineren Dingen, bei denen man sich verschiedene Arten von Website-Rendering anschaute . Können AP Augen gegeben die realen Welt Beispiele Ihre Ausrüstung, keine GS und moderne JavaScript-Crashkurse und dann vorbereitet sich auf die Arbeit mit reagieren auf unser erstes Projekt. Tick Tack, um Ihnen erste React Komponenten, Sonden, Stile, ST Dynamic, Sie I und Entwicklung von Flow kennen Sonden, Stile, ST Dynamic, ST Dynamic, zu lernen. Im Allgemeinen haben Sie ein einfaches React-Projekt erstellt, das starke Grundlagen demonstriert. Mit der Abendkasse haben Sie sich zu komplexeren React-App bewegt, indem Sie mit einem externen P I arbeiten und bekannte primitive Szenarien verwalten . Mit drei AC Köche, lernen Sie das Konzept der dynamischen Crowds und Remote-Daten holen Sie so, wie zu optimieren und analysieren reagieren Komponenten, sagt CIA in GS oder gestylt Komponenten sind von nun an keine Ausländer für Sie. Am Ende dieses Projekts, Sie haben typische Reakt-Anwendung, die umfassendere Wieder in der letzten Projekt Chat-App bestätigen erfordert . Man lernt Firebase in erster Linie kennen. Sie haben großartige Arbeit bei der Verwaltung des globalen Zustands mit Kontext geleistet. AP I Sie erleben verwirrende und nicht primitive Situationen, die ein fortgeschrittenes Verständnis von reagieren erfordern . Verwalten von Stilen selbst nicht immer wünschenswert. Deshalb verstehen Sie jetzt die Bedeutung von Y Komponenten, Bibliotheken, Bibliotheken Benutzer-, Status- und private Seiten sind normale Dinge für Sie jetzt. Und React Hooks ist Ihre Hauptwaffe. Mehrere s Absicherung von Kurs. Bezahlen Sie weniger mit minimalem Aufwand. Am Ende des Chats erstellen Sie eine produktionsfähige Webanwendung mit aktuellen Technologien. Es gab auch einen kleinen Raum aus Reaktionskonzepten, in dem wir sie getrennt betrachten und für unser endgültiges Projekt gelten . Nach all dem, sollten Sie sicher sein, mit reagieren und es ist Ökosystem. Es wird immer das Gefühl geben, dass Ihr Wissen nicht genug ist. Und das ist in Ordnung. Jeder Entwickler hat diesen Sinn. Der Perfektion sind keine Grenzen gesetzt. Das waren die Dinge, die Sie in diesem Kurs gelernt haben. Wir sehen uns das nächste Mal 162. Deine zukünftigen Bewegungen: - Hallo. Lassen Sie uns über Ihre nächsten Schritte nach dem Diskurs sprechen. Es gibt keine bestimmte Web-Entwickler-Roadmap, aber hier sind meine Vorschläge und Empfehlungen. Zuerst lernen Sie Typoskript. Es ist eine Sprache, die auf JavaScript aufgebaut ist. Es bringt Typsystem in das Projekt, und am Ende des Tages wird es die Codezuverlässigkeit erhöhen. Google vier React Typoskript Artikel und beginnen mit diesen in ein einfaches React-Projekt integriert , um zu verstehen, warum es erstaunlich ist. Dann werfen Sie einen Blick auf re Enten. Du kennst schon die Verwendung. Reducer Hook Read Acts ist eine globale Statusverwaltungsbibliothek, die den gleichen Ansatz wie der verwendete Reducer verwendet . Es hat eine Lernkurve, aber mit Reaktionshaken und Redox zu Kind, Redox ist umfassender geworden. Viele Tutorials und erzwungene Leichtigkeit Redox, aber die meiste Zeit brauchen Sie es nicht. Gleichzeitig wird es eine wirklich gute Praxis sein, Ihren Wert als Entwickler zu steigern. Google für jeden Artikel über moderne Reduktion mit drei Enten Toolkit. Wenn Sie als Reaktionsentwickler wachsen wollen, müssen Sie auf jeden Fall anfangen, auf die nächste GS und Gatsby zu schauen. Diese beiden sind Frameworks, die auf React aufbauen, und beide für das serverseitige Rendering gedacht sind. Erstaunliches Öko-System, gute Tutorials. Sie haben alles, um Ihnen so komfortable wie möglich Entwicklung zu geben und sich zu zwingen , ein A p I ohne GS zu bauen, kein Jess Wissen ist überall erforderlich, kein Jess Wissen ist überall erforderlich, egal ob es sich um ein JavaScript-Back-End oder nur um Hintergrund-Skript handelt. Finden Sie einen Artikel zur Einrichtung von Express GS und ohne GS. Tun Sie es selbst, dass dieses Wissen durch mehr Übung am Ende des Tages erhöht. Erfahren Sie mehr über das Testen, wenn Sie Änderungen vornehmen. Um zu entschlüsseln, ist es wichtig, nichts zu brechen. Deshalb gibt es Tests mit modernen Werkzeugen. Das Testen ist sehr vereinfacht und angenehm. Testen ist wichtig, aber noch wichtiger, ist es, Lee zu testen, was tatsächlich getestet werden muss. Google Für jeden Artikel im Zusammenhang mit Scherz oder Enzym-Reaktions-Tests. Lesen Sie mehr über Sicherheit Off-Web-Anwendung, vor allem über Jason Webb-Token, Cookies und lokalen Speicher. Der Schutz des Backends ist auch eine Sache, aber dafür beginnen, Togs zu senken, keine SQL-Datenbanken wie Mongo, DB oder Firebase sind einfach, aber sie mögen leistungsstarke Abfragen und Strukturen beim Erstellen. Und nein, sie hat zurück und hat sich mit Bedacht für die DB entschieden. Fragen Sie Ihre Datenbanken sind bevorzugter im großen Maßstab Pose Kleid. Fragen Sie, L und Mongo db sind heutzutage sehr beliebt. Mehr Aufmerksamkeit wird auch dem Transplantat ul gewidmet. Sobald Sie sich wohl fühlen ohne Schach und Ruhe AP Augen beginnen, über Transplantat nachzudenken. Sie werden Es ist flexibler, wenn es viele Anfragen mit dynamischer Datenform Warren Cloud Computing und Entwicklung von Wraps mit Cloud-Diensten gibt, wird es den zugrunde liegenden Entwicklungsstapel nicht ändern, zum Beispiel Reagieren Sie und beachten Sie GS, aber es gibt Ihnen Dienste, mit denen Sie die APP bereitstellen und verwalten können. Serverlose Bereitstellung oder Cloud-Speicher sind Beispiele für Cloud-Services. Werfen Sie einen Blick auf beliebte Cloud-Anbieter und wählen Sie einen. Machen Sie alles automatisiert mit kontinuierlicher Integration und setzt die Lieferung fort. Die Bereitstellung ermöglicht es, den Bereitstellungsprozess zu automatisieren. beispielsweise Wenn Siebeispielsweiseeine neue Änderung vornehmen und aufstehen, wird die APP automatisch weitergeleitet. Die Integration geht, bevor die Lieferung fortgesetzt wird. Es definiert im Grunde das Modell von neuem Code Push zum Hauptcode. Dieses Thema ist nicht so leicht zu verstehen. Also zögern Sie nicht, jeden Artikel zu lesen und haben eine Menge Fragen. Das sind meine Empfehlungen. Fühlen Sie sich frei, Ihre eigene Richtung zu wählen. Wir sehen uns das nächste Mal