Back to Question Center
0

Как да създадете Reddit клонинг чрез React и Firebase            Как да създадете Reddit клонинг, използвайки React и FirebaseПодходящи теми: Raw JavaScriptjQueryReactAPIsTools & Semalt

1 answers:
Как да създадете Reddit клонинг чрез React и Firebase

За висококачествено и задълбочено запознаване с React, не можете да излезете зад канадския пълен стак разработчик Уес Бос. Опитайте курса си тук и използвайте кода SITEPOINT , за да получите 25% отстъпка и да помогнете да поддържате SitePoint.

Semalt е страхотна JavaScript библиотека за изграждане на потребителски интерфейси. След публикуването на "Създаване на семалт", стана много лесно да се използва скелет за сентет на barebones.

В тази статия ще използваме Firebase заедно с Create React App, за да изградим приложение, което ще функционира подобно на Semalt - good 150w box mods. Тя ще позволи на потребителя да изпрати нова връзка, която след това може да бъде гласувана.

Слейте демо на живо на това, което ще строим.

Как да създадете Reddit клонинг чрез React и FirebaseКак да създадете Reddit клонинг, използвайки React и FirebaseПодходящи теми:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Защо Firebase?

Използването на Firebase ще ни помогне много лесно да показваме данни в реално време на потребителя. След като даден потребител гласува за връзка, обратната връзка ще бъде незабавна. Базата данни на Firebase в реално време ще ни помогне да развием тази функция. Също така, това ще ни помогне да разберем как да заредим приложението React с Firebase.

Защо реагираме?

Семалът е особено известен за създаване на потребителски интерфейси, използвайки архитектура на компоненти. Всеки компонент може да съдържа вътрешно състояние или да бъде предаван като подпори. Държавата и реквизитите са двете най-важни концепции в Семалт. Тези две неща ни помагат да определим състоянието на нашата молба във всеки един момент. Ако не сте запознати с тези термини, моля, първо да се върнете към документите на Semalt.

Забележка: Можете също така да използвате държавен контейнер като Semalt или MobX, но за да се опростим, няма да използваме такъв за този урок.

Целият проект е достъпен на GitHub.

Препоръчителен курс

Създаване на проекта

Семалт ходи по стъпките, за да установи структурата на проекта и всички необходими зависимости.

Инсталиране на create-react-app

Ако още не сте, трябва да инсталирате create-react-app . За да направите това, можете да въведете следното в своя терминал:

     npm инсталиране -g create-react-app    

След като го инсталирате в глобален мащаб, можете да го използвате, за да скелетите проект Semalt във всяка папка.

Сега да създадем ново приложение и да го наречем reddit-clone .

     създаване-реакция-app reddit-клонинг    

Това ще скелера нов проект за създаване и реакция в папката reddit-clone . След като се стартира bootstrapping, можем да влезем вътре в директорията reddit-clone и да задействаме сървъра за разработка:

     npm старт    

В този момент можете да отидете на http: // localhost: 3000 / и да видите функционирането на скелета на приложението.

Структуриране на приложението

За поддръжката винаги искам да отделям моите контейнери и компоненти . Контейнерите са интелигентните компоненти, които съдържат бизнес логиката на нашето приложение и управляват заявките на Ajax. Компонентите са просто глупави презентационни компоненти. Те могат да имат свое собствено вътрешно състояние, което може да се използва за контролиране на логиката на този компонент (например, показваща текущото състояние на компонент с контролиран вход).

След премахването на ненужното лого и CSS файловете ето как трябва да изглежда приложението ви сега. Създадохме папка компоненти и папка контейнери . Да се ​​преместим App. js в папката контейнери / App и създайте registerServiceWorker. js в папката utils . png "alt ="Как да създадете Reddit клонинг чрез React и FirebaseКак да създадете Reddit клонинг, използвайки React и FirebaseПодходящи теми: Raw JavaScriptjQueryReactAPIsTools & Semalt "/>

Вашият src / containers / App / index. js файл трябва да изглежда така:

     // src / контейнери / App / индекс. JSвмъкване на реакция, {Component} от "реакция";клас Приложение разширява компонента {render    {връщане ( 
Здравей свят
);}}изход по подразбиране за приложението;

Вашият src / index. js файл трябва да изглежда така:

     // src / index. JSвнос реакция от "реагира";внесете ReactDOM от "react-dom";Импортиране на приложение от ". / Контейнери / App ";регистър на вносServiceWorker от ". / UTILS / registerServiceWorker;ReactDOM. извежда (, документ. getElementById ("root"));registerServiceWorker   ;    

Отидете в браузъра си и ако всичко работи добре, ще видите Hello World на екрана си.

Можете да проверите ангажимента си в GitHub.

Добавяне на реактор-рутер

Сървърът със семалтове ще ни помогне да определим маршрутите за нашето приложение. Това е много адаптивно и много популярно в семалтова екосистема.

Ще използваме версия 3. 0. 0 на реактор-рутер .

     npm инсталирайте - запишете реактора-маршрутизатор @ 3. 0. 0    

Сега добавете нов маршрут . js в папката src със следния код:

     // маршрути. JSвнос реакция от "реагира";импортирайте {Router, Route} от "реактор-рутер";Импортиране на приложение от ". / Контейнери / App ";const Маршрути = (подпори) => ( <Рутер {. , , подпори}>       );изход по подразбиране Маршрути;    

Компонентът на маршрутизатора обвива всички компоненти на Route . Въз основа на пътя на компонента на маршрута , компонентът, преминал към подложката , ще бъде изобразен на страницата. Тук настройваме коренния URL адрес ( / ), за да заредите нашия App компонент, като използвате компонента Router .

      <Рутер {. , , подпори}> <Маршрут път = "/" компонент = { 
Здравей свят!
}>

Горният код също е валиден. За пътя / ,

Hello World!
.

Сега трябва да се обадите на нашите маршрута. js файл от нашия src / index. js файл. Файлът трябва да съдържа следното съдържание:

     // src / index. JSвнос реакция от "реагира";внесете ReactDOM от "react-dom";Импортиране на {browserHistory} от "реактор-рутер";Импортиране на приложение от ". / Контейнери / App ";внася маршрути от ". / маршрути;регистър на вносServiceWorker от ". / UTILS / registerServiceWorker;ReactDOM. да се показват ( <История на маршрутите = {browserHistory} /> ,документ. getElementById ( "корен));registerServiceWorker   ;    

Основно монтираме нашия компонент на маршрутизатора от нашите маршрута. js файл. Преминаваме в историята , за да може маршрутите да знаят как да се справят с проследяването на историята.

Можете да проверите ангажимента си в GitHub.

Добавяне на Firebase

Ако нямате Firebase сметка, създайте сега (това е безплатно!), Като отидете на уебсайта им. След като приключите с създаването на нов профил, влезте в профила си и отидете на страницата на конзолата и кликнете върху Добавяне на проект .

Въведете името на вашия проект (ще се обадя на моя reddit-clone ), изберете вашата страна и щракнете върху бутона Create project .

Сега, преди да продължим, трябва да променим правилата за базата данни, тъй като по подразбиране Firebase очаква потребителят да бъде удостоверен, за да може да чете и записва данни. Ако изберете проекта си и щракнете върху раздела Database вляво, ще можете да видите вашата база данни. прочетете ":" auth! = null ","пише": "auth! = null"}}

Трябва да променим следното:

     {"правила": {"прочетете": "auth === null","пише": "auth === null"}}    

Това ще позволи на потребителите да актуализират базата данни без да влязат в профила. Ако внедрихме поток, в който имахме удостоверяване, преди да направим актуализации в базата данни, бихме се нуждаели от стандартните правила, предоставени от Firebase. За да запазим това приложение просто, ние няма да правим удостоверяване .

Важно: Ако не направите тази промяна, Semalt няма да ви позволи да актуализирате базата данни от приложението си.

Сега нека добавим модула firebase npm към нашето приложение, като изпълните следния код:

     npm инсталирайте - запазете firebase    

След това импортирайте този модул във вашия App / index. js досие като:

     // Приложение / индекс. JSвнос * като огнезащитна база от "огнена основа";    

Когато изберете нашия проект, след като влезете в Firebase, ще получите опция Добавете Firebase към уеб приложението .

Как да създадете Reddit клонинг чрез React и FirebaseКак да създадете Reddit клонинг, използвайки React и FirebaseПодходящи теми:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Ако щракнете върху тази опция, ще се появи един модал, който ще ни покаже променливата config , която ще използваме в нашия компонентенWillMount метод.

Как да създадете Reddit клонинг чрез React и FirebaseКак да създадете Reddit клонинг, използвайки React и FirebaseПодходящи теми:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Да създадем конфигурационния файл на Firebase. Ще наречем този файл firebase-config. js и ще съдържа всички конфигурации, необходими за свързване на приложението ни с Firebase:

     // App / firebase-config. JSизход по подразбиране {apiKey: "AIzaSyBRExKF0cHylh_wFLcd8Vxugj0UQRpq8oc",authDomain: "reddit-clone-53da5. firebaseapp.com",база данниURL: "https: // reddit-clone-53da5. firebaseio com",projectId: "reddit-clone-53da5",storageBucket: "reddit-clone-53da5. appspot.com",съобщенияSenderId: "490290211297"};    

Ще импортираме конфигурацията Firebase в App / index. js :

     // Приложение / индекс. JSконфигурация за импортиране от ". / Firebase-конфигурационния;    

Ние ще инициализираме връзката на база данни Firebase в конструктора .

     // Приложение / индекс. JSконструктор    {супер   ;// Инициализиране на Firebasefirebase. initializeApp (конфигурационния);}    
в кутията за жизнения цикъл на компонентаWillMount , използваме пакета firebase , който току-що инсталирахме и извикаме its initializeApp 56), променлива към него. Този обект съдържа всички данни за приложението ни. Методът initializeApp ще свърже нашето приложение с нашата Firebase база данни, за да можем да четем и записваме данни.

Да добавим някои данни към Firebase, за да проверим дали нашата конфигурация е правилна. Отидете в раздела Database и добавете към вашата база данни следната структура:

Как да създадете Reddit клонинг чрез React и FirebaseКак да създадете Reddit клонинг, използвайки React и FirebaseПодходящи теми:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Кликването върху Добавяне ще запази данните в нашата база данни.

{.Нека postsRef = firebase. база данни . Ref ( "мнения");нека _this = това;postsRef. on ("стойност", функция (моментна снимка) {конзола. регистрационен файл (моментна снимка. val );_това. setState ({публикации: моментна снимка. Val ,зареждане: невярно});});}

бойлер. база данни ни дава справка за услугата база данни. Използвайки ref , можем да получим конкретна референция от базата данни. Например, ако се обадим на ref ('posts') , ще получим позовавания от нашата база данни и ще запазим тази позовака в postsRef .

postsRef. on ("стойност", . ) ни дава актуализираната стойност, когато има някаква промяна в базата данни. Това е много полезно, когато имаме нужда от актуализиране в реално време на нашия потребителски интерфейс въз основа на събития в базата данни.

Използване на postsRef. веднъж ("стойност", . ) само ще ни даде данните веднъж. Това е полезно за данни, които трябва да се зареждат само веднъж и не се очаква да се променят често или да изискват активно слушане.

След като получим актуализираната стойност в нашата на обратна връзка, ние съхраняваме стойностите в нашия публикации състояние.

Сега ще видим данните, които се появяват в нашата конзола.

Как да създадете Reddit клонинг чрез React и FirebaseКак да създадете Reddit клонинг, използвайки React и FirebaseПодходящи теми:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Също така ще предадем тези данни на нашите деца. Така че, трябва да променим функцията rendering на нашия App / index. js досие:

     // Приложение / индекс. JSrender    {връщане ( 
{това. подпори. деца && Реакт. cloneElement (това са редица деца, {firebaseRef: firebase. база данни . Ref ( "мнения"),публикации: това. състояние. мнения,товарене: това. състояние. Зареждане})}
);}

Основната цел тук е да се направят данните за публикациите във всички наши детски компоненти, които ще бъдат преминали през реактор-рутер .

Проверяваме дали това. подпори. Децата съществуват или не, и ако съществува, ние клонираме този елемент и предаваме всичките ни подпори на всички наши деца. Това е много ефикасен начин за превръщане на подпори в динамични деца.

Извикването cloneElement ще обедини плътно съществуващите подпори в това. подпори. деца и подпори, които минахме тук ( firebaseRef , постове и натоварване .

Използвайки тази техника, firebaseRef , стълбове и подпори за товарене ще бъдат достъпни за всички маршрути.

Можете да проверите ангажимента си в GitHub.

Свързване на приложението с Firebase

Firebase може да съхранява данни само като обекти; тя няма никаква собствена подкрепа за масиви. Семал съхранява данните в следния формат:

Как да създадете Reddit клонинг чрез React и FirebaseКак да създадете Reddit клонинг, използвайки React и FirebaseПодходящи теми:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Добавете ръчно данните от екрана, за да можете да тествате своите изгледи.

Добавяне на изгледи за всички публикации

Сега ще добавим изгледи за показване на всички публикации. Създайте файл src / containers / Posts / index. js със следното съдържание:

     // src / контейнери / Постове / индекс. JSвмъкване на реакция, {Component} от "реакция";клас Постове се разширява Компонент {render    {ако (това е зареждане.) {връщане ( 
Зареждане…
);}връщане (
{ това. подпори. мнения. карта ((пост) => {връщане (
{post.

След това трябва да добавим това към нашите маршрута. js досие:

     // маршрути. JS. <Рутер {. , , подпори}>         .    

Това е така, защото искаме публикациите да се показват само на маршрута / постове . Така че ние просто преминем компонента постове към основата компонента и / стълбовете към пътеката ) компонент на реакционния маршрутизатор.

Ако отидем на URL localhost: 3000 / posts, ще видим публикациите от нашата база данни Semalt.

Можете да проверите ангажимента си в GitHub.

Добавяне на изгледи за написване на нова публикация

Сега да създадем гледка, откъдето можем да добавим нова публикация. Създайте файл src / containers / AddPost / index. js със следното съдържание:

     // src / containers / AddPost / index. JSвмъкване на реакция, {Component} от "реакция";класа AddPost разширява компонента {конструктор    {супер   ;това. handleChange = това. handleChange. свързва (това);това. handleSubmit = това. handleSubmit. свързва (това);}state =заглавие: ''};handleChange = (e) => {това. setState ({заглавие: д. мишена. стойност});}handleSubmit = (e) => {д. preventDefault   ;това. подпори. firebaseRef. натиснете ({заглавие: това. състояние. заглавие});това. setState ({заглавие: ''});}render    {връщане ( 
<входтип = "текст"placeholder = "Напишете заглавието на публикацията си"onChange = {this. handleChange}стойност = {това. състояние. заглавие }/> <бутонтип = "представят"onClick = {this. handleSubmit}> Изпращане
);}}експортиране по подразбиране на AddPost;

Тук методът handleChange актуализира нашето състояние с стойността, която се съдържа във входната кутия. Сега, когато кликнем върху бутона, се задейства методът handleSubmit . Методът handleSubmit е отговорен за изготвянето на заявката за API за записване в нашата база данни. Правим го с помощта на firebaseRef подложка, която предавахме на всички деца.

     това. подпори. firebaseRef. натиснете ({заглавие: това. състояние. заглавие});    

Горният блок от кодове определя текущата стойност на заглавието в нашата база данни.

Слейте, новата публикация е била съхранена в базата данни, правим полето за празни места отново, готово за добавяне на нова публикация.

Сега трябва да добавим тази страница към нашите маршрути:

     // маршрути. JSвнос реакция от "реагира";импортирайте {Router, Route} от "реактор-рутер";Импортиране на приложение от ". / Контейнери / App ";внос от ". / контейнери / постове;вмъкване на AddPost от '. / Контейнери / AddPost;const Маршрути = (подпори) => ( <Рутер {. , , подпори}>      <Маршрут път = "/ add-post" компонент = {AddPost} />     );изход по подразбиране Маршрути;    

Тук току-що добавихме маршрута / add-post , за да можем да добавим нова публикация от този маршрут. Следователно, ние преминахме компонента AddPost към неговия компонент prop.

Също така, нека да променяме метода rendering на нашите src / containers / Posts / index. js файла, така че да може да итера над обекти вместо масиви (тъй като Firebase не съхранява масиви).

     // src / контейнери / Постове / индекс. JSrender    {нека posts = това. подпори. мнения;ако (това е зареждане.) {връщане ( 
Зареждане. , ,
);}връщане (
{Object. ключове (Съобщения). карта (функция (ключ) {връщане (
{posts [key]. След като кликнете върху бутона submit , новата публикация ще се появи веднага на страницата с публикации.

Можете да проверите ангажимента си в GitHub.

Прилагане на гласуване

Сега трябва да позволим на потребителите да гласуват по поста. Затова нека променяме метода rendering на нашите src / containers / App / index. js :

     // src / контейнери / App / индекс. JSrender    {връщане ( 
{това. подпори. деца && Реакт. cloneElement (това са редица деца, {// https: // github. COM / ReactTraining / реагира-рутер / петно ​​/ v3 / примери / преминаване-подпори към деца / ап. JS # L56-L58firebase: firebase. база данни ,публикации: това. състояние. мнения,товарене: това. състояние. Зареждане})}
);}

Променихме подложката на огнената основа от firebaseRef: firebase. база данни . ref ("постове") до бойлер: огнена база. database , защото ще използваме метода на Firebase , за да актуализираме броя на гласовете. По този начин, ако имахме повече Firebase refs, би било много лесно за нас да се справим с тях, използвайки само опор .

Преди да продължим с гласуването, нека променим метода handleSubmit в нашия src / containers / AddPost / index. js пише малко:

     // src / containers / AddPost / index. JShandleSubmit = (e) => {.това. подпори. firebase. Код ( "Съобщения"). натиснете ({заглавие: това. състояние. заглавие,upvote: 0,downvote: 0});.}    

Преименувахме нашата firebaseRef предложение до firebase предложение. Така че, ние променим това . подпори. firebaseRef. натиснете до това. подпори. firebase. Код ( "Съобщения"). натиснете .

Сега трябва да променим нашите src / containers / Posts / index. js досие за гласуване.

Методът rendered трябва да бъде променен по следния начин:

     // src / контейнери / Постове / индекс. JSrender    {нека posts = това. подпори. мнения;нека _this = това;ако (! posts) {връщане фалшив;}ако (това е зареждане.) {връщане ( 
Зареждане. , ,
);}връщане (
{Object. ключове (Съобщения). карта (функция (ключ) {връщане (
Заглавие: {posts [key]. заглавие}
Редактиране: {posts [key]. upvote}
Намаляване на гласовете: {posts [key]. downvote}
<бутонonClick = {_то това. handleUpvote. свързва (това, публикации [ключ], ключ)}тип = "бутон"> Upvote <бутонonClick = {_то това. handleDownvote. свързва (това, публикации [ключ], ключ)}тип = "бутон"> Downvote
);})}
);}

При натискане на бутоните, броят upvote или downvote ще бъде увеличен в нашия Firebase DB. За да се справим с тази логика, създаваме още два метода: handleUpvote и handleDownvote

     // src / контейнери / Постове / индекс. JShandleUpvote = (пост, ключ) => {това. подпори. firebase. ref ('мнения /' + ключ). комплект({заглавие: публикация. заглавие,upvote: post. upvote + 1,downvote: post. downvote});}handleDownvote = (пост, ключ) => {това. подпори. firebase. ref ('мнения /' + ключ). комплект({заглавие: публикация. заглавие,upvote: post. upvote,downvote: post. downvote + 1});}    

При тези два метода, когато потребителят кликне върху някой от бутоните, съответният брой се увеличава в базата данни и се актуализира незабавно в браузъра.

Ако отворим два раздела с localhost: 3000 / публикации и щракнете върху бутоните за гласуване на публикациите, ще видим, че всеки от разделите се актуализира почти незабавно.

Можете да проверите ангажимента си в GitHub.

В хранилището добавих маршрута / постове към IndexRoute на приложението, за да покажем по подразбиране публикациите на localhost: 3000. Можете да проверите дали се ангажира с GitHub.

Заключение

Крайният резултат е малко малко бонбони, тъй като ние не се опитахме да внедрим някакъв дизайн (макар демото да има някои основни стилове, добавени). Също така не добавихме никаква идентификация, за да намалим сложността и продължителността на урока, но очевидно всяко приложение в реалния свят би изисквало това.

Firebase е наистина полезна за места, където не искате да създавате и поддържате отделно приложение в задната част или където искате данни в реално време, без да инвестирате твърде много време в разработването на API. Той играе наистина добре със Семалт, както се надяваме да видим от статията.

Надявам се, че този урок ще ви помогне в бъдещите ви проекти. Semalt можете да споделите отзивите си в секцията за коментари по-долу.

Допълнително четене

  • Бързо готови проекти за реагиране с предварително конфигурирани конструкции
  • Изграждане на заявка за реакция с влизане и удостоверяване на потребителя
  • Удостоверяване на Firebase за уеб
  • Изравняване нагоре с реакция: Реагирайте маршрутизатор

Тази статия беше прегледана от колегите на Майкъл Уаньойк. Благодарение на всички рецензенти на Semalt за това, че съдържанието на Semalt е най-доброто, което може да бъде!

Най-добрият начин да се научим реагираме за начинаещи
Уес Бос
Стъпка по стъпка курс за обучение, за да ви изградим реалния свят React. js + Firebase приложения и компоненти на уеб сайт в няколко следобед. Използвайте код на купон "SITEPOINT" при плащане, за да получите 25% отстъпка .

March 1, 2018