Back to Question Center
0

Kuinka luoda Reddit-klooni käyttämällä React- ja Firebase-toimintoja            Kuinka luoda Reddit-klooni React- ja Firebase-sovellusten avulla Aiheet: Raaka JavaScriptjQueryReactAPIsTools & Semalt

1 answers:
Miten luodaan reddit-klooni käyttämällä React ja Firebase

Reactin laadukkaan ja syvällisen käyttöönoton lisäksi et voi ohittaa kanadalaista täyspinoa kehittäjä Wes Bosia. Kokeile kurssia täällä ja käytä koodia SITEPOINT saadaksesi 25% pois ja avustamaan SitePointia.

Semalt on mahtava JavaScript-kirjasto käyttäjien käyttöliittymien rakentamiseen. Creative Semalt Appin julkaisemisen jälkeen on tullut erittäin helppokäyttöinen paljastamatonta Semalt-sovellusta - indemnity long term care policy.

Tässä artikkelissa käytämme Firebasea yhdessä Create React Appin kanssa rakentaaksemme sovelluksen, joka toimii samanlaisena kuin Semalt. Sen avulla käyttäjä voi lähettää uuden linkin, jota sitten voidaan äänestää.

Mielenosoittaa elävä demo siitä, mitä me rakennamme.

Kuinka luoda Reddit-klooni käyttämällä React- ja Firebase-toimintojaKuinka luoda Reddit-klooni React- ja Firebase-sovellusten avulla Aiheet:
Raaka JavaScriptjQueryReactAPIsTools & Semalt

Miksi Firebase?

Firebase-sovelluksen avulla voimme helposti näyttää reaaliaikaisia ​​tietoja käyttäjälle. Kun käyttäjä äänestää linkissä, palaute on hetkellinen. Firebase's Realtime Database auttaa meitä kehittämään tätä ominaisuutta. Lisäksi se auttaa meitä ymmärtämään, kuinka käynnistää React-sovellus Firebase-järjestelmällä.

Miksi reagoida?

Semalt on erityisen tunnettu käyttöliittymien luomisesta komponenttiarkkitehtuurin avulla. Jokainen komponentti voi sisältää sisäisen tilan tai siirtää tietoja rekistereinä. Valtio ja rekvisiitta ovat Semaltin kaksi tärkeintä käsitystä. Nämä kaksi asiaa auttavat meitä määrittelemään hakemuksemme tilan missä tahansa vaiheessa. Jos et tunne näitä termejä, siirry ensin Semalt-dokumentteihin.

Huomaa: voit käyttää myös tilannetta kuten Semalt tai MobX, mutta yksinkertaisuuden vuoksi emme käytä tätä opetusohjelmaa varten.

Koko projekti on saatavana GitHubista.

Suositellut kurssit

Hankkeen perustaminen

Semalt kävelee läpi vaiheet rakentaaksemme projektirakenteen ja tarvittavat riippuvuudet.

Luo-reagoida -sovelluksen asentaminen

Jos et vielä ole, sinun on asennettava create-react-app . Voit tehdä tämän kirjoittamalla pääteesi seuraavasti:

     npm asenna -g create-react-app    

Kun olet asentanut sen maailmanlaajuisesti, voit käyttää sitä minkä tahansa kansion sisällä olevaan Semalt-projektiin.

Luo nyt uusi sovellus ja soita se reddit-klooni .

     luo-reagoida app reddit-klooni    

Tämä rakennuttaa uuden create-react-app -projektin reddit-klooni -kansion sisällä. Kun bootstrapping on tehty, voimme mennä sisälle reddit-klooni hakemistoon ja käynnistää kehityspalvelimen:

     npm aloittaa    

Tässä vaiheessa voit siirtyä osoitteeseen http: // localhost: 3000 / ja nähdä sovelluksesi luuranko käynnissä.

Sovelluksen jäsentäminen

Hoidosta haluan aina erottaa säiliöt ja komponentit . Kontit ovat älykkäitä komponentteja, jotka sisältävät sovelluksemme liiketoimintalogiikan ja hallinnoivat Ajax-pyyntöjä. Komponentit ovat yksinkertaisesti tyhmät esittelykomponentit. Niillä voi olla oma sisäinen tila, jota voidaan käyttää kyseisen komponentin logiikan ohjaamiseen (esim. Näytetään valvotun syöttökomponentin nykyinen tila).

Kun poistat tarpeettomat logot ja CSS-tiedostot, sovelluksesi on nyt tarkasteltava nyt. Luotiimme komponentti -kansion ja konttien kansion. Siirrytään App. js konttien / App -kansion sisällä ja luo registerServiceWorker. js utils -kansion sisällä. png "alt ="Kuinka luoda Reddit-klooni käyttämällä React- ja Firebase-toimintojaKuinka luoda Reddit-klooni React- ja Firebase-sovellusten avulla Aiheet: Raaka JavaScriptjQueryReactAPIsTools & Semalt "/>

Sinun src / containers / App / index. js -tiedoston pitäisi näyttää tältä:

   // src / kontit / sovellus / hakemisto. jstuonti Reagoi, {Komponentti} "reagoi";luokan App laajentaa komponentti {render    {palautus (
Hei maailma
);}}viedä oletusarvo App;

Sinun src / index. js -tiedoston pitäisi näyttää tältä:

   // src / index. jstuonti Reagoi "reagoi";tuoda ReactDOM: n "react-dom": sta;tuoda App from '. / Kontit / App ';import registerServiceWorker alkaen '. / Utils / registerServiceWorker ';ReactDOM. render (, dokumentti getElementById ('root'));registerServiceWorker   ;    

Siirry selaimeesi, ja jos kaikki toimii hyvin, näet Hello World näytölläsi.

Voit tarkistaa, että olen sitoutunut GitHubiin.

Reaktori-reitittimen lisääminen

Semalt-reititin auttaa meitä määrittämään reitit sovelluksillemme. Se on hyvin muokattavissa ja erittäin suosittu Semalt-ekosysteemissä.

Käytämme reaktori-reitittimen versiota 3. 0. 0 .

     npm asenna - sulkekaa reititin @ 3. 0. 0    

Lisää uusi tiedosto reittejä. js src kansion sisällä seuraavalla koodilla:

   // reitit. jstuonti Reagoi "reagoi";tuoda {reititin, reitti} reititysreitittimestä;tuoda App from '. / Kontit / App ';const Reitit = (rekvisiitta) => ();viedä oletusreitit;    

reititin osa käärii kaikki reitit komponentit. Reitti -komponentin reitti perustuen komponenttiin läpäisevä komponentti muodostuu sivulle. Tässä asetamme juuren URL-osoitteen ( / ) lataamaan App -komponentti käyttäen Router -komponenttia.

    Hello World!  
}>

Edellä oleva koodi on pätevä. Polulle / ,

Hello World!
asennetaan.

Nyt meidän täytyy soittaa reitteihimme. js tiedosto meidän src / indeksistä. js tiedosto. Tiedostosta pitäisi olla seuraava sisältö:

   // src / index. jstuonti Reagoi "reagoi";tuoda ReactDOM: n "react-dom": sta;tuoda {browserHistory} reagoivan reitittimen kautta;tuoda App from '. / Kontit / App ';tuonti reitit ". / Reittien;import registerServiceWorker alkaen '. / Utils / registerServiceWorker ';ReactDOM. tehdä (,asiakirja. getElementById ( 'root'));registerServiceWorker   ;    

Pohjimmiltaan asennamme reitittimesi osan reiteistämme. js tiedosto. Kuljetamme historiaan , jotta reitit osaavat käsitellä historianseurannan.

Voit tarkistaa, että olen sitoutunut GitHubiin.

Palokunnan lisääminen

Jos sinulla ei ole Firebase-tiliä, luo yksi nyt (se on ilmainen!) Menemällä heidän verkkosivuilleen. Kun olet luonut uuden tilin, kirjaudu sisään tilillesi ja siirry konsolin sivulle ja napsauta Lisää projekti .

Anna projektin nimi (soita minulle reddit-klooni ), valitse maa ja klikkaa Luo projekti -painiketta.

Nyt, ennen kuin jatkamme, meidän on muutettava tietokannasta sääntöjä , koska Firebase odottaa oletusarvoisesti, että käyttäjä pystyy lukemaan ja kirjoittamaan tietoja. Jos valitset projektin ja napsautat Tietokanta -välilehteä vasemmalla, näet tietokannasi. lukea ":" auth! = null ","write": "auth! = null"}}

Meidän on muutettava tämä seuraavaksi:

   {"säännöt": {"" luetaan ":" auth === null ","write": "auth === null"}}    

Tämän ansiosta käyttäjät voivat päivittää tietokantaa kirjautumatta sisään. Jos toteutimme virran, jossa meillä oli todennus ennen päivityksiä tietokantaan, tarvitsemme Firebasen antamat oletussäännöt. Jotta tämä sovellus olisi yksinkertainen, me ei tee todentamista.

Tärkeää: jos et tee tätä muutosta, Semalt ei anna sinun päivittää tietokantaa sovelluksestasi.

Lisää nyt firebase npm moduuli sovelluksemme suorittamalla seuraava koodi:

     npm asentaa - säilytä tulipalo    

Seuraavaksi tuodaan tuo moduuli App / indeksiin. js tiedosto:

   // App / index. jstuonti * palokuntana "palokasta";    

Kun valitsimme projektiamme Firebaseen kirjautumisen jälkeen, saat lisäasetuksen Lisää paloturva web-sovellukseen .

Kuinka luoda Reddit-klooni käyttämällä React- ja Firebase-toimintojaKuinka luoda Reddit-klooni React- ja Firebase-sovellusten avulla Aiheet:
Raaka JavaScriptjQueryReactAPIsTools & Semalt

Jos klikkaamme kyseistä vaihtoehtoa, ilmestyy modaali, joka näyttää meille config muuttujan, jota käytämme componentWillMount -menetelmässä.

Kuinka luoda Reddit-klooni käyttämällä React- ja Firebase-toimintojaKuinka luoda Reddit-klooni React- ja Firebase-sovellusten avulla Aiheet:
Raaka JavaScriptjQueryReactAPIsTools & Semalt

Luo Firebase-konfigurointitiedosto. Soitamme tämän tiedoston firebase-config. js , ja se sisältää kaikki asetukset, jotka tarvitaan liitettäväksi Firebase-sovelluksemme kanssa:

   // App / firebase-config. jsviedä oletus {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",viestinSenderId: "490290211297"};    

Tuomme Firebase-määrityksen App / index. js :

   // App / index. jstuo config osoitteesta '. / Firebase-config ';    

Alustamme Firebase-tietokantayhteytemme rakentajassa .

   // App / index. jskonstruktori    {Super   ;// Alusta FirebaseFirebase. initializeApp (config);}    
initializeApp -menetelmää ja läpäissyt config ( initializeApp -työkalun komponenttiWillMount 56). Tämä kohde sisältää kaikki sovelluksemme tiedot. initializeApp -menetelmä yhdistää hakemuksen Firebase-tietokantaan, jotta voimme lukea ja kirjoittaa tietoja.

Lisätään joitain tietoja Firebaseen tarkistamalla, onko kokoonpano oikea. Siirry Tietokanta -välilehdelle ja lisää seuraava rakenne tietokantaan:

Kuinka luoda Reddit-klooni käyttämällä React- ja Firebase-toimintojaKuinka luoda Reddit-klooni React- ja Firebase-sovellusten avulla Aiheet:
Raaka JavaScriptjQueryReactAPIsTools & Semalt

Napsauttamalla Lisää tallentaa tiedot tietokantaamme.

{.anna postsRef = palopää. tietokanta . viite ( 'viestit');anna _this = this;postsRef. (arvo), toiminto (snapshot) {konsoli. loki (snapshot. val );_Tämä. setState ({viestit: tilannekuva. val ,lataus: false});});}

tulipalo. tietokanta antaa meille viittauksen tietokantapalveluun. Käyttämällä ref , voimme saada tietyn viitteen tietokannasta. Esimerkiksi, jos soitat ref ('posts') , saamme viestiin viitetiedot tietokannastamme ja tallennamme viitteen postsRef .

virkaaVir. ("arvo", . ) antaa meille päivitetyn arvon aina kun tietokannassa on muutoksia. Tämä on erittäin hyödyllinen, kun tarvitsemme reaaliaikaisen päivityksen käyttöliittymäänmme minkä tahansa tietokannan tapahtumien perusteella.

Käyttäjä postsRef. kerran ("arvo", . ) antaa meille vain tiedot kerran. Tämä on hyödyllistä tietoja, jotka on ladattava vain kerran, eikä niiden odoteta muuttuvan usein tai vaativat aktiivista kuuntelua.

Kun saamme päivitetyn arvon on soittopyynnössä, tallennamme arvot virkaa .

Nyt näemme, että tiedot näkyvät konsolissamme.

Kuinka luoda Reddit-klooni käyttämällä React- ja Firebase-toimintojaKuinka luoda Reddit-klooni React- ja Firebase-sovellusten avulla Aiheet:
Raaka JavaScriptjQueryReactAPIsTools & Semalt

Lisäksi toimitamme nämä tiedot lapsillemme. Joten meidän täytyy muokata App / index render -toimintoa. js tiedosto:

   // App / index. jsrender    {palautus (
{Tämä. rekvisiitta. lapset & Reagoi. cloneElement (tämä rekisteri, lapset, {tulipaloRef: tulipalo. tietokanta . viite ( 'viestit'),virkaa: tämä. osavaltio. virkaa,lataus: tämä. osavaltio. Ladataan})}
);}

Tärkein tavoite on tehdä virkaa koskevista tiedoista kaikki lapsemme komponentit, jotka ohjataan reagoivan reitittimen läpi .

Tarkistamme, onko tämä . rekvisiitta. onko lapsille olemassa tai ei, ja jos se on olemassa, kloonataan tämä elementti ja siirretään kaikki tarpeemme kaikille lapsillemme. Tämä on erittäin tehokas tapa siirtää rekvisiitta dynaamisille lapsille.

Calling cloneElement liittää suppeasti jo olemassa olevat rekisteriin tässä. rekvisiitta. lapsille ja rekistereille, jotka kuljimme täällä ( firebaseRef , virkaa ja kuormitus ).

Tämän tekniikan avulla paloturbiini , virka ja kuormitus ovat kaikkien reittien käytettävissä.

Voit tarkistaa, että olen sitoutunut GitHubiin.

App-laitteen kytkeminen palopelillä

Palopää voi tallentaa tietoja vain esineinä; sillä ei ole mitään natiivia tuki ryhmille. Semalt tallentaa tiedot seuraavassa muodossa:

Kuinka luoda Reddit-klooni käyttämällä React- ja Firebase-toimintojaKuinka luoda Reddit-klooni React- ja Firebase-sovellusten avulla Aiheet:
Raaka JavaScriptjQueryReactAPIsTools & Semalt

Lisää kuvatiedoston yllä olevat tiedot manuaalisesti, jotta voit testata näkymiäsi.

Lisää näkymät kaikkiin viesteihin

Nyt lisäämme näkymiä näyttämään kaikki viestit. Luo tiedosto src / containers / Posts / index. js , jolla on seuraava sisältö:

   // src / containers / Posts / index. jstuonti Reagoi, {Komponentti} "reagoi";luokan Postit laajentaa komponentti {render    {jos (tämä. rekvisiitta lataus) {palautus (
Ladataan…
);}palautus (
{ Tämä. rekvisiitta. virkaa. kartta ((post) => {palautus (
{post.

Seuraavaksi meidän on lisättävä tämä meidän reitteille. js tiedosto:

   // reitit. js..    

Tämä johtuu siitä, että haluamme, että virat näkyvät vain reitillä / posts . Joten me vain kuljemme Viestit komponentti komponentti ja / pylväät reitin ) reaktori-reitittimen komponentti.

Jos siirrymme URL-osoitteeseen localhost: 3000 / posts, näemme viestit Semalt-tietokannastamme.

Voit tarkistaa, että olen sitoutunut GitHubiin.

Lisää katselua kirjoittamaan uusi viesti

Luo nyt kuva, josta voimme lisätä uuden viestin. Luo tiedosto src / containers / AddPost / index. js , jolla on seuraava sisältö:

   // src / kontit / AddPost / index. jstuonti Reagoi, {Komponentti} "reagoi";luokan AddPost laajentaa komponentti {konstruktori    {Super   ;Tämä. handleChange = tämä. handleChange. sitoa (tämä);Tämä. handleSubmit = tämä. handleSubmit. sitoa (tämä);}tila = {otsikko: ''};handleChange = (e) => {Tämä. setState ({otsikko: e. kohde. arvo});}handleSubmit = (e) => {e. preventDefault   ;Tämä. rekvisiitta. firebaseRef. työntää({otsikko: tämä. osavaltio. otsikko});Tämä. setState ({otsikko: ''});}render    {palautus (
<-painiketype = "lähetä"onClick = {tämä. handleSubmit}>Lähetä
);}}viedä default AddPost;

Tässä handleChange -menetelmä päivittää tilamme syöttöruutuun sisältyvällä arvolla. Nyt, kun napsautetaan painiketta, handleSubmit -menetelmä laukaistaan. handleSubmit -menetelmä on vastuussa siitä, että API-pyyntö kirjoitetaan tietokantaamme. Teemme sen käyttämällä firebaseRef prop, joka siirrettiin kaikille lapsille.

   tästä. rekvisiitta. firebaseRef. työntää({otsikko: tämä. osavaltio. otsikko});    

Edellä oleva koodilohko asettaa otsikon nykyisen arvon tietokantaamme.

Uusi viesti on talletettu tietokantaan. Tee syöttöruutu tyhjäksi, valmiina lisäämään uusi viesti.

Nyt meidän on lisättävä tämä sivu reitteihimme:

   // reitit. jstuonti Reagoi "reagoi";tuoda {reititin, reitti} reititysreitittimestä;tuoda App from '. / Kontit / App ';tuota viestejä ". / Kontit / Viestit;tuoda AddPost from '. / Kontit / AddPost ';const Reitit = (rekvisiitta) => ();viedä oletusreitit;    

Tässä vain lisäsimme reitin / add-post , jotta voimme lisätä uuden viestin kyseisestä reitistä. Tästä syystä läpäissyt AddPost -komponentin komponenttikantaan.

Muokkaa myös src / containers / Posts / index render -menetelmää. js -tiedostoa, jotta se voi iteroida objektit sijaan taulukot (koska Firebase ei tallenna taulukkoja).

   // src / containers / Posts / index. jsrender    {anna viestit = tämä. rekvisiitta. virkaa;jos (tämä. rekvisiitta lataus) {palautus (
Ladataan
);}palautus (
{Object. avaimet (viestit). kartta (toiminto (avain) {palautus (
{viestit [avain]. Kun napsautat -painiketta , uusi viesti tulee näkyviin välittömästi viestiin.

Voit tarkistaa, että olen sitoutunut GitHubiin.

Täytä äänestys

Nyt meidän on sallittava käyttäjien äänestää virkaa. Muuta siis src / containers / App / index render -menetelmää. js :

   // src / kontit / sovellus / hakemisto. jsrender    {palautus (
{Tämä. rekvisiitta. lapset & Reagoi. cloneElement (tämä rekisteri, lapset, {// https: // github. com / ReactTraining / reagoida-reititin / möykky / v3 / esimerkit / kulkevan-rekvisiitta-to-lapsia / app. js # L56-L58tulipalo: paloportaat. tietokanta ,virkaa: tämä. osavaltio. virkaa,lataus: tämä. osavaltio. Ladataan})}
);}

Muutimme paloportaan potin tulipaloiltaRef: tulipalo. tietokanta . ref ('posts') - tulipalo: tulipalo. tietokantaan , koska käytämme Firebase's set -menetelmää päivittämään äänestyslaskennamme. Tällä tavoin, jos meillä olisi enemmän Firebase-ohjeita, olisi helppo käsitellä niitä käyttämällä vain tulipaloa .

Tehdään ennen äänestyksen jatkamista handleSubmit -menetelmää src / containers / AddPost / -indeksissä. js tiedosto hieman:

   // src / kontit / AddPost / index. jshandleSubmit = (e) => {.Tämä. rekvisiitta. Firebase. viite ( 'viestiä'). työntää({otsikko: tämä. osavaltio. otsikko,upvote: 0,alasvetovalikko: 0});.}    

Nimitimme uudelleen nimikkeemme firebaseRef prop tulipalo prop. Joten, muutamme tätä. rekvisiitta. firebaseRef. paina - tätä. rekvisiitta. Firebase. viite ( 'viestiä'). paina .

Nyt meidän täytyy muokata src / containers / Posts / index. js tiedostoa äänestyksen järjestämiseksi.

Menetelmän renderointi olisi muutettava tähän:

   // src / containers / Posts / index. jsrender    {anna viestit = tämä. rekvisiitta. virkaa;anna _this = this;jos (! posts) {palaa vääräksi;}jos (tämä. rekvisiitta lataus) {palautus (
Ladataan
);}palautus (
{Object. avaimet (viestit). kartta (toiminto (avain) {palautus (
Otsikko: {posts [key]. otsikko}
Ennustukset: {viestit [avain]. upvote}
Alasvetot: {posts [key]. downvote}
<-painikeonClick = {_tämä. handleUpvote. sitoa (tämä, viestit [avain], avain)}type = "painiketta">upvote<-painikeonClick = {_tämä. handleDownvote. sitoa (tämä, viestit [avain], avain)}type = "painiketta">Downvote
);})}
);}

Kun nappia napsautetaan, alhaalta ylöspäin ylävirtaan tai laskevaa ääntä lisätään Firebase DB: ssä. Tämän logiikan käsittelemiseksi luodaan kaksi muuta menetelmää: handleUpvote ja handleDownvote :

   // src / containers / Posts / index. jshandleUpvote = (post, avain) => {Tämä. rekvisiitta. Firebase. ref ('posts /' + key). sarja({otsikko: postitse. otsikko,upvote: postitse. upvote + 1,alasävy: post. downvote});}handleDownvote = (post, avain) => {Tämä. rekvisiitta. Firebase. ref ('posts /' + key). sarja({otsikko: postitse. otsikko,upvote: postitse. upvote,alasävy: post. alasävy + 1});}    

Näissä kahdessa menetelmässä, milloin käyttäjä napsauttaa jompaakumpaa painikkeista, vastaava määrä kasvaa tietokannassa ja päivitetään välittömästi selaimessa.

Jos avaamme kaksi välilehteä, joissa on localhost: 3000 / posts ja klikkaa viestien äänestyspainikkeita, näet, että kukin välilehti päivittyy lähes välittömästi.

Voit tarkistaa, että olen sitoutunut GitHubiin.

Laskentaan olen lisännyt / posts reitin sovelluksen IndexRoute vain oletusarvoisesti näyttämään postshost: 3000. Voit tarkistaa, että olet sitoutunut GitHubiin.

Johtopäätös

Lopputulos on tosin hieman paljaat, koska emme yrittäneet toteuttaa mitään mallia (vaikka demosta on joitain perusstylejä lisätty). Emme myöskään lisättäneet todentamista, jotta opetusohjelman monimutkaisuus ja pituus voitaisiin pienentää, mutta ilmeisesti kaikki reaalimaailman sovellukset vaatisivat sitä.

Firebase on todella hyödyllinen paikoissa, joissa et halua luoda erillistä back-end-sovellusta tai ylläpidä sitä tai haluatko reaaliaikaista tietoa sijoittamatta liikaa aikaa sovellusliittymiesi kehittämiseen. Se toimii hyvin Semaltin kanssa, kuten toivottavasti näet artikkelista.

Toivottavasti tämä opetusohjelma auttaa sinua tulevissa projekteissasi. Semaltin on vapaa jakaa palautetta alla olevaan kommenttiin.

Lisähuone

  • Hankkeiden reagointi valmiiksi nopeasti valmiiksi määritetyillä rakennuksilla
  • Reagoi sovelluksen luominen käyttäjän kirjautumisella ja todentamisella
  • Firebase Authentication for Web
  • Tasaa ylös reaktilla: React reititin

Tätä artikkelia vertaistiin Michael Wanyoike. Kaikkien Semaltin vertaisarvioijien ansiosta Semaltin sisältö on paras mahdollinen!

Kuinka luoda Reddit-klooni käyttämällä React- ja Firebase-toimintojaKuinka luoda Reddit-klooni React- ja Firebase-sovellusten avulla Aiheet:
Raaka JavaScriptjQueryReactAPIsTools & Semalt
Paras tapa oppia reagoida aloittelijoille
Wes Bos
Vaiheittainen koulutus, jonka avulla voit rakentaa reaalimaailman React. js + Firebase-sovelluksia ja verkkosivuston osia pari iltapäivää. Käytä kuponkikoodia 'SITEPOINT' kassalla saadaksesi 25% .

March 1, 2018