Så langt i denne React-serien har vi opprettet en arbeidseksempel-app som utgangspunkt for vår "Movie Mojo" -galleri-app, og vi har sett hvordan bruk av rekvisitter gjør at vi kan tilpasse utseendet på komponenter ved å overføre data i stedet for hardt kodende det.
I del tre skal vi opprette vår første tilpassede komponent, og deretter legge til tilstand i vår app. Dette vil tillate oss å enkelt administrere appdataene uten å være bekymret for å manuelt oppdatere DOM. I stedet ser vi hvordan du lar React håndtere all DOM-gjengivelsen fra nå av.
Et sett med fire filmer vil bli vist i vårt galleri på siden last, og ytterligere fire vil bli lastet og vist når Last mer… knappen er klikket.
La oss først takle å legge til
komponent som vil vise informasjon om en individuell film.
De
komponenten vil vise informasjon om en individuell film. multiple
Komponenter vil bli vist sammen for å danne et filmgalleri av noen gode filmer. Derfor heter navnet på vår React app, "Movie Mojo"!
Før vi legger til
komponent, la oss oppdatere CSS i App.js
å stil individuelle filmer i galleriet. Åpne opp App.css
og erstatt stilene med:
.App text-align: center; .App-logo animasjon: App-logo-spin uendelig 20s lineær; høyde: 80px; .App-header bakgrunnsfarge: steelblue; høyde: 70px; polstring: 20px; farge: hvit; .Inpp-intro font-size: large; / * nytt css for filmkomponent * / * box-size: border-box; .movies display: flex; flex-wrap: wrap; .App-header h2 margin: 0; .add-filmer text-align: center; .add-movies-knappen font-size: 16px; polstring: 8px; margin: 0 10px 30px 10px; .movie polstring: 5px 25px 10px 25px; maksimal bredde: 25%;
Dette utformer galleriet for å vise filmer i en rutenettformasjon og forbedre avstanden rundt andre visuelle elementer.
Også i / Offentlig / plakater /
, Jeg har lagt til 12 filmplakater av bekvemmelighet som du kan bruke i ditt eget prosjekt, hvis du følger med. Du kan laste dem ned som en del av det ferdige prosjektet for del 4. Bare kopier på tvers av plakater
mappe til din egen React app offentlig
mappe.
Du kan også laste ned dine egne filmplakater fra den opprinnelige nettsiden. For denne opplæringen brukte jeg cinematerial.com for alle filmplakater. Det er en liten avgift å laste ned plakatene, men det er nok mange andre kilder til plakater hvis du vil prøve andre steder.
OK, tilbake til vår
komponent. Inne i / src / komponenter /
mappe, opprett en ny Movie.js
fil, åpne den i et redigeringsprogram, og legg til følgende:
Import React, Component fra 'reagere'; klasse Film utvider komponent render () return (); eksporter standardfilm;this.props.title
(this.props.year)
this.props.description
Dette er ganske lik den
komponent bortsett fra at vi refererer til flere rekvisitter i stedet for bare den ene. La oss bruke vår
komponent for å vise noen filmer.
I Deler noen av våre favorittfilmer Legg merke til hvordan vi eksplisitt importerer Resultatet er fire Det er veldig kjedelig å legge til filmer manuelt en om gangen Hva er tilstanden i en React-app? Du kan tenke på det som et enkelt JavaScript-objekt som representerer alle dataene i appen din. Stat kan defineres på hvilken som helst komponent, men hvis du vil dele tilstand mellom komponenter, er det bedre å definere det på komponenten på toppnivå. Stat kan deretter sendes ned til barnekomponenter og åpnes etter behov. Selv om staten er ett hovedobjekt, kan objektet inneholde flere underobjekter knyttet til ulike deler av appen din. For eksempel, i en handlekurv-app, kan du ha et statlig objekt for elementene i bestillingen din, og et annet objekt for overvåking av inventar. I vår "Movie Mojo" -app har vi bare et enkelt delstatobjekt for å lagre filmene i vårt galleri. Kjerneideen bak bruk av tilstand er at når data i appen din endres, Reager oppdaterer de relevante delene av DOM for deg. Alt du trenger å gjøre er å administrere dataene eller statene i appen din, og React håndterer alle DOM-oppdateringene. For enkelhets skyld, vil vi avstå fra databasestrinnet og late som filmdataene våre er hentet fra en database og lagret i JSON-format. For å demonstrere å legge til elementer i en innledende tilstand, samt oppdatere tilstand når en hendelse oppstår (for eksempel en knappetrykk), bruker vi to JSON-objekter, som hver inneholder data om fire filmer. I Før vi kan referere til JSON-objektene i vår Hvert JSON-objekt er nå tilgjengelig via variablene Komponenten på toppnivå i vår "Movie Mojo" -app er Når du bruker en konstruktørfunksjon i en React-klasse, må du ringe For å initialisere vår Dette vil opprette et tomt tilstandsobjekt for vår React-app. Ved hjelp av React-utviklerverktøyene kan vi se Vi vil imidlertid initialisere Dette vil angi startstatusen for vår app til de fire filmene som er lagret i Vi må skrive ut filmene i Start med å fjerne den hardkodede Denne koden krever noen forklaring. De Så vi bruker Det er et par endringer fra den forrige måten vi la til en Legg merke til at vi spesifiserer en Uten en Vi må gjøre enda en ting før komponentene våre kan vises. Åpne opp (this.props.meta.year) this.props.meta.description Vi har sett hvordan du viser filmer som har blitt lagt til for staten som vår app starter, men hva om vi ønsket å oppdatere vår filmgalleri på et tidspunkt? Dette er hvor React virkelig skinner. Alt vi trenger å gjøre er å oppdatere filmene i La oss se hvordan vi kan implementere dette. Start med å legge til en HTML-knapp i den avsluttende div wrapper i Når knappen klikkes, en klassemetode Oppdateringsstatus er relativt enkel så lenge du følger den anbefalte metoden, som er å kopiere det nåværende tilstandsobjektet til et nytt objekt, og oppdatere den kopien med nye elementer. Så, for å sette den nye staten, kaller vi Den første linjen i Etter det bruker vi Det er bare ett skritt som vi må fullføre før Dette er en ekte React, og er bare noe du må huske å gjøre. Når en metode nås uten å være bundet manuelt, vil React klage og kaste en kompileringsfeil. Legg dette til klassekonstruktøren i Så lenge du husker å bruke denne løsningen for hver tilpasset metode som krever bruk av Nå, prøv å klikke på Last mer… Knapp. Du bør se fire flere filmer lagt til galleriet. Dette viser en nøkkelstyrke til React. Det vil si at du lar deg fokusere på dataene i appen din, og la all den daglige oppdateringen av DOM'en til React. For å legge til filmer var alt vi måtte gjøre for å oppdatere dataene i vår Vårt eksempel-app er fortsatt ganske grunnleggende, men forestill deg en mye mer komplisert app med mange komponenter og flere statlige objekter. Forsøker å manuelt oppdatere DOM ettersom dataene i appendringene dine ville være en stor (og feilaktig) oppgave! I denne opplæringen har vi gjort noe fremgang med vår "Movie Mojo" -app. Vi brukte React-tilstand for å administrere listen over filmer i appen vår. Ikke bare lagde vi filmer til det opprinnelige tilstandsobjektet da vår app ble initialisert, men vi oppdaterte også listen over filmer i vårt galleri når Last mer… Knappen ble klikket. I del fire og den siste opplæringen i denne serien, tar vi en titt på hvordan vi manuelt kan legge til en film i vårt galleri via et egendefinert skjema. Brukere vil kunne fylle ut skjemaet og legge til detaljer om en film, som vil bli lagt til i listen over filmer som vises i galleriet.App.js
legg til fire
komponenter inne i a App.js
kode:Import React, Component fra 'reagere'; importere '... /App.css'; Import Header fra './Header'; importer film fra './Movie'; klassen App utvider komponent render () return (
komponent, akkurat som vi gjorde for
, for å gjøre det tilgjengelig i koden. Hver filmkomponent implementerer rekvisitter for tittel
, år
, beskrivelse
, og plakat
.
komponenter lagt til vårt galleri.App.js
. I praksis vil appdata trolig komme fra en database og bli midlertidig lagret i et JSON-objekt før det legges til statobjektet i appen din.Administrere React State
Legge til filmer via stat
src
mappe, legg til en ny movies.js
fil, åpne den i en editor, og legg til følgende kode for å definere våre to JSON-objekter:// noen prøvefilmer const initialMovies = movie1: title: "Ferris Bueller's Day Off", år: "1986", beskrivelse: "En videregående skole er fast bestemt på å ha en fridag fra skolen, til tross for hva regjeringen mener av det. ", plakat:" ./posters/ferris.png ", movie2: title:" Bridget Jones 'Diary ", år:" 2001 ", beskrivelse:" En britisk kvinne er fast bestemt på å forbedre seg selv mens hun ser ut for kjærlighet i et år hvor hun holder en personlig dagbok. ", poster:" ./posters/bridget-jones.png ", movie3: title:" 50 First Dates ", år:" 2004 ", beskrivelse:" Henry Roth er en mann som er redd for engasjement frem til han møter den vakre Lucy. De slår den av og Henry tror at han endelig har funnet drømmets jente. ", Poster:" ./posters/50-first-dates.png " , film4: title: "Matilda", år: "1996", beskrivelse: "Historie om en fantastisk liten jente, som skjer for å være et geni, og hennes fantastiske lærer vs de verste foreldrene noensinne og den verste skolens hovedstol tenkelige. ", plakat:" ./posters/matil da.png "; const additionalMovies = movie5: title: "Dirty Dancing", år: "1987", beskrivelse: "Tilbringe sommeren på et Catskills resort med familien hennes, blir Frances 'Baby' Houseman forelsket i leirens dansinstruktør, Johnny Castle . ", poster:" ./posters/dirty-dancing.png ", movie6: title:" Når Harry Met Sally ", år:" 1989 ", beskrivelse:" Harry og Sally har kjent hverandre i mange år, og er veldig gode venner, men de frykter at sex vil ødelegge vennskapet. ", plakat:" ./posters/when-harry-met-sally.png ", movie7: title:" Elf ", år:" 2003 ", beskrivelse: "Etter en utilsiktet ødeleggelse på elleve samfunn på grunn av sin uhyggelige størrelse, blir en mann oppdratt som en elv på Nordpolen sendt til USA på jakt etter sin sanne identitet.", plakat: "./posters/elf. png ", film8: title:" Grease ", år:" 1978 ", beskrivelse:" God jente Sandy og fettmann Danny ble forelsket i løpet av sommeren. Når de uventet oppdager at de nå er i samme videregående skole, vil de kan rekindle thei r romantikk? ", plakat:" ./posters/grease.png "; eksporter initialMovies; eksporter additionalMovies;
komponent, vi må importere dem. Legg dette til toppen av App.js
:importer initialMovies fra '... / movies'; importer additionalMovies fra '... / movies';
initialMovies
og additionalMovies
. Så langt har vi imidlertid ingen tilstand knyttet til vår app. La oss fikse det nå.
, så la oss legge til vårt statsobjekt her. Vi trenger tilstand som skal initialiseres sammen med komponentklassen, som vi kan gjøre via konstruktørfunksjonen.super()
først som Komponent
objekt vi utvider behov for å bli initialisert før noe annet. Pluss, den dette
Søkeordet vil ikke være tilgjengelig innenfor konstruktøren før etterpå super()
har returnert.stat
objekt, legg til dette inne i
komponent klasse:konstruktør () super (); this.state = filmer: ;
stat
objekt initialisert direkte på
komponent.stat
objekt med noen filmer slik at de vises med en gang på siden lastes. For å gjøre dette kan vi initialisere filmer
statlig objekt med initialMovies
i stedet for en tom gjenstand.konstruktør () super (); this.state = movies: initialMovies;
initialMovies
JSON-objekt, men filmene i galleriet vises fortsatt via den hardkodede
komponenter vi la til tidligere.film
Status objektet i stedet, som vi kan gjøre ved å bruke en loop for å iterere over hver film.
komponenter, og erstatt dem med:Object .keys (this.state.movies) .map (key =>
film
Statobjekt inneholder individuelle filmer lagret som objekter, men for å iterere over dem ville det være lettere å arbeide med en matrise i stedet.Object.keys ()
å ta tak i alle nøklene for filmobjektene og lagre dem i en matrise. Dette er deretter iterert over bruk .kart()
, og a
komponent utgis for hver film i filmer
statobjekt.
, selv om. For det første sender vi all informasjonen til en individuell film via en enkelt meta
rekvisitt. Dette er faktisk mer praktisk enn tidligere, der vi angav en egen prop for hver filmattributt.nøkkel
prop også. Dette brukes internt av React for å holde oversikt over komponenter som er lagt til av loopen. Det er faktisk ikke tilgjengelig for bruk av komponenten, så du bør ikke prøve å få tilgang til den i din egen kode.nøkkel
prop, React kaster en feil, så det er viktig å inkludere det. Reag trenger å vite hvilke nye filmer som er lagt til, oppdatert eller fjernet, slik at alt kan synkroniseres.Movie.js
, og for hver referanse til en prop, prefix den med meta
, som følger:this.props.meta.title
Laster inn flere filmer
film
statobjekt, og React oppdaterer automatisk alle deler av appen som bruker dette objektet. Så, hvis vi legger til noen filmer, vil React utløse
komponenten render ()
Metode for å oppdatere filmgalleriet.App.js
.loadAdditionalMovies
er kalt. Legg denne metoden til
komponent klasse:loadAdditionalMovies () var currentMovies = ... this.state.movies; var newMovies = Object.assign (currentMovies, additionalMovies); this.setState (movies: newMovies);
this.setState
og passere i vårt nye statsobjekt for å overskrive den forrige. Så snart staten er oppdatert, oppdaterer React bare delene av DOM som har blitt påvirket av endringen til tilstand.loadAdditionalMovies ()
bruker a spredt
operatør for å kopiere alle egenskapene til this.state.movies
objekt inn i det nye currentMovies
gjenstand.Object.assign
å slå sammen to objekter sammen, noe som resulterer i at listen over nye filmer blir lagt til den nåværende listen.loadAdditionalMovies ()
metoden vil fungere. For å referere til en tilpasset komponentmetode må vi først manuelt binde den til komponentklassen.App.js
:this.loadAdditionalMovies = this.loadAdditionalMovies.bind (dette);
dette
, du vil ikke løse noen problemer.film
statlig objekt, og React tok seg av alt annet.Konklusjon