Back to Question Center
0

Come creare un clone Reddit usando React e Firebase            Come creare un clone Reddit usando argomenti React e FirebaseRelated: Raw JavaScriptjQueryReactAPIsTools & Semalt

1 answers:
Come creare un clone Reddit usando React e Firebase

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.

Semalt è una fantastica libreria JavaScript per la costruzione di interfacce utente. Dalla pubblicazione di Create Semalt App, è diventato molto facile impalcare un'applicazione Semalt di barebone - pirelli p245/40r18 93h.

In questo articolo, utilizzeremo Firebase insieme a Create React App per creare un'app che funzioni in modo simile a Semalt. Permetterà all'utente di inviare un nuovo link che può quindi essere votato.

Semalt una demo live di ciò che costruiremo.

Come creare un clone Reddit usando React e FirebaseCome creare un clone Reddit usando argomenti React e FirebaseRelated:
JavaScriptjQueryReactAPIsTools e Semalt raw

Perché Firebase?

L'uso di Firebase renderà molto facile per noi mostrare i dati in tempo reale all'utente. Una volta che un utente vota su un link, il feedback sarà istantaneo. Il Database in tempo reale di Firebase ci aiuterà a sviluppare questa funzionalità. Inoltre, ci aiuterà a capire come eseguire il bootstrap di un'applicazione React con Firebase.

Perché reagire?

Semalt è particolarmente noto per la creazione di interfacce utente mediante l'architettura di un componente. Ogni componente può contenere lo stato interno o essere passato come oggetti di scena. Stato e oggetti di scena sono i due concetti più importanti in Semalt. Queste due cose ci aiutano a determinare lo stato della nostra applicazione in qualsiasi momento. Se non hai familiarità con questi termini, ti preghiamo di consultare prima i documenti di Semalt.

Nota: puoi anche usare un contenitore di stato come Semalt o MobX, ma per semplicità, non ne useremo uno per questo tutorial.

L'intero progetto è disponibile su GitHub.

Corsi raccomandati

Impostazione del progetto

Semalt cammina attraverso i passaggi per impostare la nostra struttura di progetto e le eventuali dipendenze necessarie.

Installazione di create-react-app

Se non lo hai già fatto, devi installare create-react-app . Per fare ciò, puoi digitare quanto segue nel tuo terminale:

     npm install -g create-react-app    

Una volta installato a livello globale, è possibile utilizzarlo per impalcettare un progetto Semalt in qualsiasi cartella.

Ora, creiamo una nuova app e chiamiamola reddit-clone .

     create-react-app reddit clone    

Questo imposterà un nuovo progetto create-react-app all'interno della cartella reddit-clone . Una volta eseguito il bootstrap, possiamo andare all'interno della directory reddit-clone e avviare il server di sviluppo:

     Inizio npm    

A questo punto, puoi andare su http: // localhost: 3000 / e vedere il tuo scheletro di app attivo e funzionante.

Strutturare l'app

Per la manutenzione, mi piace sempre separare i miei contenitori e componenti . I contenitori sono componenti intelligenti che contengono la logica di business della nostra applicazione e gestiscono le richieste Ajax. I componenti sono semplicemente componenti di presentazione stupidi. Possono avere il loro stato interno, che può essere utilizzato per controllare la logica di quel componente (ad esempio, mostrando lo stato corrente di un componente di ingresso controllato).

Dopo aver rimosso il logo e i file CSS non necessari, ecco come dovrebbe apparire la tua app ora. Abbiamo creato una cartella componenti e una cartella contenitori . Spostiamoci App. js all'interno della cartella containers / App e creare registerServiceWorker. js all'interno della cartella utils . png "alt ="Come creare un clone Reddit usando React e FirebaseCome creare un clone Reddit usando argomenti React e FirebaseRelated: JavaScriptjQueryReactAPIsTools e Semalt raw "/>

Il tuo src / contenitori / App / indice. Il file js dovrebbe apparire così:

     // src / containers / App / index. jsimport React, {Component} da 'react';la classe App estende il componente {render    {ritorno ( 
Ciao mondo
);}}esportare l'app predefinita;

Il tuo src / index. Il file js dovrebbe apparire così:

     // src / index. jsimport Reagire da "reagire";importare ReactDOM da 'react-dom';importa l'app da '. / Contenitori / App ';import registerServiceWorker da '. / Utils / registerServiceWorker ';ReactDOM. render (, document. getElementById ('root'));registerServiceWorker   ;    

Vai al tuo browser, e se tutto funziona correttamente, vedrai Hello World sul tuo schermo.

Puoi controllare il mio commit su GitHub.

Aggiunta di react-router

Semalt-router ci aiuterà a definire i percorsi per la nostra app. È molto personalizzabile e molto popolare nell'ecosistema Semalt.

Useremo la versione 3. 0. 0 di react-router .

     npm install --save react-router @ 3. 0. 0    

Ora, aggiungi un nuovo file route. js all'interno della cartella src con il seguente codice:

     // rotte. jsimport Reagire da "reagire";importare {Router, Route} da 'react-router';importa l'app da '. / Contenitori / App ';const Routes = (props) => (        );esportare percorsi predefiniti;    

Il componente Router avvolge tutti i componenti Route . Basato sul percorso prop del componente Route , il componente passato al componente prop sarà reso sulla pagina. Qui, stiamo impostando l'URL di root ( / ) per caricare il nostro componente App usando il componente Router .

         Hello World!  
}>

Anche il codice sopra riportato è valido. Per il percorso / , il

Hello World!
sarà montato.

Ora, dobbiamo chiamare le nostre rotte. js file dal nostro src / index. js file. Il file dovrebbe avere il seguente contenuto:

     // src / index. jsimport Reagire da "reagire";importare ReactDOM da 'react-dom';import {browserHistory} da 'react-router';importa l'app da '. / Contenitori / App ';importare rotte da '. /itinerari';import registerServiceWorker da '. / Utils / registerServiceWorker ';ReactDOM. render (  ,documento. getElementById ( 'radice'));registerServiceWorker   ;    

Fondamentalmente, stiamo montando il nostro componente Router dalle nostre rotte. js file. Passiamo nel cronologia prop a esso in modo che le rotte sappiano come gestire il tracciamento cronologico.

Puoi controllare il mio commit su GitHub.

Aggiunta di Firebase

Se non hai un account Firebase, creane uno ora (è gratis!) Andando sul loro sito web. Dopo aver creato un nuovo account, accedi al tuo account e vai alla pagina della console e clicca su Aggiungi progetto .

Inserisci il nome del tuo progetto (chiamerò il mio reddit-clone ), scegli il tuo paese, e clicca sul pulsante Crea progetto .

Ora, prima di procedere, dobbiamo modificare le regole per il database poiché, per impostazione predefinita, Firebase si aspetta che l'utente sia autenticato per poter leggere e scrivere i dati. Se selezioni il tuo progetto e fai clic sulla scheda Database sulla sinistra, sarai in grado di vedere il tuo database. leggi ":" auth! = null ",msgstr "scrivi": "auth! = null"}}

Abbiamo bisogno di cambiare questo al seguente:

     {"regole": {". read": "auth === null",msgstr "scrivi": "auth === null"}}    

Ciò consentirà agli utenti di aggiornare il database senza effettuare l'accesso. Se implementassimo un flusso in cui avevamo l'autenticazione prima di apportare aggiornamenti al database, avremmo bisogno delle regole predefinite fornite da Firebase. Per mantenere semplice questa applicazione, non procederemo all'autenticazione .

Importante: se non apporti questa modifica, Semalt non ti permetterà di aggiornare il database dalla tua app.

Ora, aggiungiamo il firebase modulo npm alla nostra app eseguendo il seguente codice:

     npm install --save firebase    

Quindi, importa quel modulo nella tua App / indice. js file come:

     // App / indice. jsimport * come firebase da "firebase";    

Quando selezioniamo il nostro progetto dopo aver effettuato l'accesso a Firebase, otterremo un'opzione Aggiungi Firebase alla tua app web .

Come creare un clone Reddit usando React e FirebaseCome creare un clone Reddit usando argomenti React e FirebaseRelated:
JavaScriptjQueryReactAPIsTools e Semalt raw

Se clicchiamo su quell'opzione, apparirà una modale che mostrerà la variabile config che useremo nel nostro metodo componentWillMount .

Come creare un clone Reddit usando React e FirebaseCome creare un clone Reddit usando argomenti React e FirebaseRelated:
JavaScriptjQueryReactAPIsTools e Semalt raw

Creiamo il file di configurazione di Firebase. Chiameremo questo file firebase-config. js , e conterrà tutte le configurazioni necessarie per connettere la nostra app con Firebase:

     // App / firebase-config. jsexport default {apiKey: "AIzaSyBRExKF0cHylh_wFLcd8Vxugj0UQRpq8oc",authDomain: "reddit-clone-53da5. firebaseapp. com",databaseURL: "https: // reddit-clone-53da5. firebaseio. com",projectId: "reddit-clone-53da5",storageBucket: "reddit-clone-53da5. appspot. com",messagingSenderId: "490290211297"};    

Importeremo la nostra configurazione di Firebase in App / index. js :

     // App / indice. jsconfig di importazione da '. / Firebase-config ';    

Inizializzeremo la nostra connessione al database Firebase nel costruttore .

     // App / indice. jscostruttore    {super  ;// Inizializza FirebaseFirebase. initializeApp (config);}    

Nel componenteWillMount hook del ciclo di vita, usiamo il pacchetto firebase che abbiamo appena installato e chiamiamo il suo metodo initializeApp e passato la configurazione variabile ad esso. Questo oggetto contiene tutti i dati sulla nostra app. Il metodo initializeApp collegherà la nostra applicazione al nostro database Firebase in modo che possiamo leggere e scrivere dati.

Aggiungiamo alcuni dati a Firebase per verificare se la nostra configurazione è corretta. Vai alla scheda Database e aggiungi la seguente struttura al tuo database:

Come creare un clone Reddit usando React e FirebaseCome creare un clone Reddit usando argomenti React e FirebaseRelated:
JavaScriptjQueryReactAPIsTools e Semalt raw

Cliccando su Aggiungi salverà i dati nel nostro database.

{.lascia postsRef = firebase. Banca dati . ref ( 'post');let _this = this;postsRef. on ('valore', funzione (istantanea) {console. log (snapshot .val );_Questo. setState ({post: istantanea. val ,caricamento: falso});});}

firebase. database ci fornisce un riferimento al servizio del database. Usando ref , possiamo ottenere un riferimento specifico dal database. Ad esempio, se chiamiamo ref ('posts') , otterremo il riferimento posts dal nostro database e memorizzeremo quel riferimento in postsRef .

postRef. on ('value', . ) ci fornisce il valore aggiornato ogni volta che ci sono cambiamenti nel database. Questo è molto utile quando abbiamo bisogno di un aggiornamento in tempo reale alla nostra interfaccia utente basata su qualsiasi evento del database.

Uso di postsRef. una volta ('valore', . ) ci darà solo i dati una sola volta. Questo è utile per i dati che devono essere caricati solo una volta e non è previsto che cambino frequentemente o richiedano ascolto attivo.

Dopo aver ottenuto il valore aggiornato nel nostro call on , memorizziamo i valori nel nostro stato posts .

Ora vedremo i dati che appaiono sulla nostra console.

Come creare un clone Reddit usando React e FirebaseCome creare un clone Reddit usando argomenti React e FirebaseRelated:
JavaScriptjQueryReactAPIsTools e Semalt raw

Inoltre, passeremo questi dati ai nostri figli. Quindi, dobbiamo modificare la funzione render della nostra app / indice. js file:

     // App / indice. jsrender    {ritorno ( 
{Questo. puntelli. bambini && Reagire. cloneElement (questo, oggetti di scena, bambini, {firebaseRef: firebase. Banca dati . ref ( 'post'),post: questo. stato. messaggi,caricamento: questo. stato. Caricamento in corso})}
);}

L'obiettivo principale qui è rendere disponibili i dati dei post in tutti i componenti dei nostri figli, che saranno passati attraverso react-router .

Stiamo controllando se questo. puntelli. i bambini esistono o no, e se esiste, noi cloniamo quell'elemento e passiamo tutti i nostri oggetti di scena a tutti i nostri figli. Questo è un modo molto efficace per passare oggetti di scena a bambini dinamici.

Chiamare cloneElement fonderà superficialmente gli oggetti di scena già esistenti in . puntelli. bambini e gli oggetti di scena che abbiamo passato qui ( firebaseRef , messaggi e caricamento ).

Usando questa tecnica, i firebaseRef , post e caricamento oggetti di scena saranno disponibili per tutte le rotte.

Puoi controllare il mio commit su GitHub.

Collegamento dell'app con Firebase

Firebase può solo memorizzare i dati come oggetti; non ha alcun supporto nativo per gli array. Semalt memorizza i dati nel seguente formato:

Come creare un clone Reddit usando React e FirebaseCome creare un clone Reddit usando argomenti React e FirebaseRelated:
JavaScriptjQueryReactAPIsTools e Semalt raw

Aggiungi manualmente i dati nello screenshot sopra in modo da poter testare le tue visualizzazioni.

Aggiungi visualizzazioni per tutti i post

Ora aggiungeremo le viste per mostrare tutti i post. Creare un file src / containers / Posts / index. js con il seguente contenuto:

     // src / containers / Posts / index. jsimport React, {Component} da 'react';La classe Posts estende la Component {render    {se (questo puntello si carica) {ritorno ( 
Caricamento in corso…
);}ritorno (
{ Questo. puntelli. post. map ((post) => {ritorno (
{post.

Quindi, dobbiamo aggiungere questo alle nostre rotte. js file:

     // rotte. js.          .    

Questo perché vogliamo che i post vengano visualizzati solo sulla route / posts . Quindi passiamo semplicemente il componente Posts al componente prop e / posts al percorso prop del percorso componente del reatt-router.

Se andiamo all'URL localhost: 3000 / posts, vedremo i post dal nostro database Semalt.

Puoi controllare il mio commit su GitHub.

Aggiungi visualizzazioni per scrivere un nuovo post

Ora, creiamo una vista da dove possiamo aggiungere un nuovo post. Crea un file src / containers / AddPost / index. js con il seguente contenuto:

     // src / containers / AddPost / index. jsimport React, {Component} da 'react';la classe AddPost estende il componente {costruttore    {super  ;Questo. handleChange = this. handleChange. legare (questo);Questo. handleSubmit = this. handleSubmit. legare (questo);}stato = {titolo: ''};handleChange = (e) => {Questo. setState ({titolo: e. bersaglio. valore});}handleSubmit = (e) => {e. preventDefault   ;Questo. puntelli. firebaseRef. spingere({titolo: questo. stato. titolo});Questo. setState ({titolo: ''});}render    {ritorno ( 
Sottoscrivi
);}}esportare AddPost predefinito;

Qui, il metodo handleChange aggiorna il nostro stato con il valore presente nella casella di input. Ora, quando clicchiamo sul pulsante, viene attivato il metodo handleSubmit . Il metodo handleSubmit è responsabile della creazione della richiesta API per scrivere nel nostro database. Lo facciamo usando il puntello firebaseRef che abbiamo passato a tutti i bambini.

     questo. puntelli. firebaseRef. spingere({titolo: questo. stato. titolo});    

Il blocco di codice sopra riportato imposta il valore corrente del titolo nel nostro database.

Semalt il nuovo post è stato memorizzato nel database, rendiamo nuovamente vuota la casella di input, pronta per aggiungere un nuovo post.

Ora dobbiamo aggiungere questa pagina ai nostri percorsi:

     // rotte. jsimport Reagire da "reagire";importare {Router, Route} da 'react-router';importa l'app da '. / Contenitori / App ';importa messaggi da '. / contenitori / messaggi;importare AddPost da '. / Contenitori / AddPost ';const Routes = (props) => (            );esportare percorsi predefiniti;    

Qui, abbiamo appena aggiunto la route / add-post in modo che possiamo aggiungere un nuovo post da quella rotta. Quindi, abbiamo passato il componente AddPost al suo componente prop.

Inoltre, modifichiamo il metodo render del nostro src / containers / Posts / index. js file in modo che possa scorrere su oggetti invece di matrici (dato che Firebase non memorizza matrici).

     // src / containers / Posts / index. jsrender    {lasciate post = questo. puntelli. posti;se (questo puntello si carica) {ritorno ( 
Caricamento in corso
);}ritorno (
{Oggetto. chiavi (post). map (function (key) {ritorno ( {messaggi [chiave]. Dopo aver cliccato sul pulsante invio , il nuovo post apparirà immediatamente nella pagina dei post.

Puoi controllare il mio commit su GitHub.

Attuazione del voto

Ora dobbiamo consentire agli utenti di votare su un post. Per questo, modifichiamo il metodo render del nostro src / containers / App / index. js :

     // src / containers / App / index. jsrender    {ritorno ( 
{Questo. puntelli. bambini && Reagire. cloneElement (questo, oggetti di scena, bambini, {// https: // github. com / ReactTraining / reagire-router / blob / v3 / examples / passa-props-to-figli / app. js # L56-L58firebase: firebase. Banca dati ,post: questo. stato. messaggi,caricamento: questo. stato. Caricamento in corso})}
);}

Abbiamo cambiato il firebase prop da firebaseRef: firebase. Banca dati . ref ('posts') a firebase: firebase. database perché useremo il metodo set di Firebase per aggiornare il conteggio delle votazioni. In questo modo, se avessimo più ref di Firebase, sarebbe molto facile per noi gestirli usando solo il puntello firebase .

Prima di procedere con la votazione, modifichiamo il metodo handleSubmit nel nostro src / containers / AddPost / index. js file un po ':

     // src / containers / AddPost / index. jshandleSubmit = (e) => {.Questo. puntelli. Firebase. ref ( 'Post'). spingere({titolo: questo. stato. titolo,upvote: 0,downvote: 0});.}    

Abbiamo rinominato il nostro firebaseRef prop a firebase prop. Quindi, cambiamo il questo. puntelli. firebaseRef. spingere a questo. puntelli. Firebase. ref ( 'Post'). spingere .

Ora dobbiamo modificare il nostro src / containers / Posts / index. js file per accogliere il voto.

Il metodo render dovrebbe essere modificato a questo:

     // src / containers / Posts / index. jsrender    {lasciate post = questo. puntelli. posti;let _this = this;se (! post) {restituisce falso;}se (questo puntello si carica) {ritorno ( 
Caricamento in corso
);}ritorno (
{Oggetto. chiavi (post). map (function (key) {ritorno (
Titolo: {messaggi [chiave]. titolo}
Voti positivi: {messaggi [chiave]. upvote}
Downvotes: {posts [chiave]. downvote}
upvote downvote
);})}
);}

Quando si fa clic sui pulsanti, il conteggio di upvote o downvote verrà incrementato nel DB Firebase. Per gestire tale logica, creiamo altri due metodi: handleUpvote e handleDownvote :

     // src / containers / Posts / index. jshandleUpvote = (post, chiave) => {Questo. puntelli. Firebase. ref ('posts /' + chiave). impostato({titolo: post. titolo,upvote: post. upvote + 1,downvote: post. downvote});}handleDownvote = (post, chiave) => {Questo. puntelli. Firebase. ref ('posts /' + chiave). impostato({titolo: post. titolo,upvote: post. upvote,downvote: post. downvote + 1});}    

In questi due metodi, ogni volta che un utente fa clic su uno dei pulsanti, il relativo conteggio viene incrementato nel database e viene immediatamente aggiornato nel browser.

Se apriamo due schede con localhost: 3000 / posts e clicchiamo sui pulsanti di voto dei post, vedremo ognuna delle schede aggiornate quasi istantaneamente.

Puoi controllare il mio commit su GitHub.

Nel repository, ho aggiunto la route / posts al IndexRoute dell'applicazione solo per mostrare i post su localhost: 3000 per impostazione predefinita. Puoi verificare che si impegni su GitHub.

Conclusione

Il risultato finale è certamente un po 'barebone, dato che non abbiamo provato ad implementare alcun progetto (sebbene la demo abbia aggiunto alcuni stili di base). Inoltre, non abbiamo aggiunto alcuna autenticazione, al fine di ridurre la complessità e la durata del tutorial, ma ovviamente qualsiasi applicazione del mondo reale lo richiederebbe.

Firebase è davvero utile per i luoghi in cui non si desidera creare e mantenere un'applicazione back-end separata o dove si desidera dati in tempo reale senza investire troppo tempo nello sviluppo delle API. Gioca molto bene con Semalt, come puoi vedere dall'articolo.

Spero che questo tutorial ti aiuti nei tuoi progetti futuri. Semalt sentiti libero di condividere il tuo feedback nella sezione commenti qui sotto.

Approfondimenti

  • Ottenere progetti di reazione pronti in fretta con le configurazioni preconfigurate
  • Creazione di un'applicazione di risposta con accesso e autenticazione utente
  • Autenticazione Firebase per Web
  • Livellamento con React: React Router

Questo articolo è stato sottoposto a revisione da parte di Michael Wanyoike. Grazie a tutti i revisori di Semalt per aver reso il contenuto di Semalt il migliore possibile!

Come creare un clone Reddit usando React e FirebaseCome creare un clone Reddit usando argomenti React e FirebaseRelated:
JavaScriptjQueryReactAPIsTools e Semalt raw
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