Finora in questa serie di React, abbiamo creato un'app di esempio funzionante come punto di partenza per la nostra app "Movie Mojo", e abbiamo visto come l'utilizzo di oggetti di scena ci consente di personalizzare l'aspetto dei componenti trasmettendo dati anziché difficile da codificare.
Nella terza parte creeremo il nostro primo componente personalizzato, quindi aggiungiamo lo stato alla nostra app. Questo ci consentirà di gestire facilmente i dati dell'app senza preoccuparci di aggiornare manualmente il DOM. Vedremo invece come lasciare che React gestisca tutto il rendering DOM da ora in poi.
Una serie di quattro film verrà visualizzata nella nostra galleria al caricamento della pagina, e altri quattro verranno caricati e visualizzati quando il file Carica altro ... il pulsante viene cliccato.
Per prima cosa affrontiamo aggiungendo il
componente che visualizzerà le informazioni su un singolo film.
Il
componente mostrerà informazioni su un singolo film. multiplo
componenti saranno visualizzati insieme per formare una galleria di film di alcuni film di benessere. Da qui il nome della nostra app React, "Movie Mojo"!
Prima di aggiungere il
componente, aggiorniamo il CSS in App.js
per personalizzare i singoli film nella galleria. Aprire App.css
e sostituire gli stili con:
.App text-align: center; . App-logo animazione: App-logo-spin infinito 20s lineare; altezza: 80 px; .App-header background-color: steelblue; altezza: 70 px; imbottitura: 20px; colore bianco; .App-intro font-size: large; / * nuovo css per componente film * / * ridimensionamento casella: border-box; .movies display: flex; flex-wrap: wrap; .App-header h2 margin: 0; .add-movies text-align: center; Pulsante .add-movies font-size: 16px; imbottitura: 8px; margine: 0 10px 30px 10px; .movie padding: 5px 25px 10px 25px; larghezza massima: 25%;
Questo stile la galleria per visualizzare i film in una griglia e migliorare la spaziatura attorno ad altri elementi visivi.
Anche in / Public / manifesti /
, Ho aggiunto 12 poster di film per comodità che puoi usare nel tuo progetto, se lo stai seguendo. Puoi scaricarli come parte del progetto finito per la parte 4. Copia semplicemente su manifesti
cartella alla tua app React pubblico
cartella.
Puoi anche scaricare i tuoi poster di film dal sito web originale. Per questo tutorial, ho usato cinematerial.com per tutti i poster dei film. C'è una piccola tassa per scaricare i poster, ma ci sono probabilmente molte altre fonti per i manifesti se vuoi provare altrove.
OK, torna al nostro
componente. Dentro il / src / componenti /
cartella, creane una nuova Movie.js
file, aprilo in un editor e aggiungi quanto segue:
import React, Component da 'react'; la classe Movie estende Component render () return (); esporta filmato di default;this.props.title
(this.props.year)
this.props.description
Questo è abbastanza simile al
componente tranne che stiamo riferendo diversi oggetti di scena piuttosto che solo uno. Usiamo il nostro
componente per visualizzare alcuni film.
Nel Condividendo alcuni dei nostri film preferiti Nota come importiamo esplicitamente il file Il risultato è quattro È molto noioso aggiungere i filmati manualmente uno alla volta Qual è lo stato di un'app React? Puoi considerarlo come un singolo oggetto JavaScript che rappresenta tutti i dati nella tua app. Lo stato può essere definito su qualsiasi componente, ma se si desidera condividere lo stato tra i componenti, è meglio definirlo nel componente di livello superiore. Lo stato può quindi essere passato ai componenti secondari e accessibile come richiesto. Anche se lo stato è un oggetto principale, quell'oggetto può contenere più sotto-oggetti relativi a diverse parti della tua app. Ad esempio, in un'app del carrello degli acquisti, potresti avere un oggetto stato per gli articoli nel tuo ordine e un altro oggetto per il monitoraggio dell'inventario. Nella nostra app "Movie Mojo", abbiamo solo un oggetto sotto-stato per archiviare i film nella nostra galleria. L'idea alla base dello stato di utilizzo è che ogni volta che i dati nella tua app cambiano, React aggiorna le parti rilevanti del DOM per te. Tutto quello che devi fare è gestire i dati, o lo stato, nella tua app, e React gestisce tutti gli aggiornamenti DOM. Per semplicità, rinunceremo al passaggio del database e faremo finta che i nostri dati del film siano stati recuperati da un database e archiviati in formato JSON. Per dimostrare di aggiungere elementi a uno stato iniziale, nonché di aggiornare lo stato quando si verifica un evento (ad esempio un pulsante), verranno utilizzati due oggetti JSON, ciascuno contenente dati su quattro filmati. Nel Prima di poter fare riferimento agli oggetti JSON nel nostro Ogni oggetto JSON è ora disponibile tramite le variabili Il componente di primo livello nella nostra app "Movie Mojo" è Quando si utilizza una funzione di costruzione in una classe React, è necessario chiamare Per inizializzare il nostro Questo creerà un oggetto stato vuoto per la nostra app React. Utilizzando gli strumenti di sviluppo di React, possiamo vedere il Tuttavia, vogliamo inizializzare il Questo imposterà lo stato iniziale della nostra app ai quattro film memorizzati nel Abbiamo bisogno di produrre i film in Inizia rimuovendo l'hardcoded Questo codice richiede alcune spiegazioni. Il Quindi usiamo Ci sono un paio di cambiamenti dal modo precedente in cui abbiamo aggiunto un Inoltre, nota che specificiamo a Senza un Dobbiamo fare ancora una cosa prima che i nostri componenti possano essere visualizzati. Aprire (this.props.meta.year) this.props.meta.description Abbiamo visto come visualizzare i filmati che sono stati aggiunti allo stato di inizializzazione della nostra app, ma se volessimo aggiornare la nostra galleria di film ad un certo punto? È qui che React brilla davvero. Tutto quello che dobbiamo fare è aggiornare i film in Vediamo come possiamo implementarlo. Inizia aggiungendo un pulsante HTML all'interno del wrapper div di chiusura in Quando si fa clic sul pulsante, un metodo di classe L'aggiornamento dello stato è relativamente semplice se si segue il metodo consigliato, ovvero copiare l'oggetto stato corrente in un nuovo oggetto e aggiornarlo con nuovi elementi. Quindi, per impostare il nuovo stato, chiamiamo La prima riga in Dopo ciò, usiamo C'è solo un altro passo che dobbiamo completare prima del Questa è una stranezza di React ed è solo qualcosa che dovrai ricordare di fare. Ogni volta che si accede a un metodo senza essere stato associato manualmente, React si lamenterà e genererà un errore di compilazione. Aggiungi questo al costruttore della classe in Finché ti ricordi di usare questa soluzione alternativa per ogni metodo personalizzato che richiede l'uso di Ora, prova a fare clic su Carica altro ... Pulsante. Dovresti vedere altri quattro film aggiunti alla galleria. Questo dimostra una forza chiave di React. Cioè, permettendoti di concentrarti sui dati della tua app e lasciare tutto il banale aggiornamento del DOM a React. Per aggiungere film, tutto ciò che dovevamo fare era aggiornare i dati nel nostro La nostra app di esempio è ancora piuttosto semplice, ma immagina un'app molto più complessa con molti componenti e più oggetti di stato. Cercando di aggiornare manualmente il DOM come i dati nelle modifiche dell'app sarebbe un compito enorme (e soggetto ad errori)! In questo tutorial, abbiamo davvero fatto progressi con la nostra app "Movie Mojo". Abbiamo utilizzato lo stato React per aiutare a gestire l'elenco dei film nella nostra app. Non solo abbiamo aggiunto filmati all'oggetto stato iniziale come inizializzato la nostra app, ma abbiamo anche aggiornato l'elenco dei film nella nostra galleria quando Carica altro ... È stato fatto clic sul pulsante. Nella quarta parte e l'ultimo tutorial di questa serie, daremo un'occhiata a come possiamo aggiungere manualmente un film alla nostra galleria tramite un modulo personalizzato. Gli utenti saranno in grado di compilare il modulo e aggiungere dettagli su un film, che verranno aggiunti all'elenco dei film visualizzati nella galleria.App.js
aggiungere quattro
componenti all'interno di a App.js
codice:import React, Component da 'react'; import '... /App.css'; importare l'intestazione da "./Header"; importare Movie da './Movie'; la classe App estende Component render () return (
componente, proprio come abbiamo fatto per
, per renderlo disponibile nel codice. Ogni componente del film implementa oggetti di scena per titolo
, anno
, descrizione
, e manifesto
.
componenti aggiunti alla nostra galleria.App.js
. In pratica, i dati delle app provengono probabilmente da un database e vengono temporaneamente archiviati in un oggetto JSON prima di essere aggiunti all'oggetto di stato nell'app.Gestione dello stato di reazione
Aggiunta di filmati tramite stato
src
cartella, aggiungi un nuovo movies.js
file, aprilo in un editor e aggiungi il codice seguente per definire i nostri due oggetti JSON:// alcuni film di esempio const initialMovies = movie1: title: "Ferris Bueller's Day Off", anno: "1986", descrizione: "Un ragazzo saggio del liceo è determinato ad avere un giorno libero da scuola, nonostante quello che pensa il preside di questo. ", locandina:" ./posters/ferris.png ", movie2: title:" Bridget Jones 'Diary ", anno:" 2001 ", descrizione:" Una donna inglese è determinata a migliorare se stessa mentre guarda per amore in un anno in cui tiene un diario personale. ", locandina:" ./posters/bridget-jones.png ", movie3: title:" 50 First Dates ", anno:" 2004 ", descrizione:" Henry Roth è un uomo impaurito dall'impegno fino a quando incontra la bella Lucy. L'hanno colpito e Henry pensa di aver finalmente trovato la ragazza dei suoi sogni. ", Locandina:" ./posters/50-first-dates.png " , movie4: title: "Matilda", anno: "1996", descrizione: "Storia di una meravigliosa bambina, che sembra essere un genio, e il suo meraviglioso insegnante contro i peggiori genitori di sempre e il peggior preside della scuola immaginabile. ", poster:" ./posters/matil da.png "; const additionalMovies = movie5: title: "Dirty Dancing", anno: "1987", descrizione: "Trascorrendo l'estate in una località di Catskills con la sua famiglia, Frances 'Baby' Houseman si innamora dell'istruttore di ballo del campo, Johnny Castle . ", poster:" ./posters/dirty-dancing.png ", movie6: title:" Harry Sally ", anno:" 1989 ", descrizione:" Harry e Sally si conoscono da anni, e sono molto amici, ma temono che il sesso rovinerebbe l'amicizia. ", locandina:" ./posters/when-harry-met-sally.png ", movie7: title:" Elf ", anno:" 2003 ", Descrizione: "Dopo aver inavvertitamente devastato la comunità degli elfi a causa delle sue dimensioni sgraziate, un uomo cresciuto come un elfo al Polo Nord viene inviato negli Stati Uniti in cerca della sua vera identità.", locandina: "./posters/elf. png ", movie8: title:" Grease ", anno:" 1978 ", descrizione:" La brava ragazza Sandy e l'ingrassatrice Danny si sono innamorati durante l'estate. Quando scopriranno inaspettatamente che ora sono nella stessa scuola superiore, sono in grado di riaccendere il thei r romance? ", poster:" ./posters/grease.png "; export initialMovies; export additionalMovies;
componente, dobbiamo importarli. Aggiungi questo all'inizio App.js
:import initialMovies da '... / movies'; importare additionalMovies da "... / movies";
initialMovies
e additionalMovies
. Finora, tuttavia, non abbiamo alcun stato associato alla nostra app. Risolviamolo ora.
, quindi aggiungiamo il nostro oggetto stato qui. Abbiamo bisogno che lo stato sia inizializzato insieme alla classe del componente, cosa che possiamo fare tramite la funzione di costruzione.super()
prima come il Componente
l'oggetto che stiamo estendendo deve essere inizializzato prima di ogni altra cosa. Inoltre, il Questo
la parola chiave non sarà disponibile all'interno del costruttore fino a dopo super()
è tornato.stato
oggetto, aggiungi questo dentro il
classe componente:constructor () super (); this.state = movies: ;
stato
oggetto inizializzato direttamente sul
componente.stato
oggetto con alcuni film in modo che vengano visualizzati immediatamente al caricamento della pagina. Per fare ciò, possiamo inizializzare il film
oggetto di stato con initialMovies
invece di un oggetto vuoto.constructor () super (); this.state = movies: initialMovies;
initialMovies
Oggetto JSON, ma i filmati nella galleria vengono ancora visualizzati tramite hard-coded
componenti che abbiamo aggiunto in precedenza.film
oggetto di stato invece, che possiamo fare usando un ciclo per scorrere su ogni film.
componenti e sostituirli con:Object .keys (this.state.movies) .map (key =>
film
oggetto di stato contiene singoli filmati memorizzati come oggetti, ma per scorrere su di essi sarebbe invece più semplice lavorare con un array.Object.keys ()
per prendere tutte le chiavi per gli oggetti film e memorizzarli in un array. Questo viene poi ripetuto durante l'utilizzo .carta geografica()
, e a
componente viene emesso per ogni film nel film
oggetto di stato.
, anche se. Innanzitutto, passiamo tutte le informazioni per un singolo film tramite un singolo meta
puntello. Questo è in realtà più conveniente di prima, in cui abbiamo specificato un puntello separato per ciascun attributo del film.chiave
prop anche. Questo viene usato internamente da React per tenere traccia dei componenti che sono stati aggiunti dal loop. Non è attualmente disponibile per essere utilizzato dal componente, quindi non dovresti provare ad accedervi nel tuo codice.chiave
prop, React genera un errore, quindi è importante includerlo. Reagire deve sapere quali nuovi film sono stati aggiunti, aggiornati o rimossi in modo da poter mantenere tutto sincronizzato.Movie.js
, e per ogni riferimento a un sostegno, prefisso con meta
, come segue:this.props.meta.title
Caricamento di altri film
film
stato oggetto, e React aggiornerà automaticamente tutte le parti della nostra app che utilizzano questo oggetto. Quindi, se aggiungiamo alcuni film, React attiverà il
componente di render ()
metodo per aggiornare la nostra galleria di film.App.js
.loadAdditionalMovies
è chiamato. Aggiungi questo metodo al
classe componente:loadAdditionalMovies () var currentMovies = ... this.state.movies; var newMovies = Object.assign (currentMovies, additionalMovies); this.setState (movies: newMovies);
this.setState
e passare nel nostro nuovo oggetto stato per sovrascrivere quello precedente. Non appena lo stato viene aggiornato, React aggiorna solo le parti del DOM che sono state interessate dalla modifica allo stato.loadAdditionalMovies ()
usa a diffusione
operatore per copiare tutte le proprietà del this.state.movies
oggetto nel nuovo currentMovies
oggetto.Object.assign
unire due oggetti insieme, risultando nell'elenco dei nuovi film aggiunti all'elenco corrente.loadAdditionalMovies ()
il metodo funzionerà. Per fare riferimento a qualsiasi metodo di componente personalizzato, prima dobbiamo associarlo manualmente alla classe del componente.App.js
:this.loadAdditionalMovies = this.loadAdditionalMovies.bind (this);
Questo
, non avrai problemi.film
oggetto di stato, e React si è occupato di tutto il resto.Conclusione