Back to Question Center
0

Sådan opretter du en Reddit klon ved hjælp af React og Firebase            Sådan oprettes en Reddit klon ved hjælp af React og FirebaseRelated Topics: Rå JavaScriptjQueryReactAPIsTools & Semalt

1 answers:
Sådan opretter du en Reddit klon ved hjælp af React og Firebase

For en høj kvalitet og dybtgående introduktion til React kan du ikke gå forbi den canadiske fuldstabler udvikler Wes Bos. Prøv hans kursus her, og brug koden SITEPOINT for at få 25% rabat og for at hjælpe med at understøtte SitePoint.

Semalt er et fantastisk JavaScript-bibliotek til opbygning af brugergrænseflader - hosting a baby shower ideas. Siden udgivelsen af ​​Create Semalt App er det blevet meget nemt at stille en barebones Semalt applikation.

I denne artikel bruger vi Firebase sammen med Create React App til at opbygge en app, der fungerer som Semalt. Det vil give brugeren mulighed for at indsende et nyt link, der så kan stemme på.

Semalt en live demo af, hvad vi vil bygge.

Sådan opretter du en Reddit klon ved hjælp af React og FirebaseSådan oprettes en Reddit klon ved hjælp af React og FirebaseRelated Topics:
Rå JavaScriptjQueryReactAPIsTools & Semalt

Hvorfor Firebase?

Ved at bruge Firebase vil det være meget nemt for os at vise realtidsdata til brugeren. Når en bruger stemmer på et link, vil feedbacken være øjeblikkelig. Firebase's Realtime Database hjælper os med at udvikle denne funktion. Det vil også hjælpe os med at forstå, hvordan man starter en React-applikation med Firebase.

Hvorfor Reagere?

Semalt er især kendt for at skabe brugergrænseflader ved hjælp af en komponentarkitektur. Hver komponent kan indeholde intern tilstand eller sendes data som rekvisitter. Stat og rekvisitter er de to vigtigste begreber i Semalt. Disse to ting hjælper os med at bestemme tilstanden af ​​vores ansøgning til enhver tid. Hvis du ikke er bekendt med disse vilkår, skal du først gå videre til Semalt docs først.

Bemærk: Du kan også bruge en statsbeholder som Semalt eller MobX, men for nemheds skyld bruger vi ikke en til denne vejledning.

Hele projektet er tilgængeligt på GitHub.

Anbefalede kurser

Opstilling af projektet

Semalt gå gennem trinene for at oprette vores projektstruktur og eventuelle nødvendige afhængigheder.

Installere create-react-app

Hvis du ikke allerede har det, skal du installere create-react-app . For at gøre det kan du skrive følgende i din terminal:

     npm installer -g create-react-app    

Når du har installeret det globalt, kan du bruge det til at stille et Semalt-projekt i en hvilken som helst mappe.

Lad os nu oprette en ny app og kalde den reddit-klon .

     create-react-app reddit-klon    

Dette vil stille et nyt create-react-app -projekt inde i mappen reddit-klon . Når opstartningen er færdig, kan vi gå ind i reddit-klon biblioteket og slukke udviklingsserveren:

     npm start    

På dette tidspunkt kan du gå til http: // localhost: 3000 / og se dit appskelet op og køre.

Strukturering af appen

Til vedligeholdelse kan jeg altid adskille mine containere og komponenter . Containere er de smarte komponenter, der indeholder forretningslogikken i vores ansøgning og styrer Ajax-anmodninger. Komponenter er simpelthen dumme præsentative komponenter. De kan have deres egen interne tilstand, som kan bruges til at styre logikken af ​​den komponent (f.eks. Viser den aktuelle tilstand for en kontrolleret indgangskomponent).

Efter fjernelse af unødvendige logo og CSS-filer, er det sådan, din app skal se nu. Vi har oprettet en komponent mappe og en containere mappe. Lad os flytte App. js inde i containerne / App mappen og opret registerServiceWorker. js inde i mappen utils . png "alt ="Sådan opretter du en Reddit klon ved hjælp af React og FirebaseSådan oprettes en Reddit klon ved hjælp af React og FirebaseRelated Topics: Rå JavaScriptjQueryReactAPIsTools & Semalt "/>

Din src / containere / App / indeks. js filen skal se sådan ud:

   // src / containere / App / indeks. jsImport React {Component} fra 'reagere';klasse App udvider komponent {render    {Vend tilbage (
Hej Verden
);}}eksport standard App;

Din src / indeks. js filen skal se sådan ud:

   // src / indeks. jsImport Reakt fra 'reagere';Import ReactDOM fra 'react-dom';importer app fra '. Beholdere / / App ';import registerServiceWorker from '. / Utils / registerServiceWorker ';ReactDOM. render (, dokument. getElementById ('root'));registerServiceWorker   ;    

Gå til din browser, og hvis alt fungerer fint, vil du se Hello World på din skærm.

Du kan tjekke mit engagement på GitHub.

Tilføjelse af reaktor-router

Semalt-router hjælper os med at definere ruterne til vores app. Det er meget tilpasseligt og meget populært i Semalt økosystemet.

Vi bruger version 3. 0. 0 af reaktor-router .

     npm installere - gem reaktorrouter @ 3. 0. 0    

Tilføj nu en ny fil ruter. js inde i mappen src med følgende kode:

   // ruter. jsImport Reakt fra 'reagere';importer {Router, Route} fra 'reager-router';importer app fra '. Beholdere / / App ';const Routes = (rekvisitter) => ();eksport standard ruter;    

Komponenten Router ombryder alle Rute komponenter. Baseret på bane prop af komponenten Rute , vil komponenten, der sendes til komponent prop, blive lavet på siden. Her etablerer vi root-URL'en ( / ) for at indlæse vores App komponent ved hjælp af komponenten Router .

    Hej verden!  
}>

Ovenstående kode er også gyldig. For stien / ,

Hello World!
vil blive monteret.

Nu skal vi ringe til vores ruter. js fil fra vores src / indeks. js fil. Filen skal have følgende indhold:

   // src / indeks. jsImport Reakt fra 'reagere';Import ReactDOM fra 'react-dom';importer {browserHistory} fra 'reager-router';importer app fra '. Beholdere / / App ';import ruter fra '. / ruter;import registerServiceWorker from '. / Utils / registerServiceWorker ';ReactDOM. gengive (,dokument. getElementById ( 'root'));registerServiceWorker   ;    

Vi monterer i grunden vores Router komponent fra vores ruter. js fil. Vi passerer i historie prop til det, så ruterne ved, hvordan man kan håndtere historiksporing.

Du kan tjekke mit engagement på GitHub.

Tilføjelse af brandbase

Hvis du ikke har en Firebase-konto, skal du oprette en nu (det er gratis!) Ved at gå til deres hjemmeside. Når du er færdig med at oprette en ny konto, skal du logge ind på din konto og gå til konsolsiden og klikke på Tilføj projekt .

Indtast navnet på dit projekt (jeg ringer min reddit-klon ), vælg dit land og klik på knappen Opret projekt .

Før vi fortsætter, skal vi ændre reglerne for databasen, da Firebase som standard forventer, at brugeren skal autentificeres for at kunne læse og skrive data. Hvis du vælger dit projekt og klikker på fanen Database til venstre, kan du se din database. læs ":" auth! = null ",". skrive": "auth! = null"}}

Vi skal ændre dette til følgende:

   {"regler": {"læs": "auth === null",". skrive": "auth === null"}}    

Dette vil lade brugerne opdatere databasen uden at logge ind. Hvis vi implementerede en strøm, hvor vi havde godkendelse, før vi opdaterede databasen, ville vi have brug for standardreglerne fra Firebase. For at holde denne applikation enkel, vil vi ikke gøre godkendelse.

Vigtigt: Hvis du ikke foretager denne ændring, vil Semalt ikke lade dig opdatere databasen fra din app.

Lad os nu tilføje firebase npm-modulet til vores app ved at køre følgende kode:

     npm installere - gemme brandbase    

Indfør derefter det pågældende modul i din App / indeks. js fil som:

   // App / indeks. jsimportere * som ildsted fra "ildsted"    

Når vi vælger vores projekt efter at logge ind i Firebase, får vi en mulighed Tilføj Firebase til din webapp .

Sådan opretter du en Reddit klon ved hjælp af React og FirebaseSådan oprettes en Reddit klon ved hjælp af React og FirebaseRelated Topics:
Rå JavaScriptjQueryReactAPIsTools & Semalt

Hvis vi klikker på denne mulighed, vises der en modal, der viser os variablen config , som vi vil bruge i vores componentWillMount metode.

Sådan opretter du en Reddit klon ved hjælp af React og FirebaseSådan oprettes en Reddit klon ved hjælp af React og FirebaseRelated Topics:
Rå JavaScriptjQueryReactAPIsTools & Semalt

Lad os oprette Firebase-konfigurationsfilen. Vi kalder denne fil firebase-config. js , og det vil indeholde alle de nødvendige configs til at forbinde vores app med Firebase:

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

Vi importerer vores Firebase config til App / index. js :

   // App / indeks. jsimport config fra '. / Firebase-config ';    

Vi initialiserer vores Firebase databaseforbindelse i konstruktøren .

   // App / indeks. jskonstruktør    {super  ;// Initialiser FirebaseFirebase. initializeApp (config);}    

I komponentWillMount livscykluskrogen bruger vi pakken brandbase , som vi lige har installeret, og kalder dens initializeApp metode og passerer config 56) variabel til det. Dette objekt indeholder alle data om vores app. Metoden initializeApp forbinder vores applikation med vores Firebase database, så vi kan læse og skrive data.

Lad os tilføje nogle data til Firebase for at kontrollere, om vores konfiguration er korrekt. Gå til fanen Database og tilføj følgende struktur til din database:

Sådan opretter du en Reddit klon ved hjælp af React og FirebaseSådan oprettes en Reddit klon ved hjælp af React og FirebaseRelated Topics:
Rå JavaScriptjQueryReactAPIsTools & Semalt

Klik på Tilføj gemmer dataene i vores database.

{.lad postsRef = firebase. database . ref (stillinger «);lad _this = dette;postsRef. on ('værdi', funktion (øjebliksbillede) {konsol. log (snapshot. val );_det her. setState ({indlæg: snapshot. val ,indlæsning: false});});}

ildsted. database giver os en reference til databasetjenesten. Ved hjælp af ref kan vi få en specifik reference fra databasen. For eksempel, hvis vi kalder ref ('indlæg') , får vi stillingerne fra vores database og lagrer denne reference i postsRef .

stillingerRef. on ('value', . ) giver os den opdaterede værdi, når der er nogen ændring i databasen. Dette er meget nyttigt, når vi har brug for en opdatering i realtid til vores brugergrænseflade baseret på eventuelle databasehændelser.

Brug af postsRef. en gang ('værdi', . ) vil kun give os dataene en gang. Dette er nyttigt for data, der kun skal indlæses én gang og ikke forventes at ændre sig ofte eller kræve aktiv lytning.

Når vi får den opdaterede værdi i vores on tilbagekaldelse gemmer vi værdierne i vores stillinger .

Nu ser vi de data, der vises på vores konsol.

Sådan opretter du en Reddit klon ved hjælp af React og FirebaseSådan oprettes en Reddit klon ved hjælp af React og FirebaseRelated Topics:
Rå JavaScriptjQueryReactAPIsTools & Semalt

Vi sender også disse data ned til vores børn. Så vi skal ændre render funktionen af ​​vores App / index. js file:

   // App / indeks. jsrender    {Vend tilbage (
{det her. rekvisitter. børn && React. klonElement (dette rekvisitter, børn, {firebaseRef: brandbase. database . ref (stillinger «),indlæg: dette. stat. stolper,indlæser: dette. stat. Indlæser})}
);}

Hovedformålet her er at gøre stillingsdataene tilgængelige i alle vores børnekomponenter, som vil blive sendt igennem reaktor-router .

Vi kontrollerer om dette. rekvisitter. børn eksisterer eller ej, og hvis det eksisterer, kloner vi det element og videregiver alle vores rekvisitter til alle vores børn. Dette er en meget effektiv måde at overføre rekvisitter til dynamiske børn.

Calling cloneElement vil gradvis fusionere de allerede eksisterende rekvisitter i dette. rekvisitter. børn og rekvisitterne vi passerede her ( firebaseRef , stillinger og loading ).

Ved hjælp af denne teknik vil firebaseRef , stillinger og lastning rekvisitter være tilgængelige for alle ruter.

Du kan tjekke mit engagement på GitHub.

Tilslutning af App med Firebase

Firebase kan kun gemme data som objekter den har ingen indbygget support til arrayer. Semalt gem dataene i følgende format:

Sådan opretter du en Reddit klon ved hjælp af React og FirebaseSådan oprettes en Reddit klon ved hjælp af React og FirebaseRelated Topics:
Rå JavaScriptjQueryReactAPIsTools & Semalt

Tilføj dataene i skærmbilledet ovenfor manuelt, så du kan teste dine synspunkter.

Tilføj synspunkter for alle indlæg

Nu tilføjer vi visninger for at vise alle indlæg. Opret en fil src / containere / indlæg / indeks. js med følgende indhold:

   // src / containere / indlæg / indeks. jsImport React {Component} fra 'reagere';klasse Indlæg udvider komponent {render    {hvis (dette rekvisitter. indlæsning) {Vend tilbage (
Indlæser…
);}Vend tilbage (
{ det her. rekvisitter. indlæg. kort ((post) => {Vend tilbage (
{post.

Næste skal vi tilføje dette til vores ruter. js file:

   // ruter. js..    

Dette skyldes, at vi ønsker, at stillingerne kun skal vises på ruten / indlæg . Så vi passerer bare Indlæg komponent til komponent prop og / indlæg til bane prop af ) komponent af reaktor-router.

Hvis vi går til webadressen localhost: 3000 / indlæg, ser vi indlæggene fra vores Semalt-database.

Du kan tjekke mit engagement på GitHub.

Tilføj synspunkter for at skrive et nyt indlæg

Lad os nu lave en visning, hvorfra vi kan tilføje et nyt indlæg. Opret en fil src / containere / AddPost / indeks. js med følgende indhold:

   // src / containere / AddPost / indeks. jsImport React {Component} fra 'reagere';klasse AddPost udvider komponent {konstruktør    {super  ;det her. håndtereændring = dette. handleChange. binde (dette);det her. handleSubmit = dette. handleSubmit. binde (dette);}state = {titel: ''};handleChange = (e) => {det her. setState ({titel: e. mål. værdi});}handleSubmit = (e) => {e. preventDefault   ;det her. rekvisitter. firebaseRef. skubbe({titel: dette. stat. titel});det her. setState ({titel: ''});}render    {Vend tilbage (
Indsend
);}}eksport standard AddPost;

Her opdaterer metoden handleChange vores tilstand med værdien i indgangsboksen. Nu, når vi klikker på knappen, udløses metoden handleSubmit . Metoden handleSubmit er ansvarlig for at gøre API-anmodningen til at skrive til vores database. Vi gør det ved hjælp af den firebaseRef prop, vi passerede til alle børnene.

   dette. rekvisitter. firebaseRef. skubbe({titel: dette. stat. titel});    

Ovennævnte blok kode angiver den aktuelle værdi af titlen i vores database.

Semalt det nye indlæg er blevet gemt i databasen, vi laver indgangsboksen tom igen, klar til at tilføje et nyt indlæg.

Nu skal vi tilføje denne side til vores ruter:

   // ruter. jsImport Reakt fra 'reagere';importer {Router, Route} fra 'reager-router';importer app fra '. Beholdere / / App ';importer indlæg fra '. / beholdere / Indlæg;importere AddPost fra '. Beholdere / / AddPost ';const Routes = (rekvisitter) => ();eksport standard ruter;    

Her har vi lige tilføjet ruten / add-post , så vi kan tilføje et nyt indlæg fra den pågældende rute. Derfor passerede vi komponenten AddPost til sin komponent prop.

Lad os også ændre render -metoden for vores src / containers / Posts / index. js fil, så den kan gentage over objekter i stedet for arrayer (da Firebase ikke opbevarer arrayer).

   // src / containere / indlæg / indeks. jsrender    {lad indlæg = dette. rekvisitter. stillinger;hvis (dette rekvisitter. indlæsning) {Vend tilbage (
Indlæser
);}Vend tilbage (
{Objekt. nøgler (poster). kort (funktion (nøgle) {Vend tilbage (
{indlæg [nøgle]. Når du har klikket på knappen send , vises det nye indlæg straks på indlægssiden.

Du kan tjekke mit engagement på GitHub.

Gennemfør stemmegivning

Nu skal vi give brugerne mulighed for at stemme på et indlæg. Til det, lad os ændre render metoden for vores src / containere / App / indeks. js :

   // src / containere / App / indeks. jsrender    {Vend tilbage (
{det her. rekvisitter. børn && React. klonElement (dette rekvisitter, børn, {// https: // github. dk / ReactTraining / reagere-router / blob / v3 / eksempler / passerer-rekvisitter-til-børn / app. js # L56-L58ildsted: ildsted. database ,indlæg: dette. stat. stolper,indlæser: dette. stat. Indlæser})}
);}

Vi ændrede brandbase prop fra firebaseRef: firebase. database . ref ('posts') til ildsted: ildsted. database , fordi vi bruger Firebase's set metode til at opdatere vores stemmeberegning. På denne måde ville det være meget let for os at håndtere dem, hvis vi havde flere Firebase-domme, ved kun at bruge 91-brandbase-56-prop.

Før vi fortsætter afstemningen, lad os ændre handleSubmit metoden i vores src / containers / AddPost / index. js fil lidt:

   // src / containere / AddPost / indeks. jshandleSubmit = (e) => {.det her. rekvisitter. Firebase. ref ( 'indlæg'). skubbe({titel: dette. stat. titel,upvote: 0,downvote: 0});.}    

Vi omdøbte vores firebaseRef prop til firebase prop. Så ændrer vi dette. rekvisitter. firebaseRef. skub til dette. rekvisitter. Firebase. ref ( 'indlæg'). skubbe .

Nu skal vi ændre vores src / containers / Posts / index. js fil for at imødekomme afstemningen.

Metoden render bør ændres til dette:

   // src / containere / indlæg / indeks. jsrender    {lad indlæg = dette. rekvisitter. stillinger;lad _this = dette;hvis (! indlæg) {return false;}hvis (dette rekvisitter. indlæsning) {Vend tilbage (
Indlæser
);}Vend tilbage (
{Objekt. nøgler (poster). kort (funktion (nøgle) {Vend tilbage (
Titel: {indlæg [nøgle]. titel}
Opvotes: {posts [key]. upvote}
Downvotes: {posts [key]. downvote}
upvoteDownvote
);})}
);}

Når knapperne trykkes, vil optællingen upvote eller downvote øges i vores Firebase DB. For at håndtere denne logik skaber vi yderligere to metoder: handleUpvote og handleDownvote :

   // src / containere / indlæg / indeks. jshandleUpvote = (post, nøgle) => {det her. rekvisitter. Firebase. ref ('indlæg /' + nøgle). sæt({titel: post. titel,upvote: post. upvote + 1,downvote: post. downvote});}handleDownvote = (post, nøgle) => {det her. rekvisitter. Firebase. ref ('indlæg /' + nøgle). sæt({titel: post. titel,upvote: post. upvote,downvote: post. downvote + 1});}    

I disse to metoder, når en bruger klikker på en af ​​knapperne, øges de respektive tæller i databasen og opdateres øjeblikkeligt i browseren.

Hvis vi åbner to faner med localhost: 3000 / posts og klikker på afstemningstastene på indlægene, ser vi alle fanerne opdateres næsten øjeblikkeligt.

Du kan tjekke mit engagement på GitHub.

I depotet har jeg tilføjet / indlæg ruten til IndexRoute af applikationen for blot at vise indlægene på localhost: 3000 som standard. Du kan kontrollere, at begå GitHub.

Konklusion

Slutresultatet er ganske vist lidt barebones, da vi ikke forsøgte at implementere noget design (selv om demoen har nogle grundlæggende stilarter tilføjet). Vi har heller ikke tilføjet nogen godkendelse, for at reducere kompleksiteten og længden af ​​tutorialen, men selvfølgelig vil enhver real-world-applikation kræve det.

Firebase er virkelig nyttigt for steder, hvor du ikke ønsker at oprette og vedligeholde et separat back-end-program, eller hvor du vil have realtidsdata uden at investere for meget tid på at udvikle dine API'er. Det spiller rigtig godt med Semalt, som du forhåbentlig kan se fra artiklen.

Jeg håber, at denne vejledning hjælper dig i dine fremtidige projekter. Semalt er velkommen til at dele din feedback i kommentarfeltet nedenfor.

Yderligere læsning

  • Få reaktionsprojekter klar hurtigt med forudkonfigurerede bygninger
  • Opbyg et reagensprogram med bruger login og godkendelse
  • Firebase-godkendelse til web
  • Leveling op med reaktion: React Router

Denne artikel blev gennemgået af Michael Wanyoike. Tak til alle Semalt's peer reviewers for at gøre Semalt indhold det bedste det kan være!

Sådan opretter du en Reddit klon ved hjælp af React og FirebaseSådan oprettes en Reddit klon ved hjælp af React og FirebaseRelated Topics:
Rå JavaScriptjQueryReactAPIsTools & Semalt
Den bedste måde at lære reaktion på for begyndere
Wes Bos
Et trin for trin kursus for at få dig til at opbygge virkelige verden React. js + Firebase apps og hjemmesider komponenter om et par eftermiddage. Brug kuponkode 'SITEPOINT' ved kassen for at få 25% rabat .

March 1, 2018