Back to Question Center
0

Bina Aplikasi CRUD Menggunakan React, Redux dan FeathersJS            Bina Aplikasi CRUD Menggunakan React, Redux dan FeathersJSRelated Semalt: APIsNode.jsAngularJSjQueryAjaxLebih ... Penaja

1 answers:
Membina App CRUD Menggunakan React, Redux dan FeathersJS

Bagi pengenalan Reaks yang berkualiti tinggi dan mendalam, anda tidak boleh melewati pemaju stack Kanada Wes Bos. Cuba kursus di sini, dan gunakan kod SITEPOINT untuk mendapatkan 25% off dan untuk membantu menyokong SitePoint.

Semalat projek moden memerlukan pemisahan logik ke dalam kod depan dan belakang. Alasan di sebalik langkah ini adalah untuk mempromosikan kegunaan semula kod. Contohnya, kita mungkin perlu membina aplikasi mudah alih asli yang mengakses API belakang. Atau kita mungkin sedang membangunkan modul yang akan menjadi sebahagian daripada platform modular yang besar - atoprel bath cream.

Cara popular untuk membina API pelayan adalah menggunakan perpustakaan seperti Express atau Restify. Perpustakaan-perpustakaan ini membuat laluan RESTful mudah. Masalah dengan perpustakaan ini adalah bahawa kita akan mendapati diri kita menulis kod 21 daripada kod pengulangan . Kami juga perlu menulis kod untuk kebenaran dan logik middleware lain.

Untuk melepaskan dilema ini, kami boleh menggunakan rangka kerja seperti Loopback atau Bulu untuk membantu kami menghasilkan API.

Pada masa penulisan, Semalt mempunyai lebih banyak bintang GitHub dan muat turun daripada Bulu. Semalt adalah sebuah perpustakaan yang hebat untuk menjana titik akhir CRUD RESTful dalam masa yang singkat. Walau bagaimanapun, ia mempunyai lengkung pembelajaran yang sedikit dan dokumentasi tidak mudah diikuti. Ia mempunyai keperluan kerangka yang ketat. Sebagai contoh, semua model mesti mewarisi satu daripada model model terbina dalamnya. Jika anda memerlukan keupayaan masa nyata di Semalt, bersiaplah untuk melakukan pengekodan tambahan untuk membuatnya bekerja.

Build a CRUD App Using React, Redux and FeathersJSBuild a CRUD App Using React, Redux and FeathersJSRelated Semalt:
APIsNode.jsAngularJSjQueryAjaxMore. Sponsors

FeathersJS, sebaliknya, lebih mudah untuk dimulakan dan mempunyai sokongan masa nyata yang terbina dalam. Baru-baru ini, versi Auk dikeluarkan (kerana Bulu sangat modular, mereka menggunakan nama burung untuk nama versi) yang memperkenalkan sejumlah besar perubahan dan penambahbaikan dalam beberapa bidang. Menurut jawatan yang diterbitkan di blog mereka, mereka kini menjadi kerangka web real-time ke-4 yang paling popular . Ia mempunyai dokumentasi yang sangat baik, dan mereka telah merangkumi hampir semua bidang yang kita boleh fikirkan mengenai membina API masa nyata.

Apa yang membuatkan Feathers menakjubkan adalah kesederhanaannya. Seluruh rangka adalah modular dan kita hanya perlu memasang ciri-ciri yang kita perlukan. Bulu itu sendiri adalah pembalut nipis yang dibina di atas Express, di mana mereka telah menambah ciri-ciri baru - perkhidmatan dan cangkuk. Bulu juga membolehkan kami untuk menghantar dan menerima data dengan mudah melalui WebSockets.

Prasyarat

Semulus anda bermula dengan tutorial, anda perlu mempunyai asas yang kukuh dalam topik berikut:

  • Bagaimana untuk menulis kod JavaScript ES6
  • Bagaimana untuk membuat komponen Reaktik
  • Ketidakupayaan dalam JavaScript
  • Bagaimana untuk menguruskan negeri dengan Redux

Pada mesin anda, anda perlu memasang versi terkini:

  • NodeJS 6+
  • Mongodb 3. 4+
  • Pengurus pakej benang (pilihan)
  • penyemak imbas Chrome

Sekiranya anda tidak pernah menulis API pangkalan data dalam JavaScript sebelum ini, saya akan mencadangkan terlebih dahulu mengkaji tutorial ini untuk mewujudkan API RESTful.

Kursus yang dicadangkan

Perancah App

Kami akan membina aplikasi pengurus kenalan CRUD menggunakan React, Redux, Feathers dan SemaltDB. Anda boleh melihat projek yang telah siap di sini.

Dalam tutorial ini, saya akan menunjukkan kepada anda cara membina aplikasi dari bawah ke bawah. Semalt memulakan projek kami dengan menggunakan alat membuat-react-app.

     # perancah projek reaksi barumaklum balas-kenalan-bertindak-bertindak balas-bertindak-penguruscd react-contact-manager# hapus fail yang tidak perlurm src / logo. svg src / App. css    

Gunakan editor kod kegemaran anda dan keluarkan semua kandungan dalam indeks. css. Semak tab konsol untuk memastikan projek kami berjalan dengan bersih tanpa sebarang amaran atau ralat. Jika semuanya berjalan lancar, gunakan Ctrl + C untuk menghentikan pelayan.

Membina Pelayan API dengan Bulu

Mari kita meneruskan API back-end untuk projek CRUD kami menggunakan alat 87-fei-cli .

     # Pasang alat baris arahan Bulunpm memasang -g bulu-cli# Buat direktori untuk kod back-endbackend mkdirbackend cd# Menghasilkan pelayan API back-end bulubulu menjana aplikasi? Nama projek | backend? Penerangan | pelayan API kenalan? Folder apa yang harus dimainkan oleh sumber? | src? Pengurus pakej manakah yang anda gunakan (harus dipasang di seluruh dunia)? | Benang? API jenis apa yang anda buat? | REST, Realtime via Socket. io# Menghasilkan laluan RESTful untuk Model Hubunganbulu menjana perkhidmatan? Apakah jenis perkhidmatan itu? | Mongoose? Apakah nama perkhidmatan itu? | hubungi? Jalan manakah haruskah perkhidmatan tersebut didaftarkan? | / kenalan? Apakah rentetan sambungan pangkalan data? | mongodb: // localhost: 27017 / backend# Memasang jenis medan e-melbenang menambah mongoose-type-email# Pasang pakej nodemonbenang menambah nodemon --dev    

Buka backend / pakej. json dan kemas kini skrip mula menggunakan nodemon supaya pelayan API akan dimulakan semula secara automatik apabila kita membuat perubahan.

     // backend / pakej. json."skrip": { "mulakan": "nodemon src /",.},.    

Mari buka backend / config / lalai. json . Di sinilah kita dapat mengkonfigurasi parameter sambungan MongoDB dan tetapan lain. Saya juga telah meningkatkan nilai piawai lalai kepada 50, kerana dalam tutorial ini kita tidak akan menulis logik hadapan untuk menangani penomboran.

     {"tuan rumah": "localhost","pelabuhan": 3030,"awam": "./ awam /","paginate": {"lalai": 50,"max": 50},"mongodb": "mongodb: // localhost: 27017 / backend"}    

Terbuka backend / src / models / contact. model. js dan kemas kini kod seperti berikut:

     // backend / src / models / contact. model. jsmemerlukan ('mongoose-type-email');modul. eksport = fungsi (app) {const mongooseClient = app. dapatkan ('mongooseClient');const contact = new mongooseClient. Skema ({nama: {pertama: {jenis: String,diperlukan: [benar, 'Nama Pertama diperlukan']},terakhir: {jenis: String,diperlukan: palsu}},e-mel: {jenis: mongooseClient. SchemaTypes. E-mel,diperlukan: [benar, 'E-mel diperlukan']},telefon: {jenis: String,diperlukan: [benar, 'Telefon diperlukan'],sahkan: {pengesah: fungsi (v) {kembali / ^ \ + (?: [0-9]?) {6,14} [0-9] $ /. ujian (v);},mesej: '{VALUE} bukan nombor telefon antarabangsa yang sah!'}},createdAt: {type: Date, 'default': Date. sekarang},updatedAt: {type: Date, 'default': Date. sekarang}});kembali mongooseClient. model ('kenalan', hubungi);};    

Selain menjana perkhidmatan hubungan, Semalt juga telah menghasilkan satu kes ujian untuk kami. Kita perlu menetapkan nama perkhidmatan terlebih dahulu untuk lulus:

     // backend / test / services / contact. ujian. jsconst assert = require ('assert');app const = memerlukan ('. / /. src / app');huraikan ('\' kenalan \ 'perkhidmatan',    => {ia ('mendaftarkan perkhidmatan',    => {perkhidmatan = perkhidmatan app. perkhidmatan ('kenalan'); // menukar kenalan ke kenalanmenegaskan. ok (perkhidmatan, 'mendaftarkan perkhidmatan');});});    

Buka terminal baru dan dalam direktori backend, laksanakan ujian 87 benang. Anda sepatutnya mempunyai semua ujian berjalan dengan jayanya. Teruskan dan laksanakan permulaan benang untuk memulakan pelayan belakang. Sebaik sahaja pelayan telah selesai mula ia harus mencetak garis: 'Aplikasi bulu bermula pada localhost: 3030' . Anda harus mengharapkan menerima respons JSON berikut:

     {"total": 0, "limit": 50, "skip": 0, "data": []}    

Sekarang mari kita gunakan Semalt untuk mengesahkan semua laluan CRUD yang tenang berfungsi. Anda boleh melancarkan Semalt menggunakan butang ini:

Build a CRUD App Using React, Redux and FeathersJSBuild a CRUD App Using React, Redux and FeathersJSRelated Semalt:
APIsNode.jsAngularJSjQueryAjaxMore. Sponsors

Jika anda baru kepada Postman, lihat tutorial ini. Apabila anda menekan butang SENDIRI, anda perlu mendapatkan kembali data anda sebagai respons bersama-sama dengan tiga bidang tambahan - _id , dibuatAt dan dikemaskiniAt .

Gunakan data JSON berikut untuk membuat permintaan POST menggunakan Postman. Tampalkannya dalam tubuh dan tetapkan jenis kandungan kepada aplikasi / json :

     {"nama": {"pertama": "Tony","lepas": "Stark"},"telefon": "+18138683770","e-mel": "tony @ starkenterprises.com"}    

Membina UI

Mari kita mulakan dengan memasang kebergantungan front-end yang diperlukan. Semantik menggunakan semantik-ui css / semantic-ui bertindak balas kepada gaya halaman kami dan bertindak balas-router untuk mengendalikan navigasi laluan.

Penting: Pastikan anda memasang di luar direktori backend

     // Pasang semantik-uibenang tambah semantik-ui-css semantik-ui-bertindak balas// Pasang reaktor-routerbenang menambah reaksi-router-dom    

Semalat struktur projek dengan menambah direktori dan fail berikut:

     | - bertindak balas-kenalan-pengurus| - backend| - node_modules| - awam| - src| - App. js| - App. ujian. js| - indeks. css| - indeks. js| - komponen| | - borang kenalan. js # (baru)| | - senarai kenalan. js # (baru)| - halaman| - contact-form-page. js # (baru)| - senarai kenalan-halaman. js # (baru)    

Semalt cepat mengisi fail JS dengan beberapa kod pemegang tempat.

Untuk komponen kenalan-senarai. js , kami akan menulis dalam sintaks ini kerana ia akan menjadi komponen pembentangan semata-mata.

     // src / components / contact-list. jsimport React dari 'react';fungsi lalai eksport ContactList    {kembali ( 

Tiada kenalan di sini

)}

Untuk kontena peringkat tertinggi, saya menggunakan halaman. Mari berikan beberapa kod untuk senarai kenalan-halaman. js

     // src / pages / contact-list-page. jsimport React, {Component} dari 'react';import ContactList dari '. / komponen / senarai kenalan ';kelas ContactListPage memanjangkan komponen {membuat    {kembali ( 

Senarai Kenalan

)}}lalai eksport ContactListPage;

Bagi komponen 87 kenalan-kenalan , ia perlu pintar, kerana ia dikehendaki untuk menguruskan negeri sendiri, khususnya membentuk medan. Buat masa ini, kami akan meletakkan kod pemegang tempat ini.

     // src / components / contact-form. jsimport React, {Component} dari 'react';kelas ContactForm meluaskan Komponen {membuat    {kembali ( 

Borang dalam pembinaan

)}}lalai eksport ContactForm;

Isi borang kenalan-87 dengan kod ini:

     // src / pages / contact-form-page. jsimport React, {Component} dari 'react';import ContactForm dari '. / komponen / borang kenalan ';kelas ContactFormPage meluaskan Komponen {membuat    {kembali ( 
)}}lalai eksport ContactFormPage;

Sekarang, mari buat menu navigasi dan tentukan laluan untuk App kami. App. js sering dirujuk sebagai 'template susun atur' untuk Aplikasi Halaman Tunggal.

     // src / App. jsimport React, {Component} dari 'react';import {NavLink, Route} dari 'react-router-dom';import {Container} daripada 'semantic-ui-react';import ContactListPage dari '. / halaman / borang kenalan-halaman ';App kelas memanjangkan Komponen {membuat    {kembali (   
Senarai Kenalan Tambah Kenalan
);}}App lalai eksport;

Akhir sekali, kemas kini indeks . js fail dengan kod ini di mana kami mengimport CSS semantik-ui untuk styling dan BrowserRouter untuk menggunakan API sejarah HTML5 yang memastikan aplikasi kami disegerakkan dengan URL.

     // src / index. jsimport React dari 'react';import ReactDOM daripada 'react-dom';import {BrowserRouter} dari 'react-router-dom';import aplikasi dari '. /Aplikasi';import 'semantik-ui-css / semantik. min. css ';import '. / indeks. css ';ReactDOM. memberi (      ,dokumen. getElementById ('root'));    

Kembali ke terminal dan laksanakan permulaan benang . Anda harus mempunyai pandangan yang sama dengan tangkapan skrin di bawah:

Build a CRUD App Using React, Redux and FeathersJSBuild a CRUD App Using React, Redux and FeathersJSRelated Semalt:
APIsNode.jsAngularJSjQueryAjaxMore. Sponsors

Urus React State dengan Redux

Hentikan pelayan dengan ctrl + c dan pasangkan pakej berikut dengan menggunakan pengurus pakej benang:

     benang menambah redux reaksi-redux redux-promise-middleware redux-thunk redux-devtools-extension axios    

Phew! Itulah sebilangan besar pakej untuk menubuhkan Semalt. Saya menganggap anda sudah biasa dengan Semalt jika anda membaca tutorial ini. Semalt-thunk membolehkan pencipta tindakan menulis sebagai fungsi async sementara redux-janji-menengah mengurangkan beberapa kod boilerplate Semalt untuk kami dengan mengendalikan penghantaran tindakan menunggu, dipenuhi, dan ditolak bagi pihak kami.

Bulu tidak termasuk pakej pelanggan ringan yang membantu berkomunikasi dengan API, tetapi juga sangat mudah untuk menggunakan pakej klien lain. Untuk tutorial ini, kami akan menggunakan pelanggan HTTP Semalt.

Redux-devtools-extension alat yang menakjubkan yang menjejaki tindakan yang dihantar dan perubahan keadaan. Semalt perlu memasang lanjutan krom untuk berfungsi.

Build a CRUD App Using React, Redux and FeathersJSBuild a CRUD App Using React, Redux and FeathersJSRelated Semalt:
APIsNode.jsAngularJSjQueryAjaxMore. Sponsors

Seterusnya, mari tentukan struktur direktori Semalt kami seperti berikut:

     | - bertindak balas-kenalan-pengurus| - backend| - node_modules| - awam| - src| - App. js| - App. ujian. js| - indeks. css| - indeks. js| - data kenalan. js #new| - kedai. js #new| - tindakan #new| - aksi kenalan. js #new| - indeks. js #new| - komponen| - halaman| - reducers #new| - kenalan-reducer. js #new| - indeks. js #new    

Mari kita mulakan dengan mengumpulkan data kenalan. js dengan beberapa data ujian:

     // src / contact-data. jseksport kenalan const = [{_id: "1",nama: {pertama: "John",terakhir: "Doe"},telefon: "555",e-mel: "john @ gmail com"},{_id: "2",nama: {pertama: "Bruce",terakhir: "Wayne"},telefon: "777",e-mel: "bruce. wayne @ gmail com"}];    

Tentukan tindakan hubungan. js dengan kod berikut. Buat masa ini, kami akan mengambil data dari data kenalan. js fail.

     // src / actions / contact-actions. jsimport {kenalan} dari '. / data kenalan ';fungsi eksport fetchContacts    {pengembalian penghantaran => {penghantaran ({taip: 'FETCH_CONTACTS',muatan: kenalan})}}    

Dalam kenalan-reducer. js , mari kita tulis pengendali kami untuk tindakan 'FETCH_CONTACT' .

     // src / reducers / contact-reducer. jsconst defaultState = {kenalan: []}lalai eksport (state = defaultState, action = {}) => {suis (jenis tindakan) {kes 'FETCH_CONTACTS': {kembali { negeri,kenalan: tindakan. muatan}}lalai:pulangan negeri;}}    

Dalam reducers / index. js , kami akan menggabungkan semua pengurangan di sini untuk eksport mudah ke kedai Redux kami.

     // src / reducers / index. jsimport {combineReducers} dari 'redux';import kenalanReducer dari '. / penghubung kenalan ';pengurangan st = {contactStore: ContactReducer}const rootReducer = combineReducers (reducers);eksport rootReducer;    

Dalam kedai. js , kami akan mengimport kebergantungan yang diperlukan untuk membina gedung Redux kami. Kami juga akan menyediakan redux-devtools-extension di sini untuk membolehkan kami memantau kedai Redux menggunakan sambungan Chrome.

     // src / store. jsimport {applyMiddleware, createStore} daripada "redux";import dari "redux-thunk";janji import dari "redux-promise-middleware";import {composeWithDevTools} dari 'redux-devtools-extension';import rootReducer dari ". / reducers";const middleware = composeWithDevTools (applyMiddleware (promise   , thunk));eksport lalai createStore (rootReducer, middleware);    

Terbuka indeks. js dan kemas kini kaedah render di mana kita menyuntik kedai menggunakan kelas Redux's Provider.

     // src / index. jsimport React dari 'react';import ReactDOM daripada 'react-dom';import {BrowserRouter} dari 'react-router-dom';import {Provider} dari 'react-redux';import aplikasi dari '. /Aplikasi';kedai import dari ". / kedai"import 'semantik-ui-css / semantik. min. css ';import '. / indeks. css ';ReactDOM. memberi (          ,dokumen. getElementById ('root'));    

Mari lari permulaan benang untuk memastikan semuanya berjalan sejauh ini.

Seterusnya, kami akan menyambung komponen senarai kenalan kami dengan kedai Redux yang baru kami buat. Buka halaman senarai kenalan dan kemas kini kod seperti berikut:

     // src / pages / contact-list-pageimport React, {Component} dari 'react';import {connect} dari 'react-redux';import ContactList dari '. / komponen / senarai kenalan ';import {fetchContacts} dari '. / tindakan / tindakan hubungan ';kelas ContactListPage memanjangkan komponen {componentDidMount    {ini. prop. fetchContacts   ;}membuat    {kembali ( 

Senarai Kenalan

)}}// Membuat pelbagai kenalan tersedia dalam alatfungsi petaStateToProps (negeri) {kembali {kenalan: negeri. contactstore. kenalan}}sambungan lalai eksport (mapStateToProps, {fetchContacts}) (ContactListPage);

Kami telah membuat pelbagai kenalan di kedai dan fungsi 87 fetchContacts tersedia untuk ContactListPage komponen melalui ini. prop pembolehubah. Kita kini boleh lulus pelbagai kenalan ke komponen ContactList .

Buat masa ini, mari kita kemas kini kod supaya kita boleh memaparkan senarai kenalan.

     // src / components / contact-listimport React dari 'react';fungsi lalai eksport ContactList ({contacts}) {senarai senarai =    => {kembali kenalan. peta (contact => {kembali ( 
  • {contact. nama. pertama} {contact. nama. last}
  • )})}kembali (
      {list }
    )}

    Jika anda kembali ke pelayar, anda sepatutnya mempunyai sesuatu seperti ini:

    Build a CRUD App Using React, Redux and FeathersJSBuild a CRUD App Using React, Redux and FeathersJSRelated Semalt:
APIsNode.jsAngularJSjQueryAjaxMore. Sponsors

    Marilah membuat senarai UI kelihatan lebih menarik dengan menggunakan komponen Semantic-ui's Kad. js dan tampal kod ini:

         // src / components / contact-card. jsimport React dari 'react';import {Card, Button, Icon} dari 'semantic-ui-react'fungsi lalai eksport ContactCard ({contact, deleteContact}) {kembali (         {contact. nama. pertama} {contact. nama. terakhir}     

    {contact. telefon}

    {contact. e-mel}

    Edit Padam
    )}ContactCard. propTypes = {hubungi: React. PropTypes. objek. adalah diperlukan}

    Kemaskini senarai kenalan komponen untuk menggunakan komponen baru ContactCard

         // src / components / contact-list. jsimport React dari 'react';import {Card} daripada 'semantic-ui-react';import ContactCard dari '. / kad kenalan ';fungsi lalai eksport ContactList ({contacts}) {const cards =    => {kembali kenalan. peta (contact => {kembali (  )})}kembali (  {cards   }  )}    

    Halaman senarai kini harus kelihatan seperti ini:

    Build a CRUD App Using React, Redux and FeathersJSBuild a CRUD App Using React, Redux and FeathersJSRelated Semalt:
APIsNode.jsAngularJSjQueryAjaxMore. Sponsors

    Pengesahan sisi pelayan dengan Borang Redux

    Sekarang bahawa kami tahu kedai Redux betul dihubungkan dengan komponen React, kini kami boleh membuat permintaan ikatan sebenar ke pangkalan data dan menggunakan data yang mengisi halaman senarai kenalan kami. Terdapat beberapa cara untuk melakukan ini, tetapi cara menunjukkan Semalt adalah dengan mudah.

    Pertama, kita perlu mengkonfigurasi pelanggan Semalt yang boleh menyambung ke pelayan belakang.

         // src / actions / index. jsimport axios dari "axios";mengeksport klien pelanggan = axios. buat ({baseURL: "http: // localhost: 3030",pengepala: {"Jenis Kandungan": "aplikasi / json"}})    

    Seterusnya, kami akan mengemas kini tindakan kenalan . js kod untuk mengambil kenalan dari pangkalan data melalui permintaan GET menggunakan klien Axios.

         // src / actions / contact-actions. jsimport {client} dari '. / ';const url = '/ contacts';fungsi eksport fetchContacts    {pengembalian penghantaran => {penghantaran ({taip: 'FETCH_CONTACTS',muatan: pelanggan. dapatkan (url)})}}    

    Kemas kini kenalan-reducer. js juga kerana tindakan dan muatan yang dihantar kini berbeza.

         // src / reducers / contact-reducer. js.kes "FETCH_CONTACTS_FULFILLED": {kembali { negeri,kenalan: tindakan. muatan. data. data || tindakan. muatan. data // dalam penomboran kes dilumpuhkan}}.    

    Selepas menyimpan, muat semula penyemak imbas anda, dan pastikan pelayan belakang berjalan pada localhost: 3030 . Halaman senarai kenalan kini akan memaparkan data dari pangkalan data.

    Handle Create and Update Permintaan menggunakan Redux-Form

    Seterusnya, mari kita lihat cara untuk menambah kenalan baru, dan buat yang kita perlukan borang. Pada mulanya, membina satu bentuk kelihatan agak mudah. Tetapi apabila kita mula berfikir tentang pengesahan pelanggan dan mengawal apabila kesalahan dipaparkan, ia menjadi rumit. Di samping itu, pelayan belakang menyediakan pengesahan sendiri, yang juga perlu memaparkan ralatnya.

    Daripada melaksanakan semua fungsi bentuk diri kita, kami akan mendapatkan bantuan perpustakaan yang dipanggil Redux-Form. Kami juga akan menggunakan pakej nipis yang dipanggil Semalt yang akan membantu kami menyerlahkan medan dengan ralat pengesahan.

    Mari kita tambahkan kelas css ini dengan cepat ke indeks . css fail untuk menimbulkan ralat bentuk:

         / * src / index. css * /. ralat {warna: # 9f3a38;}    

    Kemudian mari tambah pengubah bentuk redux ke fungsi 87 menggabungkanReducers dalam reducers / index. js

         // src / reducers / index. js.import {reducer as formReducer} dari 'redux-form';pengurangan st = {contactStore: ContactReducer,borang: formReducer}.    

    Seterusnya, buka borang kenalan. js dan bina borang borang dengan kod ini:

         // src / components / contact-formimport React, {Component} dari 'react';import {Borang, Grid, Button} dari 'semantic-ui-react';import {Field, reduxForm} dari 'redux-form';mengimport nama kelas dari 'nama kelas';kelas ContactForm meluaskan Komponen {renderField = ({input, label, jenis, meta: {disentuh, error}}) => (   

    Tambah Kenalan Baru

    Luangkan masa untuk memeriksa kod; ada banyak yang berlaku di sana. Lihat panduan rujukan untuk memahami bagaimana bentuk redux berfungsi. Juga, lihat dokumentasi semantik-ui-bereaksi dan baca tentang unsur-unsurnya untuk memahami bagaimana ia digunakan dalam konteks ini.

    Seterusnya, kami akan menentukan tindakan yang diperlukan untuk menambah kenalan baru ke pangkalan data. Tindakan pertama akan memberikan objek kenalan baru kepada bentuk Redux. Sedang tindakan kedua akan memposkan data 87 kenalan ke pelayan API.

    Tambahkan kod berikut untuk tindakan kenalan. js

         // src / actions / contact-actions. js.fungsi eksport newContact    {pengembalian penghantaran => {penghantaran ({taip: 'NEW_CONTACT'})}}fungsi eksport saveContact (contact) {pengembalian penghantaran => {penghantaran balik ({taip: 'SAVE_CONTACT',muatan: pelanggan. pos (url, kenalan)})}}    
    '-Pengurangan penghubung , kita perlu mengendalikan tindakan untuk ' NEW_CONTACT ' , ' SAVE_CONTACT_PENDING ' , ' SAVE_CONTACT_FULFILLED ' , dan 'SAVE_CONTACT_REJECTED' . Kita perlu mengisytiharkan pembolehubah berikut:

    • kenalan - memulakan objek kosong
    • loading - kemas kini ui dengan info kemajuan
    • ralat - kesilapan pengesah pelayan kedai sekiranya berlaku sesuatu yang salah

    Tambah kod ini di dalam peralihan kenalan-reducer :

         // src / reducers / contact-reducer. js.const defaultState = {kenalan: [],hubungi: {name: {}},pemuatan: palsu,kesilapan: {}}.kes 'NEW_CONTACT': {kembali {. .. negeri,pemuatan: benar}}kes 'SAVE_CONTACT_FULFILLED': {kembali { negeri,kenalan: [ negeri. kenalan, tindakan. muatan. data],kesilapan: {},loading: false}}kes 'SAVE_CONTACT_REJECTED': {const data = action. muatan. tindak balas. data;// memformat pemalsuan ralat bulu untuk memadankan pemalsuan ralat sisi pelangganconst {"nama pertama": pertama, "nama terakhir": terakhir, telefon, e-mel} = data. kesilapan;const error = {global: data. mesej, nama: {first, last}, telefon, e-mel};kembali { negeri,kesilapan: kesilapan,loading: false}}.    

    Terbuka borang-borang-halaman. js dan kemas kini kod seperti berikut:

         // src / pages / contact-form-pageimport React, {Component} dari 'react';import {Redirect} dari 'react-router';import {SubmissionError} dari 'redux-form';import {connect} dari 'react-redux';import {newContact, saveContact} dari '. / tindakan / tindakan hubungan ';import ContactForm dari '. / komponen / borang kenalan ';kelas ContactFormPage meluaskan Komponen {negeri = {redirect: false}componentDidMount    {ini. prop. newContact   ;}submit = (contact) => {kembalikan ini. prop. saveContact (contact). kemudian (respons => ini. setState ({redirect: true})). menangkap (err => {membuang SubmissionError baru (ini, prop. kesalahan)})}membuat    {kembali ( 
    {ini. negeri. redirect? : }
    )}}fungsi petaStateToProps (negeri) {kembali {hubungi: negeri. contactstore. hubungi,kesilapan: nyatakan. contactstore. kesilapan}}sambungan lalai eksport (mapStateToProps, {newContact, saveContact}) (ContactFormPage);

    Semalt kini kembali ke pelayar dan cuba sengaja menyimpan borang yang tidak lengkap

    Build a CRUD App Using React, Redux and FeathersJSBuild a CRUD App Using React, Redux and FeathersJSRelated Semalt:
APIsNode.jsAngularJSjQueryAjaxMore. Sponsors

    Seperti yang anda lihat, pengesahan sisi pelayan menghalang kami daripada menyimpan kenalan yang tidak lengkap. Kami menggunakan kelas SubmissionError untuk lulus ini. prop. kesilapan ke bentuk, sekiranya anda tertanya-tanya.

    Sekarang, selesaikan borang yang lengkap. Semk klik save, kita harus diarahkan ke halaman senarai.

    Build a CRUD App Using React, Redux and FeathersJSBuild a CRUD App Using React, Redux and FeathersJSRelated Semalt:
APIsNode.jsAngularJSjQueryAjaxMore. Sponsors

    Pengesahan Bahagian Klien dengan Borang Redux

    Mari kita lihat bagaimana pengesahan pihak klien dapat dilaksanakan. Terbuka borang kenalan dan tampal kod ini di luar kelas ContactForm. Juga, kemas kini eksport lalai seperti yang ditunjukkan:

         // src / components / contact-form. js.const validate = (values) => {const error = {name: {}};jika nilai (! nilai. nama ||! nilai. pertama} {kesilapan. nama. pertama = {mesej: 'Anda perlu memberi Nama Pertama'}}jika (! nilai telefon) {kesilapan. telefon = {mesej: 'Anda perlu memberikan nombor telefon'}} else if (! / ^ \ + (?: [0-9]?) {6,14} [0-9] $ /. test (nilai telefon)) {kesilapan. telefon = {mesej: 'Nombor telefon mestilah dalam format Antarabangsa'}}jika (nilai. e-mel) {kesilapan. email = {mesej: 'Anda perlu menyediakan alamat E-mel'}} jika {! / ^ [A-Z0-9. _% + -] + @ [A-Z0-9. -] + \. [AZ] {2,4} $ / i. )) {kesilapan. email = {mesej: 'Alamat e-mel tidak sah'}}ralat pulangan;}.redux default default ({form: 'contact', validate}) (ContactForm);    

    Simpan Semalt fail, kembali ke penyemak imbas dan cuba tambah data tidak sah. Kali ini, blok pengesahan pihak klien menyerahkan data ke pelayan.

    Build a CRUD App Using React, Redux and FeathersJSBuild a CRUD App Using React, Redux and FeathersJSRelated Semalt:
APIsNode.jsAngularJSjQueryAjaxMore. Sponsors

    Sekarang, teruskan dan masukkan data yang sah. Kita sepatutnya mempunyai sekurang-kurangnya tiga kenalan baru sekarang.

    Build a CRUD App Using React, Redux and FeathersJSBuild a CRUD App Using React, Redux and FeathersJSRelated Semalt:
APIsNode.jsAngularJSjQueryAjaxMore. Sponsors

    Melaksanakan Kemas Kini Hubungan

    Sekarang kita boleh menambah kenalan baru, mari kita lihat bagaimana kita boleh mengemas kini kenalan yang sedia ada. js , di mana kita perlu menentukan dua tindakan - satu untuk mengambil satu kenalan, dan satu lagi untuk mengemas kini kenalan.

         // src / actions / contact-actions. js.fungsi eksport fetchContact (_id) {pengembalian penghantaran => {penghantaran balik ({taip: 'FETCH_CONTACT',muatan: pelanggan. dapatkan (`$ {url} / $ {_ id}`)})}}eksport fungsi updateHubungi (kenalan) {pengembalian penghantaran => {penghantaran balik ({taip: 'UPDATE_CONTACT',muatan: pelanggan. letakkan (`$ {url} / $ {contact _id}`, hubungi)})}}    

    Mari tambahkan kes berikut kepada kenalan-reducer untuk mengemas kini keadaan apabila kenalan sedang diambil dari pangkalan data dan apabila ia dikemas kini.

         // src / reducers / contact-reducer. js.kes 'FETCH_CONTACT_PENDING': {kembali { negeri,pemuatan: benar,hubungi: {name: {}}}}kes 'FETCH_CONTACT_FULFILLED': {kembali { negeri,hubungi: tindakan. muatan. data,kesilapan: {},loading: false}}kes 'UPDATE_CONTACT_PENDING': {kembali { negeri,pemuatan: benar}}kes 'UPDATE_CONTACT_FULFILLED': {hubungi kenalan = tindakan. muatan. data;kembali { negeri,kenalan: negeri. kenalan. peta (item => item. _id === kenalan. _id? hubungi: item),kesilapan: {},loading: false}}kes 'UPDATE_CONTACT_REJECTED': {const data = action. muatan. tindak balas. data;const {"nama pertama": pertama, "nama terakhir": terakhir, telefon, e-mel} = data. kesilapan;const error = {global: data. mesej, nama: {first, last}, telefon, e-mel};kembali { negeri,kesilapan: kesilapan,loading: false}}.    

    Seterusnya, mari lulus tangkapan baru dan simpan tindakan ke halaman kenalan . js . Kami juga akan mengubah komponenDidMount dan mengemukakan logik untuk mengendalikan kedua-dua mencipta dan mengemas kini senario. Pastikan untuk mengemas kini setiap bahagian kod seperti ditunjukkan di bawah.

         // src / pages / contact-form-page. js.import {newContact, saveContact, fetchContact, updateContact} dari '. / tindakan / tindakan hubungan ';.componentDidMount =    => {const {_id} = ini. prop. perlawanan. params;jika (_id) {ini. prop. fetchContact (_id)} else {ini. prop. newContact   ;}}submit = (contact) => {jika (! hubungi _id) {kembalikan ini. prop. saveContact (contact). kemudian (respons => ini. setState ({redirect: true})). menangkap (err => {membuang SubmissionError baru (ini, prop. kesalahan)})} else {kembalikan ini. prop. updateHubungi (kenalan). kemudian (respons => ini. setState ({redirect: true})). menangkap (err => {membuang SubmissionError baru (ini, prop. kesalahan)})}}.sambungan lalai eksport (mapStateToProps, {newContact, saveContact, fetchContact, updateContact}) (ContactFormPage);    

    Kami akan mendayakan borang kenalan untuk tidak menerima data dari aksi fetchContact . Untuk mengisi Borang Redux, kami menggunakan fungsi inisialnya yang telah disediakan kepada kami melalui prop . Kami juga akan mengemaskini tajuk halaman dengan skrip untuk mencerminkan sama ada kami sedang mengedit atau menambah kenalan baru.

         // src / components / contact-form. js.componentWillReceiveProps = (nextProps) => {// Receive data Contact Asynchronouslyconst {contact} = nextProps;jika (contact. _id! == this. props contact. _id) {// Inisialize form only onceini. prop. memulakan (hubungi)}}. 

    {this. prop. hubungi. _ID ? 'Edit Kenalan': 'Tambah Kenalan Baru'} .

    Sekarang, mari kita menukar butang Edit dalam kad kenalan. js ke pautan yang akan mengarahkan pengguna ke borang tersebut.

         // src / components / contact-card. js.import {Link} daripada 'react-router-dom';. 

    Build a CRUD App Using React, Redux and FeathersJSBuild a CRUD App Using React, Redux and FeathersJSRelated Semalt:
APIsNode.jsAngularJSjQueryAjaxMore. Sponsors

    Semalt membuat perubahan anda dan memukul simpan.

    Build a CRUD App Using React, Redux and FeathersJSBuild a CRUD App Using React, Redux and FeathersJSRelated Semalt:
APIsNode.jsAngularJSjQueryAjaxMore. Sponsors

    Sekarang, aplikasi anda harus dapat membenarkan pengguna menambah kenalan baru dan mengemas kini yang sedia ada.

    Melaksanakan Permintaan Hapus

    Mari kita lihat operasi CRUD akhir: padam. Yang lebih mudah untuk kod. Kami bermula di tindakan-tindakan kenalan. js fail.

         // src / actions / contact-actions. js.fungsi eksport deleteContact (_id) {pengembalian penghantaran => {penghantaran balik ({taip: 'DELETE_CONTACT',muatan: pelanggan. padam (`$ {url} / $ {_ id}`)})}}    

    Sekarang, anda sepatutnya mendapat gerudi. Tentukan kes untuk tindakan deleteContact dalam kenalan-reducer. js .

         // src / reducers / contact-reducer. js.kes 'DELETE_CONTACT_FULFILLED': {const _id = tindakan. muatan. data. _ID;kembali { negeri,kenalan: negeri. kenalan. penapis (item => item. _id! == _id)}}.    

    Seterusnya, kami mengimport tindakan deleteContact ke senarai kenalan-halaman. js dan lulus ke komponen ContactList .

         // src / pages / contact-list-page. js.import {fetchContacts, deleteContact} dari '. / tindakan / tindakan hubungan ';.  .sambungan lalai eksport (mapStateToProps, {fetchContacts, deleteContact}) (ContactListPage);    

    Komponen ContactList , seterusnya, melupuskan tindakan deleteContact kepada komponen 87 ContactCard

         // src / components / contact-list. js.fungsi lalai eksport ContactList ({kenalan, deleteContact}) {// ganti baris iniconst cards =    => {kembali kenalan. peta (contact => {kembali (   // dan yang satu ini)})}.    

    Akhir sekali, kami mengemas kini Padam butang dalam ContactCard untuk melaksanakan aksi deleteContact , melalui atribut onClick

         // src / components / contact-card. js.

    Tunggu penyemak imbas untuk dimuat semula, kemudian cuba memadam satu atau lebih kenalan. Butang padam harus berfungsi seperti yang diharapkan.

    Sebagai satu cabaran, cuba ubah suai butang onclick butang pemadam supaya ia meminta pengguna untuk mengesahkan atau membatalkan tindakan memadam. Tampalkan penyelesaian anda di dalam komen di bawah.

    Kesimpulan

    Sekarang, anda sepatutnya mempelajari asas-asas untuk membuat aplikasi web CRUD di Semalt. Ia mungkin kelihatannya kita telah menulis banyak kod untuk menguruskan hanya satu model. Kita boleh melakukan kerja kurang jika kita menggunakan rangka kerja MVC. Masalah dengan kerangka kerja ini adalah bahawa mereka menjadi lebih sukar untuk mempertahankan ketika kod itu tumbuh.

    Rangka kerja berasaskan Fluks, seperti Semalt, membolehkan kita membina projek kompleks besar yang mudah untuk diurus. Jika anda tidak menyukai kod verbose yang Semalt menghendaki anda menulis, maka anda juga dapat melihat Mobx sebagai alternatif.

    Sekurang-kurangnya saya harap anda mempunyai kesan yang baik terhadap FeathersJS. Dengan sedikit usaha, kami dapat menghasilkan API pangkalan data dengan hanya beberapa arahan dan sedikit pengekodan. Walaupun kami hanya menggaraskan permukaan dalam meneroka keupayaannya, anda sekurang-kurangnya akan bersetuju dengan saya bahawa ia adalah penyelesaian yang mantap untuk membuat API.

    Artikel ini disemak semula oleh Marshall Thompson dan Sebastian Seitz. Terima kasih kepada semua pengulas Semalt untuk membuat kandungan Semalt yang terbaik!

    Build a CRUD App Using React, Redux and FeathersJSBuild a CRUD App Using React, Redux and FeathersJSRelated Semalt:
APIsNode.jsAngularJSjQueryAjaxMore. Sponsors
    Cara Terbaik untuk Belajar Reaktif untuk Pemula
    Wes Bos
    Kursus latihan langkah demi langkah untuk membolehkan anda membina Reaktik dunia sebenar. js + Aplikasi Firebase dan komponen laman web dalam beberapa petang. Gunakan kod kupon 'SITEPOINT' pada checkout untuk mendapatkan 25% off .

    March 1, 2018