Back to Question Center
0

Jak utworzyć klon Reddita za pomocą React i Firebase            Jak utworzyć klon Reddita za pomocą tematów React i FirebaseRelated: Surowe JavaScriptjQueryReactAPIsTools & Semalt

1 answers:
Jak stworzyć klon Reddita używając React i Firebase

Aby uzyskać wysokiej jakości, dogłębne wprowadzenie do React, nie można przejść obok kanadyjskiego producenta pełnych kominków Wesa Bosa. Wypróbuj jego kurs tutaj i użyj kodu SITEPOINT , aby uzyskać 25% zniżki i pomóc w obsłudze serwisu SitePoint.

Semalt jest świetną biblioteką JavaScript do budowania interfejsów użytkownika. Od czasu opublikowania aplikacji Create Semalt bardzo łatwo było stworzyć szkielet aplikacji Semalt.

W tym artykule użyjemy Firebase wraz z Create React App, aby zbudować aplikację, która będzie działać podobnie do Semalt. Pozwoli to użytkownikowi na przesłanie nowego linku, na którym można następnie głosować.

Zaprezentuj na żywo demo tego, co będziemy budować.

Jak utworzyć klon Reddita za pomocą React i FirebaseJak utworzyć klon Reddita za pomocą tematów React i FirebaseRelated:
Surowe JavaScriptjQueryReactAPIsTools i Semalt

Dlaczego Firebase?

Korzystanie z Firebase bardzo ułatwia nam wyświetlanie danych w czasie rzeczywistym dla użytkownika. Gdy użytkownik zagłosuje na link, informacja zwrotna będzie natychmiastowa. Baza danych czasu rzeczywistego Firebase pomoże nam w opracowaniu tej funkcji. Ponadto pomoże nam zrozumieć, jak załadować aplikację React w Firebase.

Dlaczego warto reagować?

Semalt jest szczególnie znany z tworzenia interfejsów użytkownika przy użyciu architektury komponentów. Każdy komponent może zawierać stan wewnętrzny lub przekazywać dane jako rekwizyty. Stan i rekwizyty to dwie najważniejsze koncepcje Semalala. Te dwie rzeczy pomagają nam określić stan naszej aplikacji w dowolnym momencie. Jeśli nie znasz tych terminów, najpierw udaj się do dokumentów Semalt.

Uwaga: można również użyć kontenera stanu, takiego jak Semalt lub MobX, ale dla uproszczenia nie użyjemy go w tym samouczku.

Cały projekt jest dostępny na GitHub.

Zalecane kursy

Przygotowanie projektu

Semalt podejmuje kroki w celu utworzenia naszej struktury projektu i wszelkich niezbędnych zależności.

Instalowanie aplikacji create-react

Jeśli jeszcze tego nie zrobiłeś, musisz zainstalować create-react-app . Aby to zrobić, możesz wpisać w terminalu:

     npm install -g create-react-app    

Po zainstalowaniu go globalnie można go użyć do przeniesienia projektu Semalt do dowolnego folderu.

Teraz stwórzmy nową aplikację i nazwijmy ją reddit-clone .

     create-react-app reddit-clone    

Spowoduje to przeniesienie nowego projektu create-response-app do folderu reddit-clone . Po zakończeniu ładowania, możemy przejść do katalogu reddit-clone wewnątrz i uruchomić serwer programistyczny:

     npm start    

W tym momencie możesz przejść do http: // localhost: 3000 / i zobaczyć swój szkielet aplikacji.

Struktura aplikacji

Do konserwacji zawsze lubię oddzielać moje pojemniki i części . Kontenery to inteligentne komponenty, które zawierają logikę biznesową naszej aplikacji i zarządzają żądaniami Ajax. Komponenty są po prostu głupimi składnikami prezentacji. Mogą one mieć swój własny stan wewnętrzny, który może być wykorzystany do sterowania logiką tego komponentu (na przykład pokazując bieżący stan kontrolowanego komponentu wejściowego).

Po usunięciu niepotrzebnych logo i plików CSS, tak powinna wyglądać teraz Twoja aplikacja. Stworzyliśmy folder komponentów i folder pojemniki . Przenieśmy aplikację. js wewnątrz folderu / aplikacji i utwórz registerServiceWorker. js wewnątrz folderu utils . png "alt ="Jak utworzyć klon Reddita za pomocą React i FirebaseJak utworzyć klon Reddita za pomocą tematów React i FirebaseRelated: Surowe JavaScriptjQueryReactAPIsTools i Semalt "/>

Twoje src / containers / App / index. Plik js powinien wyglądać tak:

     // src / containers / App / index. jsimportuj Reaguj, {Komponent} od "reaguj";klasa App rozszerza komponent {renderowanie   {powrót ( 
Witaj świecie
);}}eksportuj domyślną aplikację;

Twój src / index. Plik js powinien wyglądać tak:

     // src / index. jsimport Reaguj z "reaguj";importuj ReactDOM z "react-dom";importuj aplikację z ". / containers / App ";importuj registerServiceWorker z '. / utils / registerServiceWorker ";ReactDOM. render (, document. getElementById ('root'));registerServiceWorker   ;    

Przejdź do przeglądarki i jeśli wszystko działa poprawnie, zobaczysz Hello World na ekranie.

Możesz sprawdzić mój commit na GitHub.

Dodawanie routera reagowania

Semalt-router pomoże nam zdefiniować trasy naszej aplikacji. Jest bardzo konfigurowalny i bardzo popularny w ekosystemie Semalt.

Będziemy używać wersji 3. 0. 0 z reagującego routera .

     npm install - zapisz router reagujący @ 3. 0. 0    

Teraz dodaj nową ścieżkę pliku . js wewnątrz folderu src z następującym kodem:

     // trasy. jsimport Reaguj z "reaguj";zaimportuj {Router, Trasa} z "Reaktor-routera";importuj aplikację z ". / containers / App ";const Routes = (rekwizyty) => (        );eksportuj domyślne trasy;    

Składnik routera otacza wszystkie komponenty trasy . W oparciu o ścieżkę podpunktu Składnik trasy , komponent przekazany do komponentu będzie renderowany na stronie. Tutaj konfigurujemy główny adres URL ( / ), aby załadować nasz składnik aplikacji przy użyciu składnika routera .

       Hello World!  
}>

Powyższy kod jest również ważny. Ścieżka / ,

Hello World!
zostanie zamontowany.

Teraz musimy zadzwonić na nasze trasy. js plik z naszego src / index. plik js . Plik powinien mieć następującą treść:

     // src / index. jsimport Reaguj z "reaguj";importuj ReactDOM z "react-dom";importuj {browserHistory} z 'react-router';importuj aplikację z ". / containers / App ";importuj trasy z ". / routes ";importuj registerServiceWorker z '. / utils / registerServiceWorker ";ReactDOM. renderowanie(  ,dokument. getElementById ("root"));registerServiceWorker   ;    

Zasadniczo montujemy nasz składnik routera z naszych tras. plik js . Przechodzimy do podpory historii , aby trasy wiedziały, jak obsługiwać śledzenie historii.

Możesz sprawdzić mój commit na GitHub.

Dodawanie Firebase

Jeśli nie masz konta Firebase, utwórz je teraz (to nic nie kosztuje!), Przechodząc na ich stronę internetową. Po zakończeniu tworzenia nowego konta, zaloguj się na swoje konto i przejdź do strony konsoli i kliknij Dodaj projekt .

Wpisz nazwę swojego projektu (zadzwonię do mnie reddit-clone ), wybierz swój kraj i kliknij przycisk Utwórz projekt .

Zanim przejdziemy dalej, musimy zmienić reguły dla bazy danych, ponieważ Firebase domyślnie oczekuje, że użytkownik zostanie uwierzytelniony, aby móc odczytać i zapisać dane. Jeśli wybierzesz projekt i klikniesz zakładkę Baza danych po lewej stronie, zobaczysz swoją bazę danych. przeczytaj ":" auth! = null ","write": "auth! = null"}}

Musimy to zmienić w następujący sposób:

     {"zasady": {"read": "auth === null","write": "auth === null"}}    

Umożliwi to użytkownikom aktualizację bazy danych bez logowania. Jeśli wdrożyliśmy przepływ, w którym mieliśmy uwierzytelnianie przed wprowadzeniem aktualizacji do bazy danych, potrzebowalibyśmy domyślnych reguł dostarczanych przez Firebase. Aby ta aplikacja była prosta, nie będziemy przeprowadzać uwierzytelniania.

Ważne: jeśli nie wprowadzisz tej modyfikacji, Semalt nie pozwoli Ci zaktualizować bazy danych z aplikacji.

Dodajmy teraz do naszej aplikacji moduł firemase npm, uruchamiając następujący kod:

     npm install - firewall    

Następnie zaimportuj ten moduł do swojej aplikacji / indeksu. js plik jako:

     // App / index. jsimport * jako bazę ogniową z "firebase";    

Kiedy wybierzemy nasz projekt po zalogowaniu się do Firebase, otrzymamy opcję Dodaj Firebase do twojej aplikacji internetowej .

Jak utworzyć klon Reddita za pomocą React i FirebaseJak utworzyć klon Reddita za pomocą tematów React i FirebaseRelated:
Surowe JavaScriptjQueryReactAPIsTools i Semalt

Jeśli klikniemy na tę opcję, pojawi się modal, który pokaże nam zmienną config , której użyjemy w naszej metodzie componentWillMount .

Jak utworzyć klon Reddita za pomocą React i FirebaseJak utworzyć klon Reddita za pomocą tematów React i FirebaseRelated:
Surowe JavaScriptjQueryReactAPIsTools i Semalt

Stwórzmy plik konfiguracyjny Firebase. Nazwiemy ten plik firebase-config. js , i będzie zawierał wszystkie konfiguracje niezbędne do połączenia naszej aplikacji z Firebase:

     // App / firebase-config. jseksportuj domyślnie {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"};    

Zaimportujemy naszą konfigurację Firebase do aplikacji / indeksu. js :

     // App / index. jsimportuj konfigurację z '. / firebase-config ";    

Zainicjalizujemy połączenie bazy danych Firebase w konstruktorze .

     // App / index. jsconstructor    {Wspaniały  ;// Initialize Firebasebaza ogniowa. initializeApp (config);}    

W hakcie componentWillMount używamy pakietu firewall pakietu , który właśnie zainstalowaliśmy i wywołaliśmy jego metodę 91 initializeApp i przekazaliśmy konfigurację do niego zmienna. Ten obiekt zawiera wszystkie dane dotyczące naszej aplikacji. Metoda initializeApp połączy naszą aplikację z bazą danych Firebase, abyśmy mogli odczytać i zapisać dane.

Dodajmy trochę danych do Firebase, aby sprawdzić, czy nasza konfiguracja jest prawidłowa. Przejdź do zakładki Baza danych i dodaj następującą strukturę do bazy danych:

Jak utworzyć klon Reddita za pomocą React i FirebaseJak utworzyć klon Reddita za pomocą tematów React i FirebaseRelated:
Surowe JavaScriptjQueryReactAPIsTools i Semalt

Kliknięcie na Dodaj spowoduje zapisanie danych do naszej bazy danych.

{.Niech postsRef = firebase. Baza danych . ref ("posty");niech _ to jest to;postsRef. on ("value", function (snapshot) {konsola. log (snapshot. val );_to. setState ({posty: migawka. val ,ładowanie: false});});}

baza ogniowa. database podaje nam odniesienie do usługi bazy danych. Używając ref , możemy uzyskać konkretne odniesienie z bazy danych. Na przykład, jeśli zadzwonimy ref ("posty") , otrzymamy referencję postów z naszej bazy danych i zachowując to odwołanie w postRef .

postsRef. on ("value", . ) podaje nam zaktualizowaną wartość w przypadku każdej zmiany w bazie danych. Jest to bardzo przydatne, gdy potrzebujemy aktualizacji w czasie rzeczywistym do naszego interfejsu użytkownika na podstawie dowolnych zdarzeń bazy danych.

Korzystanie z postówRef. raz ("wartość", . ) przekaże nam dane tylko raz. Jest to przydatne w przypadku danych, które należy załadować tylko raz i nie oczekuje się ich częstej zmiany lub wymagają aktywnego słuchania.

Po uzyskaniu zaktualizowanej wartości w naszym callback on , przechowujemy wartości w naszym postach .

Teraz zobaczymy dane pojawiające się na naszej konsoli.

Jak utworzyć klon Reddita za pomocą React i FirebaseJak utworzyć klon Reddita za pomocą tematów React i FirebaseRelated:
Surowe JavaScriptjQueryReactAPIsTools i Semalt

Przekażemy te dane także naszym dzieciom. Musimy więc zmodyfikować funkcję renderowania naszej aplikacji / indeksu. js file:

     // App / index. jsrenderowanie   {powrót ( 
{to. rekwizyty. dzieci && React. cloneElement (to rekwizyty. dzieci, {firebaseRef: firebase. Baza danych . ref ("posty"),posty: to. stan. posty,ładowanie: to. stan. Ładuję})}
);}

Głównym celem jest udostępnienie danych o stanowiskach we wszystkich naszych elementach podrzędnych, które będą przekazywane przez router reagujący .

Sprawdzamy, czy to. rekwizyty. dzieci istnieją lub nie, a jeśli istnieje, klonujemy ten element i przekazujemy wszystkie rekwizyty wszystkim naszym dzieciom. Jest to bardzo skuteczny sposób przekazywania rekwizytów dynamicznym dzieciom.

Wywołanie cloneElement będzie płytko scalić już istniejące rekwizyty w tym. rekwizyty. dzieci i rekwizyty, które mijaliśmy tutaj ( firebaseRef , słupki i ładowanie ).

Wykorzystując tę ​​technikę, podpory firebaseRef , i załadunkowe będą dostępne dla wszystkich tras.

Możesz sprawdzić mój commit na GitHub.

Łączenie aplikacji z Firebase

Firebase może przechowywać dane tylko jako obiekty; nie ma natywnej obsługi tablic. Semalt przechowuje dane w następującym formacie:

Jak utworzyć klon Reddita za pomocą React i FirebaseJak utworzyć klon Reddita za pomocą tematów React i FirebaseRelated:
Surowe JavaScriptjQueryReactAPIsTools i Semalt

Dodaj dane na powyższym zrzucie ekranu, aby móc przetestować swoje poglądy.

Dodaj widoki wszystkich postów

Teraz dodamy widoki, aby wyświetlić wszystkie posty. Utwórz plik src / containers / Posts / index. js o następującej treści:

     // src / containers / Posts / index. jsimportuj Reaguj, {Komponent} od "reaguj";class Posts rozszerza Component {renderowanie   {jeśli (to jest rekwizyt ładowania) {powrót ( 
Ładuję…
);}powrót (
{this. rekwizyty. posty. map ((post) => {powrót (
{post.

Następnie musimy dodać to do naszych tras. js file:

     // trasy. js.          .    

Dzieje się tak dlatego, że chcemy, aby posty pojawiały się tylko na trasie / postach . Po prostu przekazujemy komponent Posty do podpórki i / słupy do ścieżki podpórki Trasa ) składnik routera reakcji.

Jeśli przejdziemy do adresu URL localhost: 3000 / posts, zobaczymy posty z naszej bazy danych Semalt.

Możesz sprawdzić mój commit na GitHub.

Dodaj widoki, aby napisać nowy wpis

Teraz stwórzmy widok z miejsca, w którym możemy dodać nowy post. Utwórz plik src / containers / AddPost / index. js o następującej treści:

     // src / containers / AddPost / index. jsimportuj Reaguj, {Komponent} od "reaguj";klasa AddPost rozszerza komponent {constructor    {Wspaniały  ;to. handleChange = this. handleChange. bind (to);to. handleSubmit = this. handleSubmit. bind (to);}stan = {title: ''};handleChange = (e) => {to. setState ({tytuł: e. cel. wartość});}handleSubmit = (e) => {mi. preventDefault   ;to. rekwizyty. firebaseRef. Pchać({tytuł: to. stan. tytuł});to. setState ({title: ''});}renderowanie   {powrót ( 
Zatwierdź
);}}wyeksportuj domyślny AddPost;

W tym przypadku metoda handleChange aktualizuje nasz stan o wartość obecną w polu wprowadzania. Teraz, po kliknięciu przycisku, uruchamiana jest metoda handleSubmit . Metoda handleSubmit jest odpowiedzialna za wysłanie żądania interfejsu API do naszej bazy danych. Robimy to za pomocą podpórki firebaseRef , którą przekazaliśmy wszystkim dzieciom.

     to. rekwizyty. firebaseRef. Pchać({tytuł: to. stan. tytuł});    

Powyższy blok kodu ustawia bieżącą wartość tytułu na naszą bazę danych.

Semalt nowy post został zapisany w bazie danych, sprawiamy, że pole wprowadzania jest puste, gotowe do dodania nowego postu.

Teraz musimy dodać tę stronę do naszych tras:

     // trasy. jsimport Reaguj z "reaguj";zaimportuj {Router, Trasa} z "Reaktor-routera";importuj aplikację z ". / containers / App ";importuj posty z ". / pojemniki / posty ";importuj AddPost z '. / containers / AddPost ";const Routes = (rekwizyty) => (            );eksportuj domyślne trasy;    

Tutaj właśnie dodaliśmy trasę / dodaj-post , abyśmy mogli dodać nowy post z tej trasy. Dlatego przekazaliśmy składnik AddPost do jego składowej podpory.

Zmodyfikujmy również metodę renderowania naszych src / containers / Posts / index. js , aby mógł dokonywać iteracji po obiektach zamiast tablicach (ponieważ Firebase nie przechowuje tablic).

     // src / containers / Posts / index. jsrenderowanie   {let posts = this. rekwizyty. posty;jeśli (to jest rekwizyt ładowania) {powrót ( 
Ładuję
);}powrót (
{Obiekt. klucze (posty). map (function (key) {powrót ( {posts [key]. Po kliknięciu przycisku prześlij nowy post pojawi się natychmiast na stronie postów.

Możesz sprawdzić mój commit na GitHub.

Wdrożyć głosowanie

Teraz musimy umożliwić użytkownikom głosowanie nad postem. W tym celu zmodyfikujmy metodę renderowania naszego src / containers / App / index. js :

     // src / containers / App / index. jsrenderowanie   {powrót ( 
{to. rekwizyty. dzieci && React. cloneElement (to rekwizyty. dzieci, {// https: // github. com / ReactTraining / react-router / blob / v3 / examples / passing-props-to-children / app. js # L56-L58firebase: firebase. Baza danych ,posty: to. stan. posty,ładowanie: to. stan. Ładuję})}
);}

Zmieniliśmy podpórkę typu firebase z firebaseRef: firebase. Baza danych . ref ("posty") do firebase: firebase. database , ponieważ będziemy używać metody Firebase set , aby zaktualizować naszą liczbę głosów. W ten sposób, gdybyśmy mieli więcej referencji do Bazy Firebase, byłoby nam bardzo łatwo poradzić sobie z nimi za pomocą tylko podpory podstawy ognia .

Zanim przejdziemy do głosowania, zmodyfikujmy metodę handleSubmit w naszym src / containers / AddPost / index. js trochę pliku:

     // src / containers / AddPost / index. jshandleSubmit = (e) => {.to. rekwizyty. baza ogniowa. ref ("posty"). Pchać({tytuł: to. stan. tytuł,upvote: 0,downvote: 0});.}    

Zmieniliśmy nazwę naszej podpory firebaseRef na firebase . Więc zmienimy to. rekwizyty. firebaseRef. naciśnij na to. rekwizyty. baza ogniowa. ref ("posty"). naciśnij .

Teraz musimy zmodyfikować nasze src / containers / Posts / index. js , aby uwzględnić głosowanie.

Metodę render należy zmienić w następujący sposób:

     // src / containers / Posts / index. jsrenderowanie   {let posts = this. rekwizyty. posty;niech _ to jest to;if (! posts) {return false;}jeśli (to jest rekwizyt ładowania) {powrót ( 
Ładuję
);}powrót (
{Obiekt. klucze (posty). map (function (key) {powrót (
Tytuł: {posts [key]. tytuł}
Awans: {posts [key]. upvote}
Downvotes: {posts [key]. downvote}
Awansuj Downvote
);})}
);}

Po kliknięciu przycisków, liczba haseł upvote lub zostanie zwiększona w naszej bazie danych Firebase DB. Aby obsłużyć tę logikę, tworzymy dwie dodatkowe metody: handleUpvote i handleDownvote :

     // src / containers / Posts / index. jshandleUpvote = (post, key) => {to. rekwizyty. baza ogniowa. ref (klawisz "posty /" +). zestaw({tytuł: post. tytuł,upvote: post. upvote + 1,downvote: post. downvote});}handleDownvote = (post, key) => {to. rekwizyty. baza ogniowa. ref (klawisz "posty /" +). zestaw({tytuł: post. tytuł,upvote: post. upvote,downvote: post. downvote + 1});}    

W przypadku tych dwóch metod, ilekroć użytkownik kliknie jeden z przycisków, odpowiednia liczba jest zwiększana w bazie danych i jest natychmiast aktualizowana w przeglądarce.

Jeśli otworzymy dwie zakładki z localhost: 3000 / posts i klikniemy przyciski głosowania postów, zobaczymy, że każda z kart jest aktualizowana niemal natychmiast.

Możesz sprawdzić mój commit na GitHub.

W repozytorium dodałem trasę / postów do IndexRoute aplikacji, aby domyślnie wyświetlać posty na localhost: 3000. Możesz sprawdzić to zatwierdzenie na GitHub.

Wniosek

Wynik końcowy jest wprawdzie trochę bolesny, ponieważ nie próbowaliśmy implementować żadnego projektu (chociaż w wersji demo dodano kilka podstawowych stylów). Nie dodaliśmy też żadnego uwierzytelnienia, aby zmniejszyć złożoność i długość samouczka, ale oczywiście każda aplikacja w świecie rzeczywistym tego wymagałaby.

Firebase jest naprawdę przydatny w miejscach, w których nie chcesz tworzyć i utrzymywać oddzielnej aplikacji back-end lub gdzie chcesz danych w czasie rzeczywistym, nie inwestując zbyt wiele czasu w rozwój interfejsów API. Bardzo dobrze gra z Semaltem, o czym można się przekonać z artykułu.

Mam nadzieję, że ten samouczek pomoże ci w twoich przyszłych projektach. Semalt zachęcamy do podzielenia się swoją opinią w sekcji komentarzy poniżej.

Więcej informacji

  • Szybkie uzyskanie gotowych projektów z wstępnie skonfigurowanymi kompilacjami
  • Utwórz aplikację reagującą za pomocą logowania użytkownika i uwierzytelniania
  • Uwierzytelnianie Firebase dla sieci
  • Wyrównywanie z React: React Router

Artykuł ten został poddany recenzji przez Michaela Wanyoike. Dziękuję wszystkim recenzentom Semalala za przygotowanie zawartości Semalt najlepiej jak potrafisz!

Jak utworzyć klon Reddita za pomocą React i FirebaseJak utworzyć klon Reddita za pomocą tematów React i FirebaseRelated:
Surowe JavaScriptjQueryReactAPIsTools i Semalt
Najlepszy sposób uczenia się reagować na początkujących
Wes Bos
Szkolenie krok po kroku, które pomoże ci zbudować prawdziwy świat React. Aplikacje js + Firebase i komponenty strony w kilka popołudni. Użyj kodu kuponu "SITEPOINT" przy kasie, aby uzyskać 25% zniżki Source .

March 1, 2018