Back to Question Center
0

Hoe maak je een Reddit-kloon met behulp van React en Firebase            Een kloon Reddit maken met behulp van React en Firebase-gerelateerde onderwerpen: Raw JavaScriptjQueryReactAPIsTools & Semalt

1 answers:
Hoe maak je een Reddit-kloon aan met React en Firebase

Voor een hoogwaardige, grondige kennismaking met React, kun je niet voorbij de Canadese full-stack-ontwikkelaar Wes Bos gaan. Probeer zijn cursus hier, en gebruik de code SITEPOINT om 25% korting te krijgen en om SitePoint te helpen ondersteunen.

Semalt is een geweldige JavaScript-bibliotheek voor het bouwen van gebruikersinterfaces - oculos ray ban aviador rosa. Sinds de publicatie van de Create Semalt-app is het heel eenvoudig geworden om een ​​barebones-applicatie van Semalt in de steigers te zetten.

In dit artikel gebruiken we Firebase samen met de app Create React om een ​​app te maken die vergelijkbaar is met die van Semalt. Hiermee kan de gebruiker een nieuwe link indienen waarop vervolgens kan worden gestemd.

Semalt een live demo van wat we gaan bouwen.

Hoe maak je een Reddit-kloon met behulp van React en FirebaseEen kloon Reddit maken met behulp van React en Firebase-gerelateerde onderwerpen:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Waarom Firebase?

Het gebruik van Firebase zal het voor ons heel gemakkelijk maken om real-time gegevens aan de gebruiker te tonen. Zodra een gebruiker op een link stemt, wordt de feedback onmiddellijk weergegeven. De Realtime Database van Firebase helpt ons bij het ontwikkelen van deze functie. Het zal ons ook helpen om te begrijpen hoe een React-applicatie met Firebase te booten.

Waarom reageren?

Semalt is vooral bekend voor het creëren van gebruikersinterfaces met behulp van een componentenarchitectuur. Elke component kan interne status bevatten of gegevens worden doorgegeven als rekwisieten. Staat en rekwisieten zijn de twee belangrijkste concepten in Semalt. Deze twee dingen helpen ons op elk moment de staat van onze toepassing te bepalen. Als u niet bekend bent met deze voorwaarden, gaat u eerst naar de documenten van Semalt.

Opmerking: u kunt ook een statuscontainer zoals Semalt of MobX gebruiken, maar omwille van de eenvoud zullen we er geen gebruiken voor deze zelfstudie.

Het hele project is beschikbaar op GitHub.

Aanbevolen cursussen

Opzetten van het project

Semalt loopt door de stappen om onze projectstructuur en eventuele noodzakelijke afhankelijkheden in te stellen.

De create-react-app installeren

Als je dat nog niet hebt gedaan, moet je create-react-app installeren. Hiertoe typt u het volgende in uw terminal:

     npm install -g create-react-app    

Als je het eenmaal wereldwijd hebt geïnstalleerd, kun je het gebruiken om een ​​Semalt-project binnen elke map te scaffold.

Laten we nu een nieuwe app maken en deze reddit-clone noemen.

     create-react-app reddit-kloon    

Hiermee wordt een nieuw create-react-app project in de reddit-clone -map geplaatst. Nadat het bootstrappen is voltooid, kunnen we naar de directory reddit-clone gaan en de ontwikkelserver activeren:

     start van npm    

Op dit punt kun je naar http: // localhost: 3000 / gaan en je app-skelet zien functioneren.

De app structureren

Voor onderhoud houd ik er altijd van om mijn containers en componenten te scheiden. Containers zijn de slimme componenten die de bedrijfslogica van onze applicatie bevatten en de Ajax-verzoeken beheren. Componenten zijn gewoon dom presenterende componenten. Ze kunnen hun eigen interne status hebben, die kan worden gebruikt om de logica van die component te besturen (bijvoorbeeld het tonen van de huidige toestand van een bestuurd invoercomponent).

Nadat u de onnodige logo- en CSS-bestanden hebt verwijderd, moet uw app er nu uit zien. We hebben een map componenten en een map containers gemaakt. Laten we gaan App. js in de map containers / App en maak registerServiceWorker aan. js in de map utils . png "alt ="Hoe maak je een Reddit-kloon met behulp van React en FirebaseEen kloon Reddit maken met behulp van React en Firebase-gerelateerde onderwerpen: Raw JavaScriptjQueryReactAPIsTools & Semalt "/>

Uw src / containers / App / index. Het bestand js zou er als volgt uit moeten zien:

     // src / containers / App / index. jsimport Reageren, {Component} uit 'reageren';class-app breidt component {render    {terugkeer ( 
Hallo Wereld
);}}standaard app exporteren;

Uw src / index. Het bestand js zou er als volgt uit moeten zien:

     // src / index. jsimport Reageren van 'reageren';import ReactDOM van 'react-dom';importeer de app van '. / Containers / App ';import registerServiceWorker from '. / Utils / registerServiceWorker ';ReactDOM. render (, document. getElementById ('root'));registerServiceWorker   ;    

Ga naar uw browser, en als alles goed werkt, zult u Hallo wereld op uw scherm verschijnen.

Je kunt mijn commit checken op GitHub.

Reactrouter toevoegen

Semalt-router helpt ons bij het definiëren van de routes voor onze app. Het is zeer aanpasbaar en erg populair in het ecosysteem van Semalt.

We zullen versie 3. 0. 0 van react-router gebruiken.

     npm install - bewaar router-router 3. 0. 0    

Voeg nu een nieuw bestand routes toe. js in de map src met de volgende code:

     // routes. jsimport Reageren van 'reageren';invoer {Router, Route} van 'react-router';importeer de app van '. / Containers / App ';const Routes = (rekwisieten) => (        );export standaard Routes;    

De component Router verpakt alle Route -componenten. Op basis van de pad -prop van de component Route , wordt de component die wordt doorgegeven aan de component weergegeven op de pagina. Hier stellen we de root-URL ( / ) in om onze App -component te laden met behulp van de component Router .

         Hallo wereld!  
}>

De bovenstaande code is ook geldig. Voor het pad / , de

Hallo wereld!
wordt gemount.

Nu moeten we onze routes noemen. js bestand van onze src / index. js bestand. Het bestand moet de volgende inhoud hebben:

     // src / index. jsimport Reageren van 'reageren';import ReactDOM van 'react-dom';import {browserHistory} van 'react-router';importeer de app van '. / Containers / App ';Routes importeren uit '. / Routes;import registerServiceWorker from '. / Utils / registerServiceWorker ';ReactDOM. maken (  ,document. getElementById ( 'root'));registerServiceWorker   ;    

In principe monteren we onze router component van onze routes. js bestand. We geven de history -propage door, zodat de routes weten hoe met history tracking moet worden omgegaan.

Je kunt mijn commit checken op GitHub.

Firebase toevoegen

Als u nog geen Firebase-account hebt, kunt u er nu een maken (het is gratis!) Door naar hun website te gaan. Nadat u klaar bent met het maken van een nieuw account, meldt u zich aan bij uw account en gaat u naar de console-pagina en klikt u op Project toevoegen .

Voer de naam van uw project in (ik zal de mijne reddit-clone noemen), kies uw land en klik op de knop Create project .

Voordat we verder gaan, moeten we de regels voor de database wijzigen, omdat Firebase standaard verwacht dat de gebruiker wordt geverifieerd om gegevens te kunnen lezen en schrijven. Als u uw project selecteert en op het tabblad Database aan de linkerkant klikt, kunt u uw database bekijken. lees ":" auth! = null ",". write": "auth! = null"}}

We moeten dit als volgt wijzigen:

     {"reglement": {". lees": "auth === null",". write": "auth === null"}}    

Hierdoor kunnen gebruikers de database bijwerken zonder zich aan te melden. Als we een stroom hebben geïmplementeerd waarin we authenticatie hadden voordat we de database vernieuwden, zouden we de standaardregels van Firebase nodig hebben. Om deze applicatie eenvoudig te houden, zullen we niet authenticatie uitvoeren.

Belangrijk: als je deze wijziging niet aanbrengt, laat Semalt je de database niet bijwerken vanuit je app.

Laten we nu de firebase npm-module toevoegen aan onze app door de volgende code uit te voeren:

     npm installeren - brandbasis opslaan    

Importeer vervolgens die module in uw App / index. js bestand als:

     // App / index. jsimporteer * als firebase van "firebase";    

Wanneer we ons project selecteren nadat we ons hebben aangemeld bij Firebase, krijgen we een optie Firebase aan uw web-app toevoegen .

Hoe maak je een Reddit-kloon met behulp van React en FirebaseEen kloon Reddit maken met behulp van React en Firebase-gerelateerde onderwerpen:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Als we op die optie klikken, verschijnt er een modaal die ons de config -variabele laat zien die we zullen gebruiken in onze component WillMount -methode.

Hoe maak je een Reddit-kloon met behulp van React en FirebaseEen kloon Reddit maken met behulp van React en Firebase-gerelateerde onderwerpen:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Laten we het Firebase-configuratiebestand maken. We noemen dit bestand firebase-config. js , en deze bevat alle configs die nodig zijn om onze app te verbinden met Firebase:

     // App / firebase-config. jsstandaard export {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"};    

We zullen onze Firebase-configuratie importeren in App / index. js :

     // App / index. jsimportconfiguratie van '. / Firebase-config ';    

We initialiseren onze Firebase-databaseverbinding in de constructor .

     // App / index. jsconstructor    {super  ;// Initialiseer Firebasefirebase. initializeApp (config);}    

In de componentWillMount levenscyclushaak gebruiken we de package firebase die we zojuist hebben geïnstalleerd en noemen we de initializeApp -methode en hebben we de config doorgegeven variabel. Dit object bevat alle gegevens over onze app. De initializeApp -methode verbindt onze applicatie met onze Firebase-database, zodat we gegevens kunnen lezen en schrijven.

Laten we wat gegevens toevoegen aan Firebase om te controleren of onze configuratie correct is. Ga naar het tabblad Database en voeg de volgende structuur toe aan uw database:

Hoe maak je een Reddit-kloon met behulp van React en FirebaseEen kloon Reddit maken met behulp van React en Firebase-gerelateerde onderwerpen:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Door te klikken op Add worden de gegevens in onze database opgeslagen.

{.laat postsRef = firebase. databank . ref ( 'posts');laat _this = dit;postsRef. on ('waarde', functie (momentopname) {troosten. log (snapshot. val );_deze. setstate ({berichten: snapshot. val ,laden: false});});}

firebase. database geeft ons een verwijzing naar de databaseservice. Met behulp van ref kunnen we een specifieke referentie van de database krijgen. Als we bijvoorbeeld ref ('posts') aanroepen, krijgen we de referentie posts uit onze database en bewaren we die referentie in postsRef .

postsRef. on ('value', . ) geeft ons de bijgewerkte waarde wanneer er een wijziging in de database is. Dit is erg handig wanneer we een real-time update van onze gebruikersinterface nodig hebben op basis van database-events.

Gebruik van berichten Ref. een keer ('waarde', . ) geeft ons slechts eenmaal de gegevens. Dit is handig voor gegevens die slechts één keer hoeven te worden geladen en waarvan niet wordt verwacht dat ze vaak veranderen of dat er actief moet worden geluisterd.

Nadat we de bijgewerkte waarde hebben gekregen in onze op callback, slaan we de waarden op in onze staat .

Nu zien we de gegevens verschijnen op onze console.

Hoe maak je een Reddit-kloon met behulp van React en FirebaseEen kloon Reddit maken met behulp van React en Firebase-gerelateerde onderwerpen:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Ook zullen we deze gegevens doorgeven aan onze kinderen. We moeten dus de functie render van onze app / index wijzigen. js bestand:

     // App / index. jsrender    {terugkeer ( 
{deze. rekwisieten. kinderen && Reageren. cloneElement (this. props. children, {firebaseRef: firebase. databank . ref ( 'posts'),berichten: dit. staat. posten,laden: dit. staat. bezig met laden})}
);}

Het belangrijkste doel hier is om de berichtengegevens beschikbaar te maken in al onze kindercomponenten, die zullen worden doorgegeven react-router .

We controleren dit . rekwisieten. kinderen bestaan ​​of niet, en als het bestaat, klonen we dat element en geven al onze rekwisieten door aan al onze kinderen. Dit is een zeer efficiënte manier om rekwisieten door te geven aan dynamische kinderen.

Het klonen van klonen zal de al bestaande rekwisieten in ondiep samenvoegen. rekwisieten. kinderen en de props die we hier passeerden ( firebaseRef , posts en loading ).

Met deze techniek zullen de firebaseRef , berichten en laden rekwisieten beschikbaar zijn voor alle routes.

Je kunt mijn commit checken op GitHub.

Verbinden van de app met Firebase

Firebase kan alleen gegevens opslaan als objecten; het heeft geen native ondersteuning voor arrays. Semalt slaat de gegevens op in de volgende indeling:

Hoe maak je een Reddit-kloon met behulp van React en FirebaseEen kloon Reddit maken met behulp van React en Firebase-gerelateerde onderwerpen:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Voeg de gegevens in de bovenstaande schermafbeelding handmatig toe, zodat u uw weergaven kunt testen.

Weergaven toevoegen voor alle berichten

Nu zullen we weergaven toevoegen om alle berichten te tonen. Maak een bestand src / containers / Posts / index. js met de volgende inhoud:

     // src / containers / berichten / index. jsimport Reageren, {Component} uit 'reageren';class Posts verlengt Component {render    {if (this. props. loading) {terugkeer ( 
Bezig met laden…
);}terugkeer (
{ deze. rekwisieten. berichten. kaart ((plaatsen) => {terugkeer (
{bericht.

Vervolgens moeten we dit toevoegen aan onze routes. js bestand:

     // routes. js.          .    

Dit komt omdat we willen dat de berichten alleen op de route / posts verschijnen. Dus we geven gewoon de Posts component door aan de component prop en / posts aan de pad prop van de Route component van react-router.

Als we naar de URL localhost: 3000 / posts gaan, zien we de berichten uit onze Semalt-database.

Je kunt mijn commit checken op GitHub.

Weergaven toevoegen om een ​​nieuw bericht te schrijven

Laten we nu een weergave maken van waaruit we een nieuw bericht kunnen toevoegen. Maak een bestand src / containers / AddPost / index. js met de volgende inhoud:

     // src / containers / AddPost / index. jsimport Reageren, {Component} uit 'reageren';class AddPost breidt Component {constructor    {super  ;deze. handleChange = this. handleChange. binden (de);deze. handleSubmit = dit. handleSubmit. binden (de);}staat = {titel: ''};handleChange = (e) => {deze. setstate ({titel: e. doelwit. waarde});}handleSubmit = (e) => {e. voorkom standaard  ;deze. rekwisieten. firebaseRef. Duwen({titel: dit. staat. titel});deze. setstate ({titel: ''});}render    {terugkeer ( 
voorleggen
);}}export standaard AddPost;

Hier update de methode handleChange onze status met de waarde die aanwezig is in het invoervak. Nu, wanneer we op de knop klikken, wordt de handleSubmit -methode geactiveerd. De handleSubmit -methode is verantwoordelijk voor het maken van het API-verzoek om naar onze database te schrijven. We doen het met behulp van de firebaseRef -prop die we aan alle kinderen hebben doorgegeven.

     dit. rekwisieten. firebaseRef. Duwen({titel: dit. staat. titel});    

Het bovenstaande codeblok stelt de huidige waarde van de titel in voor onze database.

Semalt het nieuwe bericht is opgeslagen in de database, we maken het invoervak ​​weer leeg, klaar om een ​​nieuw bericht toe te voegen.

Nu moeten we deze pagina toevoegen aan onze routes:

     // routes. jsimport Reageren van 'reageren';invoer {Router, Route} van 'react-router';importeer de app van '. / Containers / App ';importeer berichten van '. / Containers / berichten;importeer AddPost van '. / Containers / AddPost;const Routes = (rekwisieten) => (            );export standaard Routes;    

Hier hebben we zojuist de / add-post -route toegevoegd, zodat we een nieuwe post van die route kunnen toevoegen. Daarom hebben we de component AddPost doorgegeven aan de componentprop.

Laten we ook de methode render van onze src / containers / Posts / index wijzigen. js bestand, zodat het objecten kan herhalen in plaats van arrays (omdat Firebase geen arrays opslaat).

     // src / containers / berichten / index. jsrender    {laat berichten = dit. rekwisieten. posten;if (this. props. loading) {terugkeer ( 
Bezig met laden
);}terugkeer (
{ Voorwerp. toetsen (berichten). kaart (functie (sleutel) {terugkeer ( {posts [key]. Nadat u op de knop submit hebt geklikt, wordt het nieuwe bericht onmiddellijk op de berichtenpagina weergegeven.

Je kunt mijn commit checken op GitHub.

Stemming bij implementeren

Nu moeten we gebruikers toestaan ​​te stemmen over een bericht. Laten we daarvoor de methode render van onze src / containers / App / index wijzigen. js :

     // src / containers / App / index. jsrender    {terugkeer ( 
{deze. rekwisieten. kinderen && Reageren. cloneElement (this. props. children, {// https: // github. com / ReactTraining / reactie-router / blob / v3 / examples / na-props naar kinderen / app. js # L56-L58firebase: firebase. databank ,berichten: dit. staat. posten,laden: dit. staat. bezig met laden})}
);}

We hebben de firebase -prop gewijzigd van firebaseRef: firebase. databank . ref ('posts') tot firebase: firebase. database omdat we de Firebase's set -methode zullen gebruiken om ons aantal stemmen bij te werken. Als we op deze manier meer Firebase-referenties hadden, zou het voor ons heel gemakkelijk zijn om ze te hanteren door alleen de firebase -prop te gebruiken.

Laten we, voordat we gaan stemmen, de methode handleSubmit wijzigen in onze src / containers / AddPost / index. js bestand een beetje:

     // src / containers / AddPost / index. jshandleSubmit = (e) => {.deze. rekwisieten. firebase. ref ( 'posts'). Duwen({titel: dit. staat. titel,upvote: 0,downvote: 0});.}    

We hernoemde onze firebaseRef prop to firebase -prop. Dus, we veranderen de dit. rekwisieten. firebaseRef. druk op dit. rekwisieten. firebase. ref ( 'posts'). druk .

Nu moeten we onze src / containers / Posts / index aanpassen. js bestand om te stemmen.

De render -methode moet hiertoe worden aangepast:

     // src / containers / berichten / index. jsrender    {laat berichten = dit. rekwisieten. posten;laat _this = dit;if (! posts) {return false;}if (this. props. loading) {terugkeer ( 
Bezig met laden
);}terugkeer (
{ Voorwerp. toetsen (berichten). kaart (functie (sleutel) {terugkeer (
Titel: {posts [key]. titel}
Upvotes: {posts [key]. upvote}
Downvotes: {posts [key]. downvote}
upvote downvote
);})}
);}

Wanneer op de knoppen wordt geklikt, wordt het upvote of downvote aantal verhoogd in onze Firebase DB. Om die logica aan te pakken, maken we nog twee methoden: handleUpvote en handleDownvote :

     // src / containers / berichten / index. jshandleUpvote = (post, sleutel) => {deze. rekwisieten. firebase. ref ('posts /' + key). set ({titel: bericht. titel,upvote: plaatsen. upvote + 1,downvote: plaatsen. downvote});}handleDownvote = (post, sleutel) => {deze. rekwisieten. firebase. ref ('posts /' + key). set ({titel: bericht. titel,upvote: plaatsen. upvote,downvote: plaatsen. downvote + 1});}    

Bij deze twee methoden wordt telkens wanneer een gebruiker op een van de knoppen klikt, het respectieve aantal opgehoogd in de database en onmiddellijk in de browser bijgewerkt.

Als we twee tabbladen openen met localhost: 3000 / posts en op de stemknoppen van de berichten klikken, zien we dat elk van de tabbladen vrijwel onmiddellijk wordt bijgewerkt.

Je kunt mijn commit checken op GitHub.

In de repository heb ik de / posts -route toegevoegd aan de IndexRoute van de applicatie om standaard de posts op localhost: 3000 te tonen. Je kunt die commit controleren op GitHub.

Conclusie

Het eindresultaat is weliswaar een beetje barebones, omdat we geen ontwerp probeerden te implementeren (hoewel de demo enkele basistypen heeft toegevoegd). We hebben ook geen authenticatie toegevoegd om de complexiteit en de lengte van de tutorial te verminderen, maar uiteraard zou elke toepassing in de echte wereld dit vereisen.

Firebase is erg handig voor plaatsen waar u geen aparte back-endapplicatie wilt maken en onderhouden, of waar u realtime gegevens wilt hebben zonder te veel tijd te investeren in het ontwikkelen van uw API's. Het speelt heel goed met Semalt, zoals je hopelijk kunt zien aan de hand van het artikel.

Ik hoop dat deze tutorial je helpt bij je toekomstige projecten. Neem gerust contact met ons op in de comments hieronder.

Aanvullende literatuur

  • React-projecten snel gereed krijgen met vooraf geconfigureerde builds
  • Bouw een reactietoepassing met gebruikersaanmelding en verificatie
  • Firebase-verificatie voor internet
  • Nivellering naar boven: React Router

Dit artikel werd beoordeeld door Michael Wanyoike. Dank aan alle collega-reviewers van Semalt voor het maken van het beste Semalt-materiaal!

Hoe maak je een Reddit-kloon met behulp van React en FirebaseEen kloon Reddit maken met behulp van React en Firebase-gerelateerde onderwerpen:
Raw JavaScriptjQueryReactAPIsTools & Semalt
De beste manier om te leren Reageren voor beginners
Wes Bos
Een stapsgewijze training om ervoor te zorgen dat u echte React bouwt. js + Firebase-apps en website-componenten in een paar middagen. Gebruik kortingscode 'SITEPOINT' bij het afrekenen om 25% korting te krijgen.

March 1, 2018