Back to Question Center
0

Jak vytvořit klon Reddit pomocí React a Firebase            Jak vytvořit reddit klon pomocí React a FirebaseRelated Témata: Raw JavaScriptjQueryReactAPIsTools & Semalt

1 answers:
Jak vytvořit reddit klon pomocí React a Firebase

Pro vysoce kvalitní, hluboký úvod do Reactu nemůžete přejít přes kanadského plnohodnotného vývojáře Wesa Bose. Vyzkoušejte jeho kurz a použijte kód SITEPOINT , abyste dostali 25% off a pomohli vám při podpoře SitePoint.

Semalt je úžasná knihovna jazyka JavaScript pro vytváření uživatelských rozhraní. Od publikování aplikace Vytvoření Semaltu bylo velmi snadné vyladit barevné šablony Semalt.

V tomto článku budeme používat Firebase společně s aplikací Create React, abychom vytvořili aplikaci, která bude fungovat podobně jako Semalt. Umožní uživateli předložit nový odkaz, o němž bude možno hlasovat - ipcc4 clearomizer tanks.

Semalt živé demo o tom, co budeme budovat.

Jak vytvořit klon Reddit pomocí React a FirebaseJak vytvořit reddit klon pomocí React a FirebaseRelated Témata:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Proč Firebase?

Používání aplikace Firebase nám ukáže, že je pro nás velmi snadné zobrazit uživateli údaje v reálném čase. Jakmile uživatel hlasuje o odkazu, zpětná vazba bude okamžitá. Databáze Firebase Realtime nám pomůže při vývoji této funkce. Také nám to pomůže pochopit, jak spustit aplikaci React s Firebase.

Proč reagovat?

Semalt je obzvláště známý pro vytváření uživatelských rozhraní pomocí architektury komponent. Každá součást může obsahovat interní stav nebo předávat data jako rekvizity. Stát a rekvizity jsou dva nejdůležitější pojmy v Semaltu. Tyto dvě věci nám pomáhají kdykoli určit stav naší aplikace. Pokud nejste obeznámeni s těmito termíny, nejprve se přesvědčte k dokumentům Semalt.

Poznámka: můžete použít i státní kontejner jako Semalt nebo MobX, ale z důvodu jednoduchosti nebudeme pro tento výukový program používat jeden.

Celý projekt je k dispozici na GitHubu.

Doporučené kurzy

Nastavení projektu

Semalt prochází kroky pro nastavení naší struktury projektu a všech potřebných závislostí.

Instalace aplikace create-react-app

Pokud jste tak ještě neučinili, musíte nainstalovat create-react-app . Chcete-li tak učinit, můžete do terminálu zadat následující:

     npm instalace -g create-react-app    

Jakmile ji nainstalujete globálně, můžete jej použít pro lešení projektu Semalt v každé složce.

Nyní vytvoříme novou aplikaci a zavoláme ji reddit-clone .

     create-react-app reddit-clone    

Tím se vytvoří nový projekt create-react-app uvnitř složky reddit-clone . Po dokončení bootstrapingu můžeme jít dovnitř adresář reddit-clone a spustit vývojový server:

     npm start    

V této chvíli můžete přejít na http: // localhost: 3000 / a podívat se na skeletu vaší aplikace.

Strukturování aplikace

Pro údržbu jsem vždycky chtěl oddělit své kontejnery a komponenty . Kontejnery jsou inteligentní komponenty, které obsahují obchodní logiku naší aplikace a spravují požadavky společnosti Ajax. Komponenty jsou prostě hloupé prezentační komponenty. Mohou mít svůj vlastní vnitřní stav, který může být použit pro ovládání logiky této komponenty (např. Zobrazující aktuální stav řízené vstupní komponenty).

Po odstranění nepotřebného loga a souborů CSS je třeba, aby vaše aplikace vypadala nyní. Vytvořili jsme složku komponent a složku kontejnerů . Pohybujeme se . js uvnitř složky kontejnerů / App a vytvořte registerServiceWorker. js uvnitř složky utils . png "alt ="Jak vytvořit klon Reddit pomocí React a FirebaseJak vytvořit reddit klon pomocí React a FirebaseRelated Témata: Raw JavaScriptjQueryReactAPIsTools & Semalt "/>

Váš src / containers / App / index. js by měl vypadat takto:

   // src / kontejnery / App / index. jsimport React, {Component} z 'react';třída App rozšiřuje složku {poskytnout   {vrátit se (
Ahoj světe
);}}}}export výchozí aplikace;

Váš src / index. js by měl vypadat takto:

   // src / index. jsimport Reagovat od 'reagovat';import ReactDOM z "reaction-dom";importovat aplikaci z '. / kontejnery / App ';import registerServiceWorker od '. / utils / registerServiceWorker ';ReactDOM. render (, dokument getElementById ('root'));registerServiceWorker   ;    

Jděte do prohlížeče a pokud vše funguje dobře, uvidíte Hello World na obrazovce.

Můľete zkontrolovat, ľe jsem se zavázal, ľe GitHub.

Přidání reakčního směrovače

Semanutér nám pomůže definovat trasy naší aplikace. Je to velmi přizpůsobitelné a velmi populární v Semaltovém ekosystému.

Budeme používat verzi 3. 0. 0 reaktorového směrovače .

     npm install - uložit reaktor-router @ 3. 0. 0    

Nyní přidejte nový soubor trasy. js uvnitř složky src s následujícím kódem:

   // trasy. jsimport Reagovat od 'reagovat';import {Router, Route} z "reaktor-router";importovat aplikaci z '. / kontejnery / App ';konst Routes = (props) => ();export výchozí trasy;    

Součást Router obaluje všechny komponenty Route . Na základce dráhy části traťové součásti bude na stránce vykreslen komponenta převedená na podložku . Zde nastavujeme kořenovou adresu URL ( / ) a načteme komponentu App pomocí komponentu Router .

    Ahoj svět!  
}>

Výše ​​uvedený kód je rovněž platný. Pro cestu / ,

Hello World!
.

Nyní musíme zavolat na naše trasy. js z našeho src / indexu. js . Soubor by měl obsahovat následující obsah:

   // src / index. jsimport Reagovat od 'reagovat';import ReactDOM z "reaction-dom";import {browserHistory} z "reaktor-router";importovat aplikaci z '. / kontejnery / App ';importovat trasy z '. / trasy ";import registerServiceWorker od '. / utils / registerServiceWorker ';ReactDOM. poskytnout(,dokument. getElementById ('root'));registerServiceWorker   ;    

V podstatě upevňujeme naši komponentu Router z našich tras. js . Procházíme v něm historie , takže trasy vědí, jak zvládnout sledování historie.

Můľete zkontrolovat moľnost potvrzení na GitHub.

Přidání Firebase

Pokud nemáte účet Firebase, vytvořte si ho nyní (je to zdarma!) Na webových stránkách. Po dokončení vytvoření nového účtu se přihlaste k účtu a přejděte na stránku konzoly a klikněte na tlačítko Přidat projekt .

Zadejte název projektu (zavolám na můj reddit-clone ), vyberte svou zemi a klikněte na tlačítko Vytvořit projekt .

Nyní předtím než budeme pokračovat, musíme změnit pravidla pro databázi, protože Firebase předpokládá, že uživatel bude automaticky ověřen, aby mohl číst a zapisovat data. Pokud vyberete svůj projekt a kliknete na záložku Databáze vlevo, budete moci zobrazit svou databázi. číst ":" auth! = null ","psát": "auth! = null"}}}}

Musíme toto změnit na následující:

   {"pravidla": {"číst": "auth === null","psát": "auth === null"}}}}    

Umožní to uživatelům aktualizovat databázi bez přihlášení. Pokud jsme implementovali tok, ve kterém jsme měli ověření před provedením aktualizací v databázi, budeme potřebovat výchozí pravidla poskytovaná Firebase. Aby tato aplikace byla jednoduchá, my neprovedeme ověřování.

Důležité: Pokud tuto změnu neučiníte, Semalt vám nedovolí aktualizovat databázi z vaší aplikace.

Nyní přidejte modul firebase npm do naší aplikace spuštěním následujícího kódu:

     npm install - uložit firebase    

Dále importujte tento modul do aplikace App / index. js soubor jako:

   // App / index. jsimport * jako firebase z "firebase";    

Když si po přihlášení do Firebase vybereme náš projekt, získáme možnost Přidání Firebase do vaší webové aplikace .

Jak vytvořit klon Reddit pomocí React a FirebaseJak vytvořit reddit klon pomocí React a FirebaseRelated Témata:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Pokud klikneme na tuto možnost, objeví se modál, který nám ukáže proměnnou config , kterou použijeme v metodě componentWillMount .

Jak vytvořit klon Reddit pomocí React a FirebaseJak vytvořit reddit klon pomocí React a FirebaseRelated Témata:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Vytvořme konfigurační soubor Firebase. Označíme tento soubor firebase-config. js a bude obsahovat všechny konfigurace nezbytné k připojení naší aplikace s 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",úložištěBucket: "reddit-clone-53da5. appspot.com",messagingSenderId: "490290211297"};    

Importujeme Firebase config do App / index. js :

   // App / index. jsimport config z '. / firebase-config ";    

Inicializujeme spojení Firebase databáze v konstruktoru .

   // App / index. jskonstruktor    {super   ;// Inicializovat Firebasefirebase. inicializeApp (config);}}    

V háčku životního cyklu komponentyWillMount používáme balíček firebase , který jsme právě nainstalovali, a zavoláme metodu initializeApp 56). Tento objekt obsahuje veškerá data o naší aplikaci. Metoda initializeApp připojí naši aplikaci do naší databáze Firebase, abychom mohli číst a zapisovat data.

Přidejte do Firebase některé údaje, abyste zkontrolovali, zda je správná konfigurace. Přejděte na kartu Databáze a přidejte do databáze následující strukturu:

Jak vytvořit klon Reddit pomocí React a FirebaseJak vytvořit reddit klon pomocí React a FirebaseRelated Témata:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Kliknutím na Přidat data uložíme do databáze.

{.let postsRef = firebase. databáze . ref ("příspěvky");let _this = toto;postsRef. on ('hodnota', funkce (snímek) {utěšit. log (snapshot.val );_tento. setState ({příspěvky: snímek. val ,načítání: false});});}}

ohnivá báze. databáze nám poskytuje odkaz na databázovou službu. Pomocí ref můžeme získat konkrétní odkaz z databáze. Pokud například zavoláme ref ('posts') , získáme odkaz z příspěvků z naší databáze a uložíme tento odkaz do postsRef .

příspěvkůRef. na ('hodnota', . ) nám dává aktualizovanou hodnotu vždy, když dojde k nějaké změně v databázi. To je velmi užitečné, když potřebujeme aktualizaci našeho uživatelského rozhraní v reálném čase na základě libovolných databázových událostí.

Použití příspěvkůRef. jednou ("hodnota", . ) nám údaje poskytneme pouze jednou. To je užitečné pro data, která je třeba načíst pouze jednou a neočekává se, že se budou často měnit nebo vyžadovat aktivní poslech.

Po získání aktualizované hodnoty v našem zpětném volání na uložíme hodnoty do stavu příspěvků .

Nyní se zobrazí data, která se objevují na naší konzoli.

Jak vytvořit klon Reddit pomocí React a FirebaseJak vytvořit reddit klon pomocí React a FirebaseRelated Témata:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Také tyto údaje předáme našim dětem. Takže je třeba upravit funkci render našeho App / indexu. js soubor:

   // App / index. jsposkytnout   {vrátit se (
{tento. rekvizity. děti && React. cloneElement (tohle rekvizity děti, {firebaseRef: firebase. databáze . ref ('příspěvky'),příspěvky: toto. Stát. příspěvky,loading: toto. Stát. načítání}}}
);}}

Hlavním cílem je zpřístupnit údaje o příspěvcích ve všech našich dětských součástech, které budou předány prostřednictvím reaktorového směrovače .

Kontrolujeme, zda to je. rekvizity. děti existují nebo ne, a pokud existuje, klonujeme tento prvek a předáme všechny naše rekvizity všem našim dětem. Jedná se o velmi účinný způsob předávání rekvizit dynamickým dětem.

Volání cloneElement bude plynulé sloučení již existujících rekvizit v to. rekvizity. děti a podpěry, které jsme zde prošli firebaseRef , sloupky a zatížení ).

Pomocí této techniky budou k dispozici všechny firebaseRef , sloupky a nakládací podpěry.

Můľete zkontrolovat moľnost potvrzení na GitHub.

Připojení aplikace s Firebase

Firebase může ukládat data pouze jako objekty; nemá žádnou přirozenou podporu pro pole. Semalt uchovává data v následujícím formátu:

Jak vytvořit klon Reddit pomocí React a FirebaseJak vytvořit reddit klon pomocí React a FirebaseRelated Témata:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Přidejte data na obrazovce nad ručně, abyste mohli vyzkoušet své pohledy.

Přidat pohledy na všechny příspěvky

Nyní přidáme pohledy pro zobrazení všech příspěvků. Vytvořte soubor src / containers / Posts / index. js s následujícím obsahem:

   // src / kontejnery / příspěvky / index. jsimport React, {Component} z 'react';class Příspěvky rozšiřuje složku {poskytnout   {pokud (toto je podpora pro nahrávání) {vrátit se (
Načítání…
);}}vrátit se (
{ tento. rekvizity. příspěvků. mapa ((post) => {vrátit se (
{ pošta.

Potřebujeme je přidat k našim trasám. js soubor:

   // trasy. js..    

Je to proto, že chceme, aby se příspěvky zobrazovaly pouze na trase / příspěvky . Takže jsme procházeli komponentu sloupků na podložku a / sloupky na trajektorii ) komponent reaktoru směrovače.

Pokud se dostaneme na adresu URL localhost: 3000 / posts, uvidíme příspěvky z naší databáze Semalt.

Můľete zkontrolovat moľnost potvrzení na GitHub.

Přidat pohledy napsat nový příspěvek

Nyní vytvoříme pohled, odkud můžeme přidat nový příspěvek. Vytvořte soubor src / containers / AddPost / index. js s následujícím obsahem:

   // src / kontejnery / AddPost / index. jsimport React, {Component} z 'react';třída AddPost rozšiřuje složku {konstruktor    {super   ;tento. handleChange = toto. handleChange. vázat (toto);tento. handleSubmit = toto. handleSubmit. vázat (toto);}}state = {název: ''};handleChange = (e) => {tento. setState ({název: e. cílová. hodnota});}}handleSubmit = (e) => {E. preventDefault   ;tento. rekvizity. firebaseRef. TAM({název: toto. Stát. titul});tento. setState ({název: ''});}}poskytnout   {vrátit se (
Předložit
);}}}}exportní výchozí AddPost;

Zde metodu handleChange aktualizujeme náš stav s hodnotou přítomnou ve vstupním poli. Nyní, když klikneme na tlačítko, spustí se metoda handSubmit . Metoda handleSubmit je zodpovědná za to, že požadavek API zapsat do naší databáze. Děláme to pomocí firebaseRef , který jsme předali všem dětem.

   toto. rekvizity. firebaseRef. TAM({název: toto. Stát. titul});    

Výše ​​uvedený blok kódu nastavuje aktuální hodnotu titulu do naší databáze.

Semalt nový příspěvek byl uložen v databázi, znovu vyplníme vstupní políčko a je připraveno přidat nový příspěvek.

Nyní musíme tuto stránku přidat na naše trasy:

   // trasy. jsimport Reagovat od 'reagovat';import {Router, Route} z "reaktor-router";importovat aplikaci z '. / kontejnery / App ';import příspěvků z '. / kontejnery / sloupky ";importPostPost od '. / kontejnery / AddPost ";konst Routes = (props) => ();export výchozí trasy;    

Zde jsme přidali trasu / add-post , abychom z této trasy mohli přidat nový příspěvek. Proto jsme prošli složkou AddPost na její součástku.

Také upravíme metodu render našich src / containers / Posts / index. js tak, aby mohl iterovat přes objekty namísto matic (protože Firebase neukládá pole).

   // src / kontejnery / příspěvky / index. jsposkytnout   {nechte příspěvky = toto. rekvizity. příspěvky;pokud (toto je podpora pro nahrávání) {vrátit se (
Načítání
);}}vrátit se (
{Object. klíče (příspěvky). mapa (funkce (klíč) {vrátit se (
{posts [key]. Po kliknutí na tlačítko Odeslat se nový příspěvek objeví ihned na stránce příspěvků.

Můľete zkontrolovat moľnost potvrzení na GitHub.

Provést hlasování

Nyní musíme umožnit uživatelům hlasovat o postu. Za tímto účelem upravíme metodu render v našich src / containers / App / index. js :

   // src / kontejnery / App / index. jsposkytnout   {vrátit se (
{tento. rekvizity. děti && React. cloneElement (tohle rekvizity děti, {// https: // github. com / ReactTraining / reaktor-router / blob / v3 / příklady / průchod-rekvizity-pro-děti / app. js # L56-L58firebase: firebase. databáze ,příspěvky: toto. Stát. příspěvky,loading: toto. Stát. načítání}}}
);}}

Změnili jsme opasek z firebaseRef: firebase. databáze . ref ('posts') firebase: firebase. database , protože použijeme metodu Firebase set k aktualizaci našeho počtu hlasů. Tímto způsobem, pokud bychom měli více Firebase refs, bylo by pro nás velmi snadné zvládnout je pouze pomocí (94) opěradla .

Před pokračováním v hlasování upravíme metodu handleSubmit v našem src / containers / AddPost / indexu. js soubor trochu:

   // src / kontejnery / AddPost / index. jshandleSubmit = (e) => {.tento. rekvizity. firebase. ref ('posts'). TAM({název: toto. Stát. titul,upvote: 0,downvote: 0});.}}    

Přejmenovali jsme náš firebaseRef propojku na firebase prop. Takže to měníme . rekvizity. firebaseRef. zatlačte na . rekvizity. firebase. ref ('posts'). .

Nyní musíme upravit src / containers / Posts / index. js , aby vyhovoval hlasování.

Metoda render by měla být upravena takto:

   // src / kontejnery / příspěvky / index. jsposkytnout   {nechte příspěvky = toto. rekvizity. příspěvky;let _this = toto;pokud (! posts) {vrátit falešně;}}pokud (toto je podpora pro nahrávání) {vrátit se (
Načítání
);}}vrátit se (
{Object. klíče (příspěvky). mapa (funkce (klíč) {vrátit se (
Název: {posts [key]. titul}
Upotávky: {posts [key]. upvote}
Zrušené hlasy: {posts [key]. downvote}
UpvoteDolů
);}}}
);}}

Po kliknutí na tlačítka se zvýší počet upvote nebo downvote v Firebase DB. Abychom tuto logiku zvládli, vytvoříme další dvě metody: handleUpvote a handleDownvote

   // src / kontejnery / příspěvky / index. jshandleUpvote = (příspěvek, klíč) => {tento. rekvizity. firebase. ref ('příspěvky /' + klíč). soubor({název: příspěvek. titul,upvote: post. upvote + 1,downvote: post. downvote});}}handleDownvote = (příspěvek, klíč) => {tento. rekvizity. firebase. ref ('příspěvky /' + klíč). soubor({název: příspěvek. titul,upvote: post. upvote,downvote: post. downvote + 1});}}    

Při těchto dvou metodách, kdykoli uživatel klepne na některá z tlačítek, příslušný počet se zvýší v databázi a v prohlížeči se okamžitě aktualizuje.

Pokud otevříme dvě záložky s localhost: 3000 / posts a klikneme na hlasovací tlačítka příspěvků, uvidíme, že každá karta se aktualizuje téměř okamžitě.

Můľete zkontrolovat moľnost potvrzení na GitHub.

V úložišti jsem přidal / posts cestu k indexovému adresáři aplikace pouze proto, aby ve výchozím nastavení zobrazoval příspěvky na localhost: 3000. Můžete ověřit, že jste na GitHub prověřili.

Závěr

Konečný výsledek je určitě trochu barebones, protože jsme se nepokusili implementovat jakýkoli design (ačkoli demo má některé základní styly přidané). Také jsme nepřidali žádnou autentizaci, aby se snížila složitost a délka tutoriálu, ale zřejmě by to vyžadovalo nějaká reálná aplikace.

Firebase je opravdu užitečná pro místa, kde nechcete vytvářet a udržovat samostatnou back-end aplikaci nebo kde chcete data v reálném čase, aniž byste investovali příliš mnoho času do rozvíjení API. S Semaltem se hraje opravdu dobře, jak můžete z tohoto článku vidět.

Doufám, že tento tutoriál vám pomůže při vašich budoucích projektech. Semalt můžete v sekci Komentáře níže sdílet své připomínky.

Další informace

  • Rychlé reakce na projekty s předkonfigurovanými sestavami
  • Vytvoření aplikace React s přihlášením a ověřením uživatelů
  • Ověřování Firebase pro web
  • Vyrovnání s React: React Router

Tento článek byl recenzován společností Michael Wanyoike. Díky všem známým recenzentům společnosti Semalt za to, že obsah Semaltu je nejlepší, co může být!

Jak vytvořit klon Reddit pomocí React a FirebaseJak vytvořit reddit klon pomocí React a FirebaseRelated Témata:
Raw JavaScriptjQueryReactAPIsTools & Semalt
Nejlepší způsob, jak se naučit reagovat pro začátečníky
Wes Bos
Podrobný tréninkový kurz, který vám umožní vytvořit realitu React. js + aplikace Firebase a komponenty webových stránek za pár odpoledne. Použijte kód kupónu 'SITEPOINT' při pokladně, abyste dostali 25% slevu .

March 1, 2018