Până acum, în această serie React, am creat o aplicație pentru exemplul de lucru ca punct de plecare pentru aplicația noastră de galerie "Movie Mojo" și am văzut cum folosirea recuzitelor ne permite să personalizăm aspectul componentelor prin trecerea de date mai degrabă decât greu de codificare.
În partea a treia ne vom crea prima componentă personalizată și apoi vom adăuga statul în aplicația noastră. Acest lucru ne va permite să gestionăm cu ușurință datele aplicației fără a fi preocupați de actualizarea manuală a DOM. În schimb, vom vedea cum să lăsăm React să se ocupe de toate redarea DOM de acum încolo.
Un set de patru filme vor fi afișate în galeria noastră la încărcarea paginii, iar alte patru vor fi încărcate și afișate atunci când Incarca mai mult… butonul este apăsat.
Să abordăm mai întâi adăugarea
care va afișa informații despre un film individual.
componenta va afișa informații despre un film individual. Multiplu
componentele vor fi afișate împreună pentru a forma o galerie de filme a unor filme care se simt bine. Prin urmare, numele aplicației noastre React, "Movie Mojo"!
Înainte de a adăuga
componentă, să actualizăm CSS în App.js
la stilul filmelor individuale din galerie. Deschide App.css
și înlocuiți stilurile cu:
.App text-align: center; .App-logo animație: App-logo-spin infinit 20s liniar; înălțime: 80px; .App-header background-color: steelblue; înălțime: 70px; padding: 20px; culoare albă; .App-intro font-size: large; / * nou CSS pentru componenta filmului * / * box-size: border-box; .movies display: flex; flex-wrap: folie; .App-header h2 marja: 0; .add-filme text-align: center; butonul Adăugați filme font-size: 16px; padding: 8px; margine: 0 10px 30px 10px; .movie padding: 5px 25px 10px 25px; max-lățime: 25%;
Aceasta face ca galeria să afișeze filmele într-o formare a rețelei și să îmbunătățească spațiul în jurul altor elemente vizuale.
De asemenea, în / Public / postere /
, Am adăugat 12 postere de film pentru comoditate pe care le puteți utiliza în propriul proiect, dacă urmăriți împreună. Le puteți descărca ca parte a proiectului finalizat pentru partea 4. Pur și simplu copiați peste postere
folder pentru propria aplicație React public
pliant.
De asemenea, puteți să descărcați propriile postere de pe site-ul original. Pentru acest tutorial, am folosit cinematerial.com pentru toate posterele de film. Există o mică taxă pentru a descărca postere, dar probabil că există și alte surse postere dacă doriți să încercați în altă parte.
OK, înapoi la noi
componentă. În interiorul / src / componente /
folder, creați un nou Movie.js
fișier, deschideți-l într-un editor și adăugați următoarele:
import React, Component de la "reacție"; clasa Movie extinde Component render () return (); export implicit film;this.props.title
(this.props.year)
this.props.description
Acest lucru este destul de similar cu
cu excepția faptului că facem referire la mai multe elemente de recuzită decât la una. Să ne folosim
pentru a afișa anumite filme.
În Împărtășim câteva din filmele noastre preferate Rețineți modul în care importăm explicit Rezultatul este de patru Este foarte dificil să adăugați manual filme una câte una înăuntru Ce este starea într-o aplicație React? Vă puteți gândi la acesta ca la un singur obiect JavaScript care reprezintă toate datele din aplicația dvs. Statul poate fi definit pe orice componentă, dar dacă doriți să împărțiți stat între componente, atunci este mai bine să îl definiți pe componenta de nivel superior. Statul poate fi apoi transferat la componente copil și accesat după cum este necesar. Chiar dacă statul este un obiect principal, obiectul poate conține mai multe sub-obiecte legate de diferite părți ale aplicației. De exemplu, într-o aplicație pentru coș de cumpărături, este posibil să aveți un obiect de stat pentru elementele din comanda dvs. și un alt obiect pentru monitorizarea inventarului. În aplicația noastră "Movie Mojo", avem doar un singur obiect sub-stat pentru a stoca filmele în galeria noastră. Ideea centrală din spatele utilizării stării este că ori de câte ori se schimbă datele din aplicația dvs., React actualizează părțile relevante din DOM pentru dvs. Tot ce trebuie să faceți este să gestionați datele sau să le specificați în aplicație, iar React gestionează toate actualizările DOM. Din motive de simplitate, vom renunța la etapa bazei de date și vom pretinde că datele noastre despre filme au fost preluate dintr-o bază de date și stocate în format JSON. Pentru a demonstra adăugarea elementelor la o stare inițială, precum și pentru actualizarea stării când apare un eveniment (de exemplu apăsarea unui buton), vom folosi două obiecte JSON, fiecare conținând date despre patru filme. În Înainte de a putea face referire la obiectele JSON din cadrul nostru Fiecare obiect JSON este acum disponibil prin intermediul variabilelor Componenta de nivel superior din aplicația noastră "Movie Mojo" este Când utilizați o funcție constructor într-o clasă React, trebuie să apelați Pentru a ne inițializa Acest lucru va crea un obiect de stare gol pentru aplicația noastră React. Folosind instrumentele React dezvoltator, putem vedea Cu toate acestea, dorim să inițializăm Aceasta va seta starea inițială pentru aplicația noastră la cele patru filme stocate în Trebuie să scoatem filmele în Începeți prin a scoate codul greu Acest cod necesită explicații. Deci folosim Există câteva modificări față de modul anterior în care am adăugat o De asemenea, observați că specificăm a Fără Trebuie să facem încă un lucru înainte ca componentele noastre să poată fi afișate. Deschide (this.props.meta.year) this.props.meta.description Am văzut cum să afișăm filme care au fost adăugate la starea pe care inițiază aplicația noastră, dar dacă am vrea să ne actualizăm galeria de filme la un moment dat? Aici reacționează cu adevărat React. Tot ce trebuie să facem este să actualizăm filmele în Să vedem cum putem implementa acest lucru. Începeți prin adăugarea unui buton HTML în interiorul divizorului de închidere div Când faceți clic pe buton, o metodă de clasă Starea actualizării este relativ simplă atâta timp cât urmați metoda recomandată, care este de a copia obiectul de stare curentă la un obiect nou și de a actualiza copia cu elemente noi. Apoi, pentru a seta noua stare, sunăm Prima linie din După aceea, vom folosi Există încă un pas înainte pe care trebuie să-l finalizăm înainte Acesta este un semn de reacție și este doar ceva ce va trebui să vă amintiți să faceți. Ori de câte ori este accesată o metodă fără a fi obligată manual, React se va plânge și ar arunca o eroare de compilare. Adăugați aceasta la constructorul de clasă din Atâta timp cât vă amintiți să utilizați această soluție pentru fiecare metodă personalizată care necesită utilizarea Acum, încercați să faceți clic pe Incarca mai mult… Buton. Ar trebui să vedeți încă patru filme adăugate în galerie. Acest lucru demonstrează o forță cheie a React. Aceasta înseamnă că vă permite să vă concentrați asupra datelor din aplicația dvs. și să lăsați toate actualizările luminoase ale DOM pentru a reacționa. Pentru a adăuga filme, tot ce trebuia să facem este să actualizăm datele din site-ul nostru Aplicația noastră de exemplu este încă destul de fundamentală, dar imaginați-vă o aplicație mult mai complexă cu mai multe componente și mai multe obiecte de stare. Încercarea de a actualiza manual DOM, deoarece datele din modificările aplicației ar fi o sarcină uriașă (și eronată)! În acest tutorial am realizat cu adevărat unele progrese în aplicația noastră "Movie Mojo". Am folosit starea React pentru a ajuta la gestionarea listei de filme din aplicația noastră. Nu numai că am adăugat filme la obiectul inițial de stare, deoarece aplicația noastră a fost inițializată, dar, de asemenea, am actualizat lista de filme din galeria noastră atunci când Incarca mai mult… Button a fost apăsat. În partea a patra și ultimul tutorial din această serie, vom analiza modul în care putem adăuga manual un film la galeria noastră printr-un formular personalizat. Utilizatorii vor putea să completeze formularul și să adauge detalii despre un film, care va fi adăugat în lista de filme afișate în galerie.App.js
adăugați patru
componentele din interior App.js
cod:import React, Component de la "reacție"; import "... /App.css"; importați antetul de la "./Header"; importați filmul din "./Movie"; clasa App extinde Component render () return (
componente, la fel ca și noi
, să o pună la dispoziție în cod. Fiecare componentă de film implementează elemente de recuzită pentru titlu
, an
, Descriere
, și poster
.
componente adăugate în galeria noastră.App.js
. În practică, datele aplicațiilor ar proveni probabil dintr-o bază de date și vor fi stocate temporar într-un obiect JSON înainte de a fi adăugate la obiectul de stare din aplicația dvs..Gestionarea statului reactiv
Adăugarea de filme prin intermediul statului
src
folder, adăugați un nou movies.js
fișier, deschideți-l într-un editor și adăugați următorul cod pentru a defini cele două obiecte JSON:// unele filme eșantion const initialMovies = movie1: titlu: "Ferris Bueller's Day Off", anul: "1986", descriere: "Un băiat de liceu este hotărât să aibă o zi liberă de la școală, în ciuda a ceea ce gândește principalul "., poster:" ./posters/ferris.png ", film2: title:" Jurnalul lui Bridget Jones ", anul:" 2001 ", descriere:" O femeie britanică este hotărâtă să se îmbunătățească în timp ce arată pentru dragoste într-un an în care își păstrează un jurnal personal ", poster:" ./posters/bridget-jones.png ", film3: title:" 50 First Dates ", anul:" 2004 " Henry Roth este un om care se teme de angajament până când se întâlnește cu frumoasa Lucy. Ei au lovit-o și Henry crede că a găsit în cele din urmă fata din visele sale "., Poster:" ./posters/50-first-dates.png " , filmul 4: title: "Matilda", anul: "1996", descriere: "Povestea unei fetițe minunate, care se întâmplă a fi un geniu, și profesorul ei minunat împotriva celor mai răi părinți vreodată, ", poster:" ./posters/matil da.png "; Conținut suplimentarMovies = movie5: title: "Dirty Dancing", anul: "1987", descriere: "Petreceți vara într-o stațiune din Catskills împreună cu familia ei, Frances 'Baby" Houseman se îndrăgostește de instructorul de dans al taberei, . ", poster:" ./posters/dirty-dancing.png ", film6: title:" Când Harry Met Sally ", anul:" 1989 ", descriere:" Harry și Sally s-au cunoscut de mai mulți ani sunt foarte buni prieteni, dar se tem că sexul va ruina prietenia. ", poster:" ./posters/when-harry-met-sally.png ", film7: titlu:" Elf ", anul:" 2003 " descriere: "După ce a făcut rău în mod necorespunzător comunității elfilor, din cauza dimensiunii sale nesimțite, un om ridicat ca un elf la Polul Nord este trimis în SUA în căutarea adevăratei sale identități.", poster: "./posters/elf. png ", film8: title:" Grease ", anul:" 1978 ", descriere:" Fata buna Sandy si Greaser Danny sa indragostit de vara. ei pot să-i reaprindă r romance? ", poster:" ./posters/grease.png "; export initialMovies; exportați additionalMovies;
componente, trebuie să le importăm. Adăugați aceasta în partea de sus a paginii App.js
:import initialMovies din "... / filme"; importați additionalMovies din "... / filme";
initialMovies
și additionalMovies
. Până acum, însă, nu avem niciun stat asociat cu aplicația noastră. Să rezolvăm asta acum.
, deci să adăugăm obiectul nostru de stat aici. Avem nevoie ca statul să fie inițializat împreună cu clasa de componente, pe care o putem face prin intermediul funcției constructorului.super()
mai întâi ca component
Obiectul pe care îl extindem trebuie inițializat înainte de orice altceva. În plus, acest
cuvântul cheie nu va fi disponibil în interiorul constructorului decât după super()
s-a intors.stat
obiect, adăugați acest lucru în interiorul
clasa componente:constructor () super (); this.state = filme: ;
stat
obiect inițializat direct pe
component.stat
obiecte cu unele filme, astfel încât acestea să apară imediat la încărcarea paginii. Pentru a face acest lucru, putem inițializa filme
obiect de stat cu initialMovies
în loc de un obiect gol.constructor () super (); thisstatestate = filme: initialMovies;
initialMovies
Obiect JSON, dar filmele din galerie sunt încă afișate prin hard-codat
componente pe care le-am adăugat mai devreme.film
obiecte de stat în loc, pe care le putem face folosind o buclă pentru a itera peste fiecare film.
componente și înlocuiți-le cu:Object .key (această .state.movies) .map (key =>
film
obiect de stat conține filme individuale stocate ca obiecte, dar pentru a le repeta, ar fi mai ușor să lucrați cu o matrice în schimb.Object.keys ()
pentru a apuca toate cheile pentru obiectele de film și a le stoca într-o matrice. Acest lucru este apoi repetat folosind .Hartă()
, și a
componenta este afișată pentru fiecare film din filme
obiect de stat.
, deşi. În primul rând, vom transmite toate informațiile pentru un film individual printr-un singur film meta
prop. Acest lucru este de fapt mai convenabil decât înainte, unde am specificat o propoziție separată pentru fiecare atribut film.cheie
de asemenea. Acest lucru este utilizat intern de către React pentru a urmări componentele care au fost adăugate de bucla. Nu este de fapt disponibil pentru a fi utilizat de componentă, deci nu ar trebui să încercați să îl accesați în propriul cod.cheie
prop, React aruncă o eroare, deci este important să o includeți. Reacționează că trebuie să știe care filme noi au fost adăugate, actualizate sau eliminate, pentru a putea păstra totul sincronizat.Movie.js
, și pentru fiecare referință la un element, prefixați-l meta
, după cum urmează:this.props.meta.title
Încărcarea mai multor filme
film
obiect de stare, iar React va actualiza automat toate părțile din aplicația noastră care utilizează acest obiect. Deci, dacă adăugăm câteva filme, React va declanșa
componente face()
de actualizare a galeriei de filme.App.js
.loadAdditionalMovies
se numește. Adăugați această metodă la
clasa componente:loadAdditionalMovies () var actualMovies = ... this.state.movies; var newMovies = Object.assign (currentMovies, additionalMovies); this.setState (filme: newMovies);
this.setState
și treceți în noul nostru obiect de stat pentru a suprascrie cel anterior. Imediat ce statul este actualizat, React actualizează doar părțile din DOM care au fost afectate de schimbare în stare.loadAdditionalMovies ()
utilizează a răspândire
operator pentru a copia toate proprietățile this.state.movies
obiect în noul currentMovies
obiect.Object.assign
pentru a îmbina două obiecte împreună, rezultând lista de filme noi adăugate în lista curentă.loadAdditionalMovies ()
metoda va funcționa. Pentru a face referire la orice metodă a componentelor personalizate, trebuie mai întâi să le legăm manual la clasa de componente.App.js
:this.loadAdditionalMovies = this.loadAdditionalMovies.bind (aceasta);
acest
, nu veți avea probleme.film
obiect de stat, iar React avea grijă de orice altceva.Concluzie