Back to Question Center
0

Cara Membuat Reddit Clone Menggunakan React dan Firebase            Cara Membuat Reddit Clone Menggunakan React dan FirebaseRelated Topics: Raw JavaScriptjQueryReactAPIsTools & Semalt

1 answers:
Cara Membuat Cluster Reddit Menggunakan Reaktan dan Firebase

Untuk pengantar React yang berkualitas tinggi dan mendalam, Anda tidak bisa melewati pengembang full-stack Kanada Wes Bos. Cobalah kursusnya di sini, dan gunakan kode SITEPOINT untuk mendapatkan diskon 25% dan untuk membantu mendukung SitePoint.

Semalt adalah library JavaScript yang mengagumkan untuk membangun antarmuka pengguna. Sejak penerbitan Aplikasi Buat Semalt, sudah menjadi sangat mudah untuk menancapkan aplikasi barbal Batu Semalt.

Pada artikel ini, kita akan menggunakan Firebase bersama dengan Create React App untuk membangun sebuah aplikasi yang akan berfungsi mirip dengan Semalt. Ini akan memungkinkan pengguna mengirimkan tautan baru yang kemudian dapat dipilih.

Semalt demo live tentang apa yang akan kita bangun.

Cara Membuat Reddit Clone Menggunakan React dan FirebaseCara Membuat Reddit Clone Menggunakan React dan FirebaseRelated Topics:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Mengapa Firebase?

Menggunakan Firebase akan memudahkan kita menampilkan data real-time ke pengguna. Begitu pengguna memberi suara pada sebuah tautan, umpan baliknya akan berlangsung seketika. Database Realtime Firebase akan membantu kami dalam mengembangkan fitur ini. Juga, ini akan membantu kita untuk memahami bagaimana melakukan bootstrap aplikasi React dengan Firebase.

Mengapa Bereaksi?

Semalt sangat dikenal karena membuat antarmuka pengguna menggunakan arsitektur komponen. Setiap komponen dapat berisi keadaan internal atau dilewatkan data sebagai alat peraga. Negara dan alat peraga adalah dua konsep terpenting di Semalt. Kedua hal ini membantu kita menentukan keadaan aplikasi kita kapan saja. Jika Anda tidak terbiasa dengan persyaratan ini, silakan kunjungi dokumen Semalt terlebih dahulu.

Catatan: Anda juga bisa menggunakan wadah negara seperti Semalt atau MobX, tapi demi kesederhanaan, kami tidak akan menggunakannya untuk tutorial ini.

Seluruh proyek tersedia di GitHub.

Kursus yang Direkomendasikan

Menyiapkan Proyek

Semalt berjalan melalui tangga untuk membuat struktur proyek dan ketergantungan yang diperlukan.

Instalasi membuat-bereaksi-app

Jika Anda belum melakukannya, Anda perlu menginstal create-react-app . Untuk melakukannya, Anda dapat mengetikkan yang berikut di terminal Anda:

     npm install -g create-react-app    

Setelah memasangnya secara global, Anda dapat menggunakannya untuk menancapkan proyek Semalt di dalam folder mana pun.

Sekarang, mari membuat aplikasi baru dan menyebutnya reddit-clone .

     membuat-bereaksi-app reddit-clone    

Ini akan menancapkan proyek pembuatan-reaksi baru di dalam folder reddit-clone . Setelah bootstrap selesai, kita bisa masuk ke dalam direktori reddit-clone dan jalankan server pengembangan:

     npm mulai    

Pada titik ini, Anda bisa masuk ke http: // localhost: 3000 / dan lihat kerangka aplikasi Anda dan jalankan.

Penataan aplikasi

Untuk perawatan, saya selalu ingin memisahkan kontainer saya dan komponen . Wadah adalah komponen cerdas yang mengandung logika bisnis aplikasi kita dan mengelola permintaan Ajax. Komponen komponen presentasi hanya bodoh. Mereka dapat memiliki keadaan internal mereka sendiri, yang dapat digunakan untuk mengendalikan logika komponen itu (e g) menunjukkan keadaan komponen masukan terkontrol saat ini).

Setelah menghapus logo dan file CSS yang tidak perlu, ini adalah bagaimana aplikasi Anda seharusnya terlihat sekarang. Kami membuat folder komponen dan folder wadah . Ayo pindah App. js di dalam wadah kontainer / App dan buat registerServiceWorker. js di dalam folder util . png "alt ="Cara Membuat Reddit Clone Menggunakan React dan FirebaseCara Membuat Reddit Clone Menggunakan React dan FirebaseRelated Topics: Raw JavaScriptjQueryReactAPIsTools & Semalt "/>

Direktori (src) src / kontainer / App / Anda. js file akan terlihat seperti ini:

     // src / containers / App / index. jsimpor Bereaksi, {Komponen} dari 'reaksi';App kelas meluas Komponen {render    {kembali 
Halo Dunia
);}}ekspor default App;

indeks src / index Anda. js file akan terlihat seperti ini:

     // src / indeks. jsimpor Bereaksi dari 'reaksi';impor ReactDOM dari 'react-dom';impor dari '. / kontainer / App ';import registerServiceWorker dari '. / utils / registerServiceWorker ';ReactDOM. render (, dokumen getElementById ('root'));registerServiceWorker   ;    

Pergi ke browser Anda, dan jika semuanya berjalan baik, Anda akan melihat Hello World di layar Anda.

Anda dapat memeriksa komit saya di GitHub.

Menambahkan react-router

Semalt-router akan membantu kita menentukan rute untuk aplikasi kita. Ini sangat mudah disesuaikan dan sangat populer di ekosistem Semalt.

Kita akan menggunakan versi 3. 0. 0 dari react-router .

     npm install - biarkan bereaksi-router @ 3. 0. 0    

Sekarang, tambahkan file baru rute. js di dalam folder src dengan kode berikut:

     // rute. jsimpor Bereaksi dari 'reaksi';import {Router, Route} dari 'react-router';impor dari '. / kontainer / App ';Rute const = (alat peraga) => (        );rute default ekspor;    

Komponen Router membungkus semua komponen Route . Berdasarkan jalur prop dari komponen Route , komponen yang dilewatkan ke komponen prop akan diberikan pada halaman. Di sini, kita menyiapkan URL akar ( / ) untuk memuat komponen App komponen dengan menggunakan komponen Router .

         Hello World!  
}>

Kode diatas juga berlaku. Untuk jalan / , the

Hello World!
akan dipasang.

Sekarang, kita perlu menghubungi rute kami . js file dari indeks src / src kami. js file File harus memiliki konten berikut:

     // src / indeks. jsimpor Bereaksi dari 'reaksi';impor ReactDOM dari 'react-dom';import {browserHistory} dari 'react-router';impor dari '. / kontainer / App ';impor rute dari '. / rute ';import registerServiceWorker dari '. / utils / registerServiceWorker ';ReactDOM. memberikan(  ,dokumen. getElementById ('root'));registerServiceWorker   ;    

Pada dasarnya, kami memasang komponen Router dari rute kami. js file Kami lulus dalam sejarah prop untuk itu sehingga rute tahu bagaimana menangani pelacakan sejarah.

Anda dapat memeriksa komit saya di GitHub.

Menambahkan Firebase

Jika Anda tidak memiliki akun Firebase, buatlah sekarang (gratis!) Dengan membuka situs web mereka. Setelah selesai membuat akun baru, masuk ke akun Anda dan masuk ke halaman konsol dan klik Add project .

Masukkan nama proyek Anda (saya akan menghubungi saya reddit-clone ), pilih negara Anda, dan klik tombol Create project .

Sekarang, sebelum kita melanjutkan, kita perlu mengubah aturan untuk database karena, secara default, Firebase mengharapkan pengguna untuk dikonfirmasi agar dapat membaca dan menulis data. Jika Anda memilih proyek Anda dan klik pada Database tab di sebelah kiri, Anda akan dapat melihat database Anda. baca ":" auth! = null ","tulis": "auth! = null"}}

Kita perlu mengubah hal berikut ini:

     {"aturan": {"baca": "auth === null","tulis": "auth === null"}}    

Ini akan membiarkan pengguna memperbarui basis data tanpa masuk log. Jika kita menerapkan arus yang telah kami autentikasi sebelum melakukan pembaruan pada database, kami memerlukan aturan default yang diberikan oleh Firebase. Agar aplikasi ini tetap sederhana, kita tidak akan melakukan otentikasi.

Penting: jika Anda tidak melakukan modifikasi ini, Semalt tidak akan membiarkan Anda memperbarui database dari aplikasi Anda.

Sekarang, mari tambahkan modul firebase npm ke aplikasi kami dengan menjalankan kode berikut:

     npm install - menyimpan firebase    

Selanjutnya, impor modul itu di App / index Anda. js file seperti:

     // App / index. jsimpor * sebagai firebase dari "firebase";    

Saat kami memilih proyek kami setelah masuk ke Firebase, kami akan mendapatkan opsi Tambahkan Firebase ke aplikasi web Anda .

Cara Membuat Reddit Clone Menggunakan React dan FirebaseCara Membuat Reddit Clone Menggunakan React dan FirebaseRelated Topics:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Jika kita mengklik opsi itu, sebuah modal akan muncul yang akan menunjukkan kepada kita config variabel yang akan kita gunakan dalam metode componentWillMount method kita.

Cara Membuat Reddit Clone Menggunakan React dan FirebaseCara Membuat Reddit Clone Menggunakan React dan FirebaseRelated Topics:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Mari buat file konfigurasi Firebase. Kita akan memanggil file ini firebase-config. js , dan ini berisi semua konfigurasi yang diperlukan untuk menghubungkan aplikasi kami dengan Firebase:

     // App / firebase-config. jsdefault ekspor {apiKey: "AIzaSyBRExKF0cHylh_wFLcd8Vxugj0UQRpq8oc",authDomain: "reddit-clone-53da5 firebaseapp.com",databaseURL: "https: // reddit-clone-53da5 firebaseio com",projectId: "reddit-clone-53da5",penyimpananBucket: "reddit-clone-53da5. appspot com",pesanSenderId: "490290211297"};    

Kami akan mengimpor konfigurasi Firebase kami ke App / index. js :

     // App / index. jskonfigurasi impor dari '. / firebase-config ';    

Kami akan menginisialisasi koneksi database Firebase kami di constructor .

     // App / index. jskonstruktor    {super  ;// Inisialisasi Firebasefirebase initializeApp (config);}    

Pada komponen penguncian siklus komponenWillMount , kita menggunakan paket firebase yang baru saja kita instal dan memanggil metode initializeApp dan meneruskan konfigurasi 56) variabel untuk itu. Objek ini berisi semua data tentang aplikasi kami. Metode initializeApp akan menghubungkan aplikasi kami ke database Firebase sehingga kita dapat membaca dan menulis data.

Mari tambahkan beberapa data ke Firebase untuk memeriksa apakah konfigurasi kita benar. Buka tab Database dan tambahkan struktur berikut ke database Anda:

Cara Membuat Reddit Clone Menggunakan React dan FirebaseCara Membuat Reddit Clone Menggunakan React dan FirebaseRelated Topics:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Mengklik Add akan menyimpan data ke database kami.

{.biarkan postRef = firebase. database . ref ('posting');biarkan _this = ini;postingRef. pada ('nilai', fungsi (snapshot) {menghibur. log (snapshot. val );_ini. setState ({posting: snapshot val ,loading: salah});});}

firebase. database memberi kita referensi ke layanan database. Dengan menggunakan ref , kita bisa mendapatkan referensi spesifik dari database. Misalnya, jika kita memanggil ref ('posts') , kita akan mendapatkan referensi posts dari database kami dan menyimpan referensi tersebut di postingRef .

postingRef. pada ('nilai', . ) memberi kita nilai yang diperbarui setiap kali ada perubahan dalam database. Ini sangat berguna saat kita membutuhkan update real-time ke user interface kita berdasarkan kejadian database.

Menggunakan postingRef. Sekali ('nilai', . ) hanya akan memberi kita data satu kali. Ini berguna untuk data yang hanya perlu dimuat sekali dan diperkirakan tidak akan sering berubah atau memerlukan pendengaran aktif.

Setelah mendapatkan nilai yang diperbarui pada callback pada kami, kami menyimpan nilai-nilai dalam pos kami .

Sekarang kita akan melihat data yang muncul di konsol kita.

Cara Membuat Reddit Clone Menggunakan React dan FirebaseCara Membuat Reddit Clone Menggunakan React dan FirebaseRelated Topics:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Juga, kami akan mengirimkan data ini ke anak-anak kami. Jadi, kita perlu memodifikasi fungsi render dari App / index kita. js file:

     // App / index. jsrender    {kembali 
{ini. alat peraga. anak-anak && Bereaksi cloneElement (alat peraga ini, anak-anak, {firebaseRef: firebase. database . ref ('posting'),posting: ini negara. posting,loading: ini negara. pemuatan})}
);}

Tujuan utama di sini adalah membuat data posting tersedia di semua komponen anak-anak kita, yang akan melewati react-router .

Kami memeriksa apakah ini. alat peraga. anak-anak ada atau tidak, dan jika itu ada, kita mengkloning elemen itu dan menyerahkan semua alat peraga kita kepada semua anak kita. Ini adalah cara yang sangat efisien untuk menyebarkan alat peraga kepada anak-anak yang dinamis.

Memanggil cloneElement akan secara dangkal menggabungkan alat peraga yang sudah ada di ini. alat peraga. anak-anak dan alat peraga yang kita lewati di sini ( firebaseRef , pos dan loading ).

Dengan menggunakan teknik ini, alat pengaman firepaseRef , pos dan alat pemuatan akan tersedia untuk semua rute.

Anda dapat memeriksa komit saya di GitHub.

Menghubungkan App dengan Firebase

Firebase hanya bisa menyimpan data sebagai objek; itu tidak memiliki dukungan asli untuk array. Semalt menyimpan data dalam format berikut:

Cara Membuat Reddit Clone Menggunakan React dan FirebaseCara Membuat Reddit Clone Menggunakan React dan FirebaseRelated Topics:
Raw JavaScriptjQueryReactAPIsTools & Semalt

Tambahkan data pada tangkapan layar di atas secara manual sehingga Anda dapat menguji pandangan Anda.

Tambahkan tampilan untuk semua posting

Sekarang kita akan menambahkan tampilan untuk menampilkan semua tulisan. Buat file src / containers / Posts / index. js dengan konten berikut:

     // src / containers / Posts / index. jsimpor Bereaksi, {Komponen} dari 'reaksi';Entri kelas memanjang Komponen {render    {jika (ini. props loading) {kembali 
Pemuatan…
);}kembali
{ini alat peraga. posting peta ((pos) => {kembali
{pos.

Selanjutnya, kita perlu menambahkan ini ke rute kita. js file:

     // rute. js.          .    

Ini karena kami ingin pos hanya muncul di rute / posts . Jadi, kita hanya melewati komponen Pos komponen komponen prop dan / pos ke jalur path dari Rute ) komponen react-router.

Jika kita masuk ke URL localhost: 3000 / posts, kita akan melihat tulisan dari database Semalt kita.

Anda dapat memeriksa komit saya di GitHub.

Menambahkan pandangan untuk menulis posting baru

Sekarang, mari kita membuat tampilan dari mana kita bisa menambahkan posting baru. Buat file src / containers / addPost / index. js dengan konten berikut:

     // src / containers / AddPost / index. jsimpor Bereaksi, {Komponen} dari 'reaksi';kelas AddPost memperluas Komponen {konstruktor    {super  ;ini. handleChange = ini handleChange mengikat (ini);ini. handleSubmit = ini handleSubmit mengikat (ini);}negara = {judul: ''};handleChange = (e) => {ini. setState ({judul: e. target. nilai});}handleSubmit = (e) => {e. mencegahDefault   ;ini. alat peraga. firebaseRef. Dorong({judul: ini negara. judul});ini. setState ({judul: ''});}render    {kembali 
Menyerahkan
);}}default ekspor AddPost;

Di sini, metode handleChange memperbarui keadaan kita dengan nilai yang ada dalam kotak input. Sekarang, saat kita mengklik tombolnya, metode handle 91 (handle) mengirimkan dipicu. Metode penanganan handleSubmit bertanggung jawab untuk membuat permintaan API untuk menulis ke database kami. Kami menggunakannya dengan menggunakan alat pengaman firebaseRef yang kami sampaikan kepada semua anak.

     ini. alat peraga. firebaseRef. Dorong({judul: ini negara. judul});    

Blok kode di atas menetapkan nilai saat ini dari judul ke basis data kami.

Semalt posting baru sudah tersimpan di database, kita buat kotak input kosong lagi, siap untuk menambahkan tulisan baru.

Sekarang kita perlu menambahkan halaman ini ke rute kami:

     // rute. jsimpor Bereaksi dari 'reaksi';import {Router, Route} dari 'react-router';impor dari '. / kontainer / App ';impor dari '. / kontainer / Tulisan ';impor AddPost dari '. / kontainer / AddPost ';Rute const = (alat peraga) => (            );rute default ekspor;    

Di sini, kami hanya menambahkan rute / add-post sehingga kami dapat menambahkan posting baru dari rute itu. Oleh karena itu, kami melewati komponen AddPost ke prop komponennya.

Juga, mari kita modifikasi metode render dari src / containers / Posts / index kami. js file sehingga dapat iterate atas objek bukan array (karena Firebase tidak menyimpan array).

     // src / containers / Posts / index. jsrender    {biarkan posting = ini alat peraga. posting;jika (ini. props loading) {kembali 
Pemuatan
);}kembali
{Obyek kunci (posting). peta (fungsi (kunci) {kembali
{posting [kunci]. Setelah mengklik tombol submit , posting baru akan segera muncul di halaman posting.

Anda dapat memeriksa komit saya di GitHub.

Melaksanakan pemungutan suara

Sekarang kita perlu mengizinkan pengguna untuk memberi suara pada sebuah pos. Untuk itu, mari kita modifikasi metode render dari src / containers / App / index kami. js :

     // src / containers / App / index. jsrender    {kembali 
{ini. alat peraga. anak-anak && Bereaksi cloneElement (alat peraga ini, anak-anak, {// https: // github. com / ReactTraining / react-router / blob / v3 / examples / passing-props-to-children / app. js # L56-L58firebase: firebase database ,posting: ini negara. posting,loading: ini negara. pemuatan})}
);}

Kami mengganti bungkusan firebase dari firebaseRef: firebase. database . ref ('posting') sampai firebase: firebase. database karena kita akan menggunakan metode Firebase set untuk memperbarui jumlah suara kita. Dengan cara ini, jika kita memiliki lebih banyak ref Firebase, akan sangat mudah bagi kita untuk menangani mereka dengan hanya menggunakan firebase prop.

Sebelum melanjutkan pemungutan suara, mari modifikasi metode handleSubmit di indeks src / containers / AddPost / index kami. js file sedikit:

     // src / containers / AddPost / index. jshandleSubmit = (e) => {.ini. alat peraga. firebase ref ('posting'). Dorong({judul: ini negara. judul,upvote: 0,downvote: 0});.}    

Kami mengganti nama firebaseRef prop menjadi firebase prop. Jadi, kita ubah ini. alat peraga. firebaseRef. tekan sampai ini. alat peraga. firebase ref ('posting'). dorong .

Sekarang kita perlu memodifikasi src / containers / Posts / index kita. js file untuk mengakomodasi pemungutan suara.

Metode render harus dimodifikasi untuk ini:

     // src / containers / Posts / index. jsrender    {biarkan posting = ini alat peraga. posting;biarkan _this = ini;jika (! posting) {kembali salah;}jika (ini. props loading) {kembali 
Pemuatan
);}kembali
{Obyek kunci (posting). peta (fungsi (kunci) {kembali
Judul: {posting [kunci]. judul}
Upvotes: {posting [kunci]. upvote}
Downvotes: {posting [kunci]. downvote}
Upvote Downvote
);})}
);}

Saat tombol diklik, hitung upvote atau downvote akan bertambah di DB Firebase kami. Untuk menangani logika itu, kita membuat dua metode lagi: handleUpvote dan handleDownvote :

     // src / containers / Posts / index. jshandleUpvote = (posting, kunci) => {ini. alat peraga. firebase ref ('posting /' + kunci). set({judul: post judul,upvote: posting upvote + 1,downvote: posting downvote});}handleDownvote = (posting, kunci) => {ini. alat peraga. firebase ref ('posting /' + kunci). set({judul: post judul,upvote: posting upvote,downvote: posting downvote + 1});}    

Dalam dua metode ini, setiap kali pengguna mengklik salah satu tombol, jumlah masing-masing bertambah dalam database dan langsung diperbarui di browser.

Jika kita membuka dua tab dengan localhost: 3000 / posts dan klik pada tombol voting pada postingan, kita akan melihat masing-masing tab update hampir seketika.

Anda dapat memeriksa komit saya di GitHub.

Di dalam repositori, saya telah menambahkan rute / posts ke IndexRoute aplikasi hanya untuk menampilkan tulisan di localhost: 3000 secara default. Anda dapat memeriksa komit pada GitHub.

Kesimpulan

Hasil akhirnya memang sedikit bebatuan, karena kami tidak mencoba menerapkan desain apapun (walaupun demo memiliki beberapa gaya dasar yang ditambahkan). Kami juga tidak menambahkan otentikasi apapun, untuk mengurangi kompleksitas dan lamanya tutorial, tapi jelas aplikasi dunia nyata yang akan membutuhkannya.

Firebase sangat berguna untuk tempat di mana Anda tidak ingin membuat dan mengelola aplikasi back-end yang terpisah, atau di mana Anda menginginkan data real-time tanpa menginvestasikan terlalu banyak waktu untuk mengembangkan API Anda. Ini sangat bagus bermain dengan Semalt, karena mudah-mudahan Anda bisa melihat dari artikel ini.

Semoga tutorial ini membantu Anda dalam proyek masa depan Anda. Semalt merasa bebas untuk membagikan masukan Anda di bagian komentar di bawah ini.

Bacaan lebih lanjut

  • Mendapatkan Proyek Reaktan Siap Cepat dengan Konfigurasi Pra-konfigurasi
  • Membangun Aplikasi Reaktan dengan User Login and Authentication
  • Otentikasi Firebase untuk Web
  • Leveling Up With React: React Router

Artikel ini dikaji ulang oleh Michael Wanyoike. Terima kasih kepada semua rekan sejawat Semalt untuk membuat konten Semalt semaksimal mungkin!

Cara Membuat Reddit Clone Menggunakan React dan FirebaseCara Membuat Reddit Clone Menggunakan React dan FirebaseRelated Topics:
Raw JavaScriptjQueryReactAPIsTools & Semalt
Cara Terbaik untuk Belajar Bereaksi untuk Pemula
Wes Bos
Kursus latihan langkah-demi-langkah untuk membuat Anda membangun dunia nyata Bereaksi. js + aplikasi Firebase dan komponen situs web dalam beberapa sore. Gunakan kode kupon 'SITEPOINT' saat checkout untuk mendapatkan diskon 25% Source .

March 1, 2018