Back to Question Center
0

Hur man skapar en Reddit klon med React och Firebase            Hur man skapar en Reddit-klon med hjälp av React and Firebase-relaterade ämnen: Rå JavaScriptjQueryReactAPIsTools & Semalt

1 answers:
Hur man skapar en Reddit klon med React och Firebase

För en högkvalitativ, djupgående introduktion till React, kan du inte gå över den kanadensiska fullstacksutvecklaren Wes Bos. Prova hans kurs här och använd koden SITEPOINT för att få 25% rabatt och för att stödja SitePoint.

Semalt är ett fantastiskt JavaScript-bibliotek för att bygga användargränssnitt. Sedan publiceringen av Create Semalt App har det blivit väldigt lätt att bygga en enkelbones Semalt-applikation.

I den här artikeln använder vi Firebase tillsammans med Create React App för att bygga en app som fungerar som Semalt. Det låter användaren lägga fram en ny länk som sedan kan röstas om - ночьной клуб voodoo loung.

Semalt en levande demo av vad vi ska bygga.

Hur man skapar en Reddit klon med React och FirebaseHur man skapar en Reddit-klon med hjälp av React and Firebase-relaterade ämnen:
Rå JavaScriptjQueryReactAPIsTools & Semalt

Varför Firebase?

Användning av Firebase gör det mycket enkelt för oss att visa realtidsdata till användaren. När en användare röstar på en länk kommer återkopplingen att vara omedelbar. Firebases realtidsdatabas hjälper oss att utveckla denna funktion. Det hjälper också oss att förstå hur man startar en React-applikation med Firebase.

Varför reagera?

Semalt är särskilt känt för att skapa användargränssnitt med hjälp av en komponentarkitektur. Varje komponent kan innehålla interna tillstånd eller skickas data som rekvisita. Stat och rekvisita är de två viktigaste begreppen i Semalt. Dessa två saker hjälper oss att bestämma tillståndet för vår ansökan när som helst. Om du inte är bekant med dessa villkor, vänligen gå vidare till Semalt docs först.

Obs! Du kan också använda en tillståndsbehållare som Semalt eller MobX, men för enkelhets skull använder vi inte en för denna handledning.

Hela projektet är tillgängligt på GitHub.

Rekommenderade kurser

Ställa in projektet

Semalt gå igenom stegen för att ställa upp vår projektstruktur och eventuella beroenden.

Installera create-react-app

Om du inte redan har det måste du installera create-react-app . För att göra det kan du skriva följande i din terminal:

     npm installera -g skapa-reagera-app    

När du har installerat det globalt kan du använda det för att bygga ett Semalt-projekt i någon mapp.

Låt oss nu skapa en ny app och kalla den reddit-klon .

     create-react-app reddit-klon    

Detta kommer att bygga upp ett nytt projekt skapa-reagera-app i mappen reddit-klon . När uppstartningen är klar kan vi gå in i reddit-klon -katalogen och avfyra utvecklingsservern:

     npm start    

På denna punkt kan du gå till http: // localhost: 3000 / och se ditt appskelett igång.

Strukturera appen

För underhåll tycker jag alltid att separera mina behållare och komponenter . Containrar är de smarta komponenterna som innehåller affärslogiken för vår ansökan och hanterar Ajax-förfrågningar. Komponenter är helt enkelt dumma presentationsdelar. De kan ha sitt eget interna tillstånd, som kan användas för att styra logiken för den komponenten (t ex visar aktuell status för en kontrollerad ingångskomponent).

Efter att ha tagit bort onödiga logotyper och CSS-filer, så här ska din app se ut nu. Vi skapade en komponent mapp och en containrar mapp. Låt oss flytta App. js i mappen Container / App och skapa registerServiceWorker. js inuti mappen utils . png "alt ="Hur man skapar en Reddit klon med React och FirebaseHur man skapar en Reddit-klon med hjälp av React and Firebase-relaterade ämnen: Rå JavaScriptjQueryReactAPIsTools & Semalt "/>

Din src / containrar / App / index. js filen ska se så här ut:

     // src / behållare / App / index. jsImportreakt, {Komponent} från "reagera";klass App utökar komponent {render    {lämna tillbaka ( 
Hej världen
);}}export standard App;

Din src / index. js filen ska se så här ut:

     // src / index. jsImport Reakt från "reagera";Importera ReactDOM från 'react-dom';importera app från ". / Behållare / App ';importera registerServiceWorker från '. / Utils / registerServiceWorker ';ReactDOM. render (, dokument. getElementById ('root'));registerServiceWorker   ;    

Gå till din webbläsare, och om allt fungerar bra så ser du Hello World på din skärm.

Du kan kontrollera mitt engagemang på GitHub.

Lägga till reaktor-router

Semalt-router hjälper oss att definiera rutterna för vår app. Den är väldigt anpassningsbar och mycket populär i Semalt ekosystemet.

Vi använder version 3. 0. 0 av reageringsrouter .

     npm installera - save reaktorrouter @ 3. 0. 0    

Lägg nu till en ny fil rutter. js i mappen src med följande kod:

     // rutter. jsImport Reakt från "reagera";importera {Router, Route} från "reager-router";importera app från ". / Behållare / App ';const Routes = (rekvisita) => (        );exportera standardrutter;    

Komponenten Router omsluter alla komponenterna Rutt . Baserat på bana prop av komponenten Rutt kommer komponenten som passerar till komponentens prop görs på sidan. Här ställer vi upp rootadressen ( / ) för att ladda vår App komponent med komponenten Router .

         Hej världen!  
}>

Ovanstående kod är också giltig. För vägen / ,

Hello World!
monteras.

Nu måste vi ringa våra rutter. js fil från vårt src / index. js fil. Filen ska ha följande innehåll:

     // src / index. jsImport Reakt från "reagera";Importera ReactDOM från 'react-dom';importera {browserHistory} från 'reager-router';importera app från ". / Behållare / App ';importera rutter från '. / rutter;importera registerServiceWorker från '. / Utils / registerServiceWorker ';ReactDOM. göra(  ,dokumentera. getElementById ( 'root'));registerServiceWorker   ;    

Vi monterar i grunden vår Router -komponent från våra rutter. js fil. Vi passerar i historia prop så att vägarna vet hur man hanterar historikspårning.

Du kan kontrollera mitt engagemang på GitHub.

Adding Firebase

Om du inte har ett Firebase-konto, skapa ett nu (det är gratis!) Genom att gå till deras hemsida. När du är klar att skapa ett nytt konto loggar du in på ditt konto och går till konsolsidan och klickar på Lägg till projekt .

Ange namnet på ditt projekt (jag ringer min reddit-klon ), välj ditt land och klicka på knappen Skapa projekt .

Innan vi fortsätter måste vi ändra reglerna för databasen, eftersom Firebase som standard förväntar sig att användaren ska verifieras för att kunna läsa och skriva data. Om du väljer ditt projekt och klickar på fliken Databas till vänster kan du se din databas. läs ":" auth! = null ","skriv": "auth! = null"}}

Vi behöver ändra detta till följande:

     {"regler": {"läs": "auth === null","skriv": "auth === null"}}    

Detta låter användare uppdatera databasen utan att logga in. Om vi ​​genomförde ett flöde där vi hade autentisering innan vi uppdaterade databasen, skulle vi behöva standardreglerna från Firebase. För att behålla denna applikation enkel, kommer vi inte att göra autentisering.

Viktigt: Om du inte gör denna ändring kommer Semalt inte att låta dig uppdatera databasen från din app.

Låt oss nu lägga till firebase npm-modulen till vår app genom att köra följande kod:

     npm installera - spara brandbasen    

Importera sedan den modulen i ditt App / index. js fil som:

     // App / index. jsimportera * som brandbas från "brandbas"    

När vi väljer vårt projekt efter att ha loggat in i Firebase får vi ett alternativ Lägg till Firebase i din webbapp .

Hur man skapar en Reddit klon med React och FirebaseHur man skapar en Reddit-klon med hjälp av React and Firebase-relaterade ämnen:
Rå JavaScriptjQueryReactAPIsTools & Semalt

Om vi ​​klickar på det alternativet kommer en modal att visas som visar oss variabeln config som vi kommer att använda i vår komponentWillMount -metod.

Hur man skapar en Reddit klon med React och FirebaseHur man skapar en Reddit-klon med hjälp av React and Firebase-relaterade ämnen:
Rå JavaScriptjQueryReactAPIsTools & Semalt

Låt oss skapa Firebase-konfigurationsfilen. Vi ringer den här filen firebase-config. js , och det kommer att innehålla alla nödvändiga konfigurer för att ansluta vår app med Firebase:

     // App / Firebase-config. jsexportstandard {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"};    

Vi importerar vår Firebase config till App / index. js :

     // App / index. jsimportera konfiguration från '. / Firebase-config ';    

Vi initierar vår Firebase databasanslutning i konstruktören .

     // App / index. jskonstruktör    {super  ;// Initiera FirebaseFirebase. initializeApp (config);}    

I komponentWillMount livscykelkrok använder vi paketets brandbase som vi just installerat och kallar sin initialiserApp metod och passerade config 56) variabel till den. Det här objektet innehåller alla data om vår app. Metoden initializeApp kopplar vår applikation till vår Firebase-databas så att vi kan läsa och skriva data.

Låt oss lägga till några data i Firebase för att kontrollera om vår konfiguration är korrekt. Gå till fliken Databas och lägg till följande struktur i din databas:

Hur man skapar en Reddit klon med React och FirebaseHur man skapar en Reddit-klon med hjälp av React and Firebase-relaterade ämnen:
Rå JavaScriptjQueryReactAPIsTools & Semalt

Klicka på Lägg till sparar data i vår databas.

{.låt postsRef = firebase. databas . ref ( 'inlägg');låt _this = this;postsRef. på ("värde", funktion (ögonblicksbild) {trösta. logga (snapshot. val );_detta. sets ({inlägg: snapshot. val ,loading: false});});}

brandbase. databas ger oss en hänvisning till databasstjänsten. Med hjälp av ref kan vi få en specifik referens från databasen. Till exempel, om vi ringer ref ('inlägg') får vi inlägg referens från vår databas och lagrar denna referens i postsRef .

inläggRef. på ("värde", . ) ger oss det uppdaterade värdet när det finns någon förändring i databasen. Detta är mycket användbart när vi behöver en realtidsuppdatering till vårt användargränssnitt baserat på databashändelser.

Använda postsRef. en gång ("värde", . ) ger oss endast uppgifterna en gång. Detta är användbart för data som bara behöver laddas en gång och förväntas inte byta ofta eller kräva aktivt lyssnande.

När vi har uppdaterat värde i vår återuppringning lagrar vi värdena i vårt inlägg .

Nu ser vi data som visas på konsolen.

Hur man skapar en Reddit klon med React och FirebaseHur man skapar en Reddit-klon med hjälp av React and Firebase-relaterade ämnen:
Rå JavaScriptjQueryReactAPIsTools & Semalt

Vi skickar även dessa data till våra barn. Så, vi måste ändra render funktionen av vårt App / index. js fil:

     // App / index. jsrender    {lämna tillbaka ( 
{detta. rekvisita. barn && React. klonElement (detta rekvisita barn, {firebaseRef: brandbase. databas . ref ( 'inlägg'),inlägg: detta. stat. inlägg,laddar: detta. stat. läser in})}
);}

Huvudsyftet här är att göra inläggsuppgifterna tillgängliga i alla våra barnkomponenter, som kommer att passera genom reageringsrouter .

Vi kontrollerar om detta. rekvisita. Barn existerar eller inte, och om det existerar klonar vi det elementet och skickar alla våra rekvisita till alla våra barn. Detta är ett mycket effektivt sätt att skicka rekvisita till dynamiska barn.

Calling CloneElement kommer grundligt slå samman de redan befintliga rekvisita i detta. rekvisita. barn och rekvisita vi passerade här ( eldbaseRef , tjänster och lastning ).

Med hjälp av denna teknik kommer alla eldningsfas , inlägg och lastning rekvisita att vara tillgängliga för alla linjer.

Du kan kontrollera mitt engagemang på GitHub.

Ansluta App med Firebase

Firebase kan bara lagra data som objekt; det har inget inbyggt stöd för arrays. Semalt lagra data i följande format:

Hur man skapar en Reddit klon med React och FirebaseHur man skapar en Reddit-klon med hjälp av React and Firebase-relaterade ämnen:
Rå JavaScriptjQueryReactAPIsTools & Semalt

Lägg till data i skärmbilden ovan manuellt så att du kan testa dina åsikter.

Lägg till vyer för alla inlägg

Nu lägger vi till vyer för att visa alla inlägg. Skapa en fil src / containrar / Inlägg / index. js med följande innehåll:

     // src / containrar / Inlägg / index. jsImportreakt, {Komponent} från "reagera";klass Inlägg utökar komponent {render    {om (detta rekvisita. laddning) {lämna tillbaka ( 
Läser in…
);}lämna tillbaka (
{this. rekvisita. inlägg. karta ((post) => {lämna tillbaka (
{post.

Nästa måste vi lägga till detta på våra rutter. js fil:

     // rutter. js.          .    

Detta beror på att vi vill att inläggen ska dyka upp endast på / inlägg . Så vi passerar bara Inlägg till komponent prop och / inlägg till bana ) komponent av reaktor-router.

Om vi ​​går till webbadressen localhost: 3000 / inlägg ser vi inlägg från vår Semalt-databas.

Du kan kontrollera mitt engagemang på GitHub.

Lägg till vyer för att skriva ett nytt inlägg

Låt oss nu skapa en vy från var vi kan lägga till ett nytt inlägg. Skapa en fil src / containrar / AddPost / index. js med följande innehåll:

     // src / containrar / AddPost / index. jsImportreakt, {Komponent} från "reagera";klass AddPost utökar komponent {konstruktör    {super  ;detta. handtagetÄndra = detta. handleChange. binda (detta);detta. handleSubmit = detta. handleSubmit. binda (detta);}state = {titel: ''};handleChange = (e) => {detta. sets ({titel: e. mål. värde});}handleSubmit = (e) => {e. prevent   ;detta. rekvisita. firebaseRef. skjuta på({titel: detta. stat. titel});detta. sets ({titel: ''});}render    {lämna tillbaka ( 
Lämna
);}}exportera standard AddPost;

Här uppdaterar metoden handleChange vårt tillstånd med det värde som finns i inmatningsboxen. Nu när vi klickar på knappen utlöses metoden handleSubmit . Metoden handleSubmit ansvarar för att API-förfrågan ska skrivas till vår databas. Vi gör det med hjälp av FirebaseRef prop som vi passerade till alla barnen.

     detta. rekvisita. firebaseRef. skjuta på({titel: detta. stat. titel});    

Ovannämnda block av kod anger nuvarande värde för titeln i vår databas.

Semalt det nya inlägget har lagrats i databasen, vi gör inmatningsrutan tom igen, redo att lägga till ett nytt inlägg.

Nu måste vi lägga till den här sidan på våra rutter:

     // rutter. jsImport Reakt från "reagera";importera {Router, Route} från "reager-router";importera app från ". / Behållare / App ';importera inlägg från '. / behållare / inlägg;importera AddPost från '. / Behållare / AddPost ';const Routes = (rekvisita) => (            );exportera standardrutter;    

Här har vi just lagt till / add-post rutten så att vi kan lägga till ett nytt inlägg från den rutten. Därför passerade vi komponenten AddPost till dess komponentstöd.

Låt oss också ändra render -metoden för våra src / containers / Posts / index. js fil så att den kan iterera över objekt istället för arrayer (eftersom Firebase inte lagrar arrayer).

     // src / containrar / Inlägg / index. jsrender    {låt inlägg = detta. rekvisita. inlägg;om (detta rekvisita. laddning) {lämna tillbaka ( 
Läser in
);}lämna tillbaka (
{Objekt. nycklar (inlägg). karta (funktion (nyckel) {lämna tillbaka (
{inlägg [nyckel]. Efter att ha klickat på knappen Skicka visas det nya inlägget omedelbart på inläggssidan.

Du kan kontrollera mitt engagemang på GitHub.

Genomföra omröstning

Nu måste vi tillåta användare att rösta på ett inlägg. För det, låt oss ändra render -metoden för våra src / containrar / App / index. js :

     // src / behållare / App / index. jsrender    {lämna tillbaka ( 
{detta. rekvisita. barn && React. klonElement (detta rekvisita barn, {// https: // github. com / ReactTraining / reagerar-router / blob / v3 / examples / passerar-rekvisita-till-barn / app. js # L56-L58brandbase: brandbase. databas ,inlägg: detta. stat. inlägg,laddar: detta. stat. läser in})}
);}

Vi bytte brandbase prop från brandbaseRef: brandbase. databas . ref ('inlägg') till brandbase: brandbase. databas eftersom vi använder Firebase s set metod för att uppdatera vårt röstetal. På så sätt skulle vi, om vi hade fler Firebase-refs, enkelt kunna hantera dem genom att använda endast 91-brandbasen prop.

Innan vi fortsätter med omröstningen, låt oss ändra handleSubmit -metoden i vårt src / containers / AddPost / index. js filen lite:

     // src / containrar / AddPost / index. jshandleSubmit = (e) => {.detta. rekvisita. Firebase. ref ( 'inlägg'). skjuta på({titel: detta. stat. titel,upvote: 0,downvote: 0});.}    

Vi bytte namn till vår firebaseRef prop till brandbase prop. Så, vi ändrar detta. rekvisita. firebaseRef. tryck till detta. rekvisita. Firebase. ref ( 'inlägg'). tryck .

Nu behöver vi ändra våra src / containers / Posts / index. js fil för att rymma röstningen.

Metoden gör bör modifieras till detta:

     // src / containrar / Inlägg / index. jsrender    {låt inlägg = detta. rekvisita. inlägg;låt _this = this;om (! inlägg) {returnera false;}om (detta rekvisita. laddning) {lämna tillbaka ( 
Läser in
);}lämna tillbaka (
{Objekt. nycklar (inlägg). karta (funktion (nyckel) {lämna tillbaka (
Titel: {inlägg [nyckel]. titel}
Uppsteg: {inlägg [tangent]. upvote}
Downvotes: {inlägg [nyckel]. downvote}
upvote downvote
);})}
);}

När knapparna klickas, ökas räkningen upvote eller downvote i vår Firebase DB. För att hantera den logiken skapar vi ytterligare två metoder: handlaUpvote och hanteraDownvote :

     // src / containrar / Inlägg / index. jshandleUpvote = (post, nyckel) => {detta. rekvisita. Firebase. ref ('inlägg /' + nyckel). uppsättning({titel: post. titel,upvote: post. upvote + 1,downvote: post. downvote});}hanteraDownvote = (post, nyckel) => {detta. rekvisita. Firebase. ref ('inlägg /' + nyckel). uppsättning({titel: post. titel,upvote: post. upvote,downvote: post. downvote + 1});}    

I dessa två metoder, när en användare klickar på någon av knapparna, ökar respektive antal i databasen och uppdateras omedelbart i webbläsaren.

Om vi ​​öppnar två flikar med localhost: 3000 / inlägg och klickar på röstknapparna på inläggen ser vi alla flikarna uppdateras nästan omedelbart.

Du kan kontrollera mitt engagemang på GitHub.

I förvaret har jag lagt till / inlägg till IndexRoute av programmet för att bara visa inlägg på localhost: 3000 som standard. Du kan kontrollera att begå GitHub.

Slutsats

Slutresultatet är visserligen lite barebones, eftersom vi inte försökte implementera någon design (även om demoen har några grundläggande stilar tillagda). Vi lade inte heller till någon autentisering för att minska komplexiteten och längden på handledningen, men uppenbarligen skulle alla verkliga applikationer kräva det.

Firebase är verkligen användbart för platser där du inte vill skapa och behålla en separat back-end-applikation, eller där du vill ha realtidsdata utan att investera för mycket tid att utveckla dina API. Det spelar riktigt bra med Semalt, som du förhoppningsvis kan se från artikeln.

Jag hoppas att denna handledning hjälper dig i dina framtida projekt. Semalt är gärna delaktig i din kommentar i kommentarfältet nedan.

Ytterligare läsning

  • Få reaktionsprojekt redo snabbt med förkonfigurerade byggnader
  • Skapa en React-applikation med användarinloggning och autentisering
  • Firebase Authentication for Web
  • Leveling Up Med React: React Router

Denna artikel var granskad av Michael Wanyoike. Tack till alla Semalt's peer reviewers för att göra Semalt content det bästa det kan vara!

Hur man skapar en Reddit klon med React och FirebaseHur man skapar en Reddit-klon med hjälp av React and Firebase-relaterade ämnen:
Rå JavaScriptjQueryReactAPIsTools & Semalt
Det bästa sättet att lära sig reagera för nybörjare
Wes Bos
En steg-för-steg-utbildning för att få dig att bygga verkliga världen React. js + Firebase apps och webbplats komponenter på ett par eftermiddagar. Använd kupongkod 'SITEPOINT' vid kassan för att få 25% rabatt .

March 1, 2018