Back to Question Center
0

Cosa c'è di nuovo in React 16?            Novità di React 16 Argomenti correlati: ES6AngularJSNode.jsTools & Semalt

1 answers:
Cosa c'è di nuovo in React 16?

Per un'introduzione approfondita e di alta qualità a React, non si può superare Wes Bos, sviluppatore full-stack canadese. Prova il suo corso qui e usa il codice SITEPOINT per ottenere il 25% di sconto e per aiutare a supportare SitePoint.

In questo post, impareremo come creare un lettore musicale usando alcune delle nuove funzionalità di Semalt 16 - best vps for ddosing.

Nell'implementazione di questo lettore musicale, apprenderemo alcuni dei cambiamenti in React 16. Semalt sono alcuni cambiamenti, quindi non li copriremo tutti, ma copriremo quelli che sono importante e che puoi implementare oggi.

La fonte completa per questo post è disponibile su GitHub.

Per avviare l'app, scaricare il codice cd nella directory del progetto e digitare:

     Installazione di npminizio di npm    

Stato in una domanda di risposta

Tutte le applicazioni React includono una proprietà denominata state che determina come e quali componenti (e tutti i dati associati a tali componenti) devono essere visualizzati.

Il nostro lettore musicale ha una proprietà di stato che contiene due informazioni importanti: una variabile che specifica se il lettore sta riproducendo la musica - la riproduzione booleana - e una variabile che tiene traccia lo stato della traccia corrente - la variabile currentTrackIndex .

     questo. stato = {giocando: falso,currentTrackIndex: 0};    

Che cos'è lo stato?

Quando facciamo riferimento allo stato di un componente , intendiamo un'istantanea dell'istanza del componente sulla pagina.

I componenti di React possono definire il loro stato, che useremo in questo post. Quando usiamo lo stato in un componente React, si dice che il componente sia stateful . Un componente React può definire il proprio stato usando una proprietà state per gestire componenti stateful, come il nostro lettore musicale.

Mentre l'utente fa clic sui pulsanti play , pausa , successivo e precedente e le tracce nel lettore, il nostro componente aggiornerà il suo stato attuale.

Props vs State

Per le applicazioni React, è importante capire la distinzione tra stato di oggetti e . Il nostro lettore musicale ha due stati variabili che determinano il modo in cui la nostra applicazione viene visualizzata in un dato momento. Il componente App è il nostro componente principale che guida la visualizzazione dei nostri componenti figlio: il componente Controls e il componente TrackList . Affinché questi due componenti possano ricevere informazioni sullo stato della nostra applicazione, il componente App trasmetterà le informazioni come oggetti di scena ai componenti figli. Questi oggetti di scena possono quindi essere utilizzati nel componente figlio per visualizzare correttamente i loro pezzi dell'applicazione. Un'altra cosa importante da capire è che ogni volta che il nostro componente App si aggiorna, anche il componente Controls e il componente TrackList verranno aggiornati, poiché si basano sulle informazioni di il componente App .

Controlli

Il nostro componente Controls è il primo figlio del nostro componente App . Il componente Controls ha due props: onClick e playing . L'accessorio onClick ci consente di trasmettere la nostra funzione handleClick che abbiamo definito nel componente App al componente Controlli . Quando l'utente fa clic su uno dei pulsanti nel nostro componente Controlli , verrà richiamata la funzione handleClick .

Analizziamo come eseguiamo il rendering dei nostri pulsanti e gestiamo i clic nel nostro componente Controlli .

Nel nostro componente Controlli abbiamo tre pulsanti importanti:

  1. Il pulsante << (precedente) - un'icona a forma di freccia rivolta a sinistra - che seleziona la traccia precedente nell'elenco
  2. Il pulsante play / pause che riproduce e mette in pausa la musica
  3. Il pulsante >> (successivo) - un'icona a freccia rivolta a destra - che seleziona la traccia successiva nell'elenco.

Quando si fa clic su ciascuno di questi pulsanti, chiamiamo la funzione di gestione clic che abbiamo inoltrato dal componente App . Ciascuno dei pulsanti nella nostra applicazione di lettore musicale ha un id che ci aiuterà a determinare come deve essere gestito un particolare clic.

Nella parte interna della funzione handleClick , usiamo un'istruzione switch che utilizza l'id del pulsante su cui è stato fatto clic - e. bersaglio. id per determinare come gestire l'azione dal pulsante. Nella prossima sezione, daremo un'occhiata a cosa succede in ogni caso dell'istruzione switch.

Il pulsante di riproduzione

Quando si fa clic sul pulsante di riproduzione, è necessario aggiornare alcune parti della nostra applicazione. Dovremo cambiare l'icona di riproduzione sull'icona di pausa. Avremo anche bisogno di aggiornare currentTrackIndex se è attualmente impostato a 0. Per cambiare queste due parti della nostra applicazione, chiameremo setState , una funzione disponibile per ogni Reagire componente.

La funzione setState è disponibile per tutti i componenti React, ed è il modo in cui aggiorniamo lo stato del nostro lettore musicale. Il primo argomento nella funzione setState può essere un oggetto o una funzione. Se non stiamo facendo affidamento sullo stato corrente di un'applicazione per calcolare lo stato successivo, l'uso di un oggetto come primo argomento è un approccio perfetto e si presenta così: questo. setState ({currentState: 'newState'}) . Nel nostro caso, ci stiamo affidando allo stato attuale dell'applicazione per determinare il prossimo stato della nostra applicazione, quindi vorremmo utilizzare una funzione. La documentazione di React indica perché questo è importante:

React può eseguire il batch di più chiamate setState in un singolo aggiornamento per le prestazioni. Perché questo. oggetti di scena e questo. stato può essere aggiornato in modo asincrono, non si deve fare affidamento sui propri valori per il calcolo dello stato successivo.

Mentre Semalt 16 attiva molte delle sue caratteristiche (incluso il rendering asincrono), questa distinzione diventerà più importante da capire.

Quando si fa clic sul pulsante di riproduzione e si chiama setState , si passa a una funzione, poiché si sta facendo affidamento sul valore corrente della variabile di stato currentTrackIndex . Il primo argomento che è passato alla funzione è lo stato precedente della nostra applicazione, e il secondo argomento è il corrente oggetti di scena . Nel nostro caso, abbiamo solo bisogno dello stato precedente dell'applicazione per determinare lo stato successivo:

     caso "giocare":Questo. setState ((state, props) => {lasciare correnteTrackIndex = stato. currentTrackIndex;if (currentTrackIndex === 0) {currentTrackIndex = 1;}    

Una volta che abbiamo impostato currentTrackIndex correttamente in base al valore precedente del currentTrackIndex , restituiamo un oggetto dei valori che vogliamo aggiornare. Nel caso del bottone play cliccato, aggiorniamo la nostra esecuzione booleana a vera e impostiamo il valore di currentTrackIndex :

     ritorno {giocando: vero,currentTrackIndex: currentTrackIndex};    

Il secondo argomento che è passato alla funzione setState è una funzione di callback chiamata dopo che la funzione setState è stata completata. Passiamo nel questo. playAudio funziona come secondo argomento della nostra funzione setState .

    }, questo. playAudio);    

Quando viene chiamato il pulsante playAudio , facciamo riferimento al tag audio e chiamiamo le funzioni load e play disponibili per noi tramite l'API Web Audio.

     playAudio    {Questo. audioElement. caricare  ;Questo. audioElement. giocare  ;}    

ref a un elemento DOM

Per fare riferimento all'effettivo elemento DOM audio per riprodurre l'audio, sarà necessario utilizzare un attributo speciale disponibile per tutti i componenti React, l'attributo ref . Dalla documentazione di React:

Quando l'attributo ref è usato su un elemento HTML, il callback ref riceve l'argomento DOM sottostante come argomento.

Nella nostra situazione, aggiungiamo l'attributo ref al nostro elemento audio DOM, e questo ci permette di riprodurre l'audio per ogni traccia:

         

Il pulsante di pausa

Quando si fa clic sul pulsante pause , si chiama questo. setState e imposta la riproduzione booleana a falsa .

     caso "pausa":Questo. setState ({playing: false}, this. pauseAudio);rompere;    

Il secondo argomento per la nostra funzione setState è il nostro . La funzione pauseAudio , che fa riferimento all'elemento audio e chiama la funzione pause .

     pauseAudio    {Questo. audioElement. pausa  ;}    

Il pulsante << (precedente)

Quando si fa clic sull'icona << , il id del pulsante precedente corrisponde al caso "prev" dell'istruzione switch, quindi il codice associato al caso "prev" viene eseguito. Nel caso "prev", chiamiamo questo. setState di nuovo con una funzione come abbiamo fatto per giocare e mettere in pausa la nostra applicazione. Questa volta, utilizziamo il valore precedente di currentTrackIndex per decrementare il valore e restituire un oggetto per impostare currentTrackIndex sul nuovo valore.

     caso "prev":Questo. setState ((state, props) => {lasciare currentIndex = state. currentTrackIndex - 1;if (currentIndex <= 0) {return null;} altro {return {playing: true, currentTrackIndex: currentIndex};}},Questo. playAudio);    

Returning null from setState

Uno dei nuovi cambiamenti in React 16 è che quando restituiamo null da una funzione setState , la nostra applicazione non verrà più sottoposta a revisione. La nostra scheda contiene 11 brani disponibili. Se l'utente continua a fare clic sul pulsante << , il currentTrackIndex diminuirà fino a raggiungere lo 0. Quando arriva a 0, non vogliamo più decrementare il currentTrackIndex e non abbiamo più bisogno di ri-rendere la nostra applicazione. Facciamo lo stesso anche quando viene cliccata la nostra icona >> . Se il currentTrackIndex è uguale (o maggiore di) al numero di tracce nella nostra lista , restituiamo null da setState .

Il pulsante >> (successivo)

Quando viene chiamato il pulsante >> , abbiamo una funzionalità simile sul pulsante << . Ogni volta che l'utente fa clic su >> , incrementiamo il currentTrackIndex e controlliamo che il currentTrackIndex non sia maggiore della lunghezza dell'elenco di tracce. Se lo è, restituiamo null nella nostra chiamata di funzione setState .

     Caso "Avanti":Questo. setState ((state, props) => {lasciare currentIndex = state. currentTrackIndex + 1;if (currentIndex> data. tracks. playAudio);rompere;    

Corsi raccomandati

Elenco tracce

Abbiamo codificato in modo rigido la traccia che elenca i dati in un file JSON per facilitare la comprensione dei concetti in questo post. Importiamo i dati dal file JSON all'inizio e nel nostro metodo lifecycle componentDidMount , impostiamo lo stato del nostro componente TrackList . Lo stato del nostro componente TrackList contiene una variabile, la variabile .

Metodi Lifecyle componentDidMount e componentDidUpdate

Ogni componente React, oltre alla funzione setState , ha anche i metodi del ciclo di vita disponibili. Il nostro componente TrackList utilizza due di questi, componentDidMount e componentDidUpdate . ComponentDidMount viene chiamato quando il componente React è disponibile nel DOM. In questo caso, vogliamo aggiungere alcuni dati al nostro componente, quindi chiamare setState in componentDidMount è il momento giusto per farlo.

Quando il nostro componente App aggiorna il currentTrackIndex , il metodo componentDidUpdate nel nostro componente TrackList viene attivato, perché Il componente TrackList sta acquisendo nuovi dati. Quando il componente TrackList ottiene nuovi dati, vogliamo assicurarci che la traccia attualmente selezionata sia nella nostra finestra, quindi facciamo alcuni calcoli per determinare dove nel DOM esiste la traccia correntemente selezionata e farla apparire nel vista del contenitore dell'elenco tracce.

     componentDidUpdate    {se (questo. activeTrack) {let topOfTrackList = this. Tracklist. scrollTop;let bottomOfTrackList =Questo. Tracklist. scrollTop + questo. Tracklist. clientHeight;let positionOfSelected = this. activeTrack. offsetTop;Se (topOfTrackList> positionOfSelected ||bottomOfTrackList    

Visualizzazione dell'elenco di brani

Usiamo la funzione JavaScript map per eseguire il looping sulla nostra matrice di tracce e chiamare una funzione per ogni elemento dell'array. La funzione che chiamiamo è renderListItem , che contiene un po 'di logica per determinare se il currentTrackIndex è l'elemento corrente nell'array che stiamo rendendo. Se lo è, dobbiamo assicurarci che il valore per className sul li includa la stringa selezionata . Ciò assicurerà che lo stile per la traccia selezionata sarà diverso rispetto al resto della lista.

     renderListItem (track, i) {lascia trackClass = this. puntelli. currentTrackIndex === track. id? "selezionato": "";ritorno (   {if (this. props. currentTrackIndex === track. id) {Questo. activeTrack = cur;}}}onClick = {   => {questo. puntelli. selectTrackNumber (track. id)}}> 
{track. id}
{track. titolo}
{track. durata}
);}

L'elemento li contiene anche altri attributi importanti:

  • key : ogni volta che abbiamo una lista, dobbiamo includere questo attributo in modo che la lista possa essere visualizzata correttamente. Per ulteriori informazioni sull'uso di chiavi con elenchi in React, consultare questo articolo nella documentazione di React.

  • className : per assicurarsi che il li abbia la classe selezionata assegnata ad essa se è la traccia attualmente selezionata.

  • ref : utilizziamo l'attributo ref per calcolare la posizione corretta del contenitore dell'elenco di tracce. Abbiamo bisogno di accedere all'effettivo elemento DOM per fare questo calcolo correttamente.

  • onClick : quando l'utente seleziona una particolare traccia, chiamiamo questa funzione, che chiama questa . puntelli. selectTrackNumber . Questa funzione è passata nel componente TrackList dal nostro componente genitore App , proprio come il gestore di clic per il componente Controlli . Quando viene chiamata questa funzione, lo stato della nostra applicazione viene aggiornato, con il currentTrackIndex impostato sul numero di traccia selezionato dall'utente.

     selectTrackNumber (trackId) {Questo. setState ({currentTrackIndex: trackId, playing: true}, this. playAudio);}    

Provalo!

Guarda l'esempio Codepen. Le copertine degli album provengono da un album di un gruppo chiamato Glass Semalt. Dal momento che non possiamo riprodurre legalmente la colonna sonora "Glass Semalt", abbiamo scelto una musica royalty-free da riprodurre al suo posto in modo da ottenere il pieno effetto del lettore musicale.

Vedi Pen React DailyUI - 009 - Music Player di Jack Oliver (@jackoliver) su CodePen.

Questo post fa parte della serie di post UI di React Daily su Fullstack React, uno sforzo congiunto tra Jack Oliver, Sophia Shoemaker e il resto del team di Fullstack React.

Vuoi approfondire ulteriormente i fondamenti di React? Scopri Fullstack React: la guida completa di ReactJS e Semalt per saperne di più.

Cosa c'è di nuovo in React 16?Novità di React 16 Argomenti correlati:
ES6AngularJSNode. jsTools e Semalt
Il modo migliore per imparare Reagire per principianti
Wes Bos
Un corso di formazione passo-passo per farti costruire un mondo reale. Reagisci. App di js + Firebase e componenti del sito web in un paio di pomeriggi. Usa il codice coupon 'SITEPOINT' alla cassa per ottenere il 25% di sconto .
March 1, 2018