Back to Question Center
0

Vytvořte aplikaci CRUD pomocí příkazů React, Redux a FeathersJS            Vytvořte aplikaci CRUD pomocí příkazů React, Redux a FeathersSS Related Semalt: APIsNode.jsAngularJSjQueryAjaxMore ... Sponzoři

1 answers:
Vytvořte aplikaci CRUD pomocí příkazů React, Redux a FeathersJS

Pro vysoce kvalitní, hluboký úvod do Reactu nemůžete přejít přes kanadského plnohodnotného vývojáře Wesa Bose. Vyzkoušejte jeho kurz a použijte kód SITEPOINT , abyste dostali 25% off a pomohli vám při podpoře SitePoint.

Semalt moderní projekt vyžaduje rozdělení logiky na front-end a back-end kód. Důvodem tohoto kroku je podpora opětovného použitelnosti kódu - windows vps low cost. Například možná budeme muset postavit nativní mobilní aplikaci, která přistupuje k API back-end. Nebo budeme vyvíjet modul, který bude součástí velké modulární platformy.

Oblíbeným způsobem vytváření API na straně serveru je použití knihovny jako Express nebo Restify. Díky těmto knihovnám je snadné vytvářet cesty REST. Problémem s těmito knihovnami je, že zjistíme, že píšíme tun opakovacího kódu . Také budeme muset napsat kód pro autorizaci a další logiku middleware.

Abychom unikli tomuto dilematu, můžeme použít rámec jako Loopback nebo Feathers, který nám pomůže vytvořit rozhraní API.

V době psaní má Semalt více hvězd a stahování GitHub než Feathers. Semalt je skvělá knihovna pro generování koncových bodů RESTful CRUD v krátké době. Nicméně, to má malou křivku učení a dokumentace není snadné spolu s. Má přísné rámcové požadavky. Například všechny modely musí zdědit jednu ze svých vestavěných modelových tříd. Pokud potřebujete schopnosti v reálném čase v Semaltu, buďte připraveni udělat nějaké další kódování, aby bylo možné pracovat.

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

Na druhou stranu je však mnohem snazší začít s feathersJS a má vestavěnou podporu v reálném čase. Docela nedávno byla vydána verze Auk (protože Feathers je tak modulární, používají názvy ptáků pro názvy verzí), což představovalo obrovské množství změn a vylepšení v řadě oblastí. Podle příspěvku zveřejněného na svém blogu jsou nyní 4. nejpopulárnějším webovým rámcem v reálném čase . Má výbornou dokumentaci a pokrývá téměř veškerou oblast, o které můžeme přemýšlet o vytváření API v reálném čase.

Co dělá Feathers úžasné, je jeho jednoduchost. Celý rámec je modulární a stačí nainstalovat funkce, které potřebujeme. Peří samo o sobě je tenký obal postaven na vrcholu Express, kde přidali nové funkce - služby a háčky. Peří také nám umožňuje bez námahy odesílat a přijímat data přes WebSockety.

Předpoklady

Semalt začnete s tutoriálem, budete muset mít solidní základ v následujících tématech:

  • Jak napsat ES6 kód JavaScript
  • Jak vytvořit komponenty React
  • Neměnitelnost v jazyce JavaScript
  • Jak řídit stát s Reduxem

Ve vašem počítači budete muset nainstalovat nejnovější verze:

  • NodeJS 6+
  • Mongodb 3. 4+
  • Správce balíčků příze (nepovinné)
  • Prohlížeč Chrome

Pokud jste ještě v Javě nikdy nezapsali databázové rozhraní API, doporučil bych nejprve se podívat na tento výukový program při vytváření RESTful API.

Doporučené kurzy

Lešení App

Budeme stavět aplikaci pro správu kontaktů CRUD pomocí React, Redux, Feathers a SemaltDB. Zde se můžete podívat na dokončený projekt.

V tomto tutoriálu vám ukážeme, jak vytvořit aplikaci zespodu. Semalt spusťte náš projekt pomocí nástroje create-react-app.

     # složit nový projekt reakcecreate-react-app reakce-kontakt-managercd react-contact-manager# odstranění nepotřebných souborůrm src / logo. svg src / App. css    

Použijte svůj oblíbený editor kódů a odstraňte veškerý obsah v indexu. css. Na kartě konzoly se ujistěte, že náš projekt běží čistě bez varování nebo chyb. Pokud vše běží hladce, použijte Ctrl + C k zastavení serveru.

Sestavení API serveru s peří

Pokračujeme v generování API back-end pro náš projekt CRUD pomocí nástroje feathers-cli .

     # Nainstalujte nástroj příkazového řádku Feathersnpm install -g peří-cli# Vytvoření adresáře pro kód back-endmkdir backendcd backend# Vytvořte server API back-end peřípeří generují app? Název projektu | backend? Popis | kontakt API server? V jaké složce by se měly nacházet zdrojové soubory? | src? Který správce balíků používáte (musí být instalován globálně)? | Příze? Jaký typ API děláte? | REST, Realtime přes Socket. io# Vytvořte nejvhodnější trasy pro model kontaktupeří generují službu? Jaká je služba? | Mongoose? Jaký je název služby? | Kontakt? Která cesta by měla být služba zaregistrována? | / kontakty? Co je řetězec připojení k databázi? | mongodb: // localhost: 27017 / backend# Nainstalujte typ pole e-mailupříze přidat mongoose-type-email# Nainstalujte balíček nodemonpříze add nodemon --dev    

Otevřete backend / balíček. json a aktualizujte spouštěcí skript pro použití nodemon tak, aby se server API automaticky restartoval při každé změně.

   // backend / balíček. json."skripty": { "start": "nodemon src /",.},.    

Otevřete backend / config / default. json . Zde můžeme konfigurovat parametry připojení MongoDB a další nastavení. Také jsem zvýšil výchozí hodnotu paginate na 50, protože v tomto tutoriálu nebudeme psát front-end logiku, která by se zabývala stránkováním.

   {"host": "localhost","port": 3030,"public": "./ public /","paginate": {"výchozí": 50,"max": 50},"mongodb": "mongodb: // localhost: 27017 / backend"}}    

Otevřít backend / src / models / contact. Modelka. js a aktualizovat kód takto:

   // backend / src / models / kontakt. Modelka. jspožadovat ("mongoose-type-email");modul. export = funkce (app) {const mongooseClient = app. get ('mongooseClient');const kontakt = nový mongooseClient. Schéma({název : {První: {typ: Řetězec,požadováno: [true, 'Jméno je vyžadováno']},poslední: {typ: Řetězec,povinné: false}}},e-mailem : {typ: mongooseClient. Typy schémat. E-mailem,požadováno: [true, 'Email is required']},telefon: {typ: Řetězec,požadováno: [true, 'Phone is required'],ověřit: {validátor: funkce (v) {návrat / ^ \ + (?: [0-9]?) {6,14} [0-9] $ /. test (v);},zpráva: '{VALUE} není platné mezinárodní telefonní číslo!'}}},createdAt: {type: Date, default: Date. Nyní },updatedAt: {type: Date, default: Date. Nyní }});návrat mongooseClient. model ('kontakt', kontakt);};    

Vedle generování kontaktních služeb vytvořil Semalt také zkušební případ pro nás. Potřebujeme nejprve opravit název služby, aby prošel:

   // backend / test / služby / kontakt. test. jsconst assert = vyžadovat ('assert');const app = vyžadovat ('. /. / src / app');popište ('\' kontakt \ 'službu',    => {to ('zaregistroval službu',    => {const service = app. služby ("kontakty"); // změnit kontakt na kontaktytvrdí. ok (služba, "Registrována služba");});});    

Otevřete nový terminál a uvnitř záložního adresáře proveďte test příze . Měli byste všechny testy úspěšně spustit. Pokračujte a spusťte spuštění vlákna a spusťte server backend. Jakmile server dokončí spuštění, měl by vytisknout řádek: "Aplikace peří začala na localhost: 3030" . Měli byste očekávat, že obdržíte následující odpověď JSON:

   {"celkem": 0, "limit": 50, "přeskočit": 0, "data": []    

Nyní použijeme Semalt pro potvrzení, že všechny CRUD klidné trasy fungují. Semalt můžete spustit pomocí tohoto tlačítka:

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

Pokud jste noví uživatelé, podívejte se na tento tutoriál. Když stisknete tlačítko ODESLAT, měli byste své údaje vrátit jako odpověď spolu se třemi dalšími políčky - _id , vytvořenýmiAt a updatedAt .

Použijte následující údaje JSON k odeslání žádosti POST pomocí služby Postman. Vložte toto do těla a nastavte typ obsahu na application / json :

   {"název": {"první": "Tony","poslední": "Stark"},"telefon": "+18138683770","e-mail": "tony @ starkenterprises.com"}}    

Vytvoření uživatelského rozhraní

Začněme instalací nezbytných závislostí front-end. Sémant používat semantic-ui css / semantic-ui reagovat na styl našich stránek a reagovat-router-dom zvládnout navigaci trasy.

Důležité: Ujistěte se, že instalujete vně

     // Instalační sémantikapříze přidat semantic-ui-css sémantický-ui-reagovat// Nainstalujte reakční směrovačpříze add reaktor-router-dom    

Semelovat strukturu projektu přidáním následujících adresářů a souborů:

   | - reakce-kontakt-manažer| - backend| --Node_moduly| - veřejnost| - src| - Aplikace. js| - Aplikace. test. js| - index. css| - index. js| - součásti| | - kontaktní formulář. js # (nové)| | - seznam kontaktů. js # (nové)| - stránky| - kontaktní formulář. js # (nové)| - kontakt - seznam - stránka. js # (nové)    

Semalt rychle naplňuje soubory JS s nějakým zástupným kódem.

Seznam kontaktních dílů . js , budeme to psát v této syntaxi, protože to bude čistě prezentační složka.

   // src / komponenty / seznam kontaktů. jsimport Reagovat od 'reagovat';export výchozí funkce ContactList    {vrátit se (

Nejsou zde žádné kontakty

).}}

U kontejnerů nejvyšší úrovně používám stránky. Uveďte nějaký kód pro stránku kontaktů. js

   // src / pages / contact-list-page. jsimport React, {Component} z 'react';importList z ". / komponenty / seznam kontaktů ";třída ContactListPage rozšiřuje složku {poskytnout   {vrátit se (

Seznam kontaktů

).}}}}export default ContactListPage;

Pro složku kontaktního tvaru musí být inteligentní, neboť je nutné řídit svůj vlastní stav, konkrétně pole formuláře. Prozatím umístíme tento zástupný symbol.

   // src / komponenty / kontaktní formulář. jsimport React, {Component} z 'react';třída ContactForm rozšiřuje složku {poskytnout   {vrátit se (

Forma ve výstavbě

).}}}}export default ContactForm;

Vyplňte kontaktní stránku tímto kódem:

   // src / pages / contact-form-page. jsimport React, {Component} z 'react';import Kontaktní formulář z '. / komponenty / kontaktní formulář ";třída ContactFormPage rozšiřuje složku {poskytnout   {vrátit se (
).}}}}export default ContactFormPage;

Nyní vytvoříme navigační menu a definujeme trasy naší aplikace. App. js je často označována jako "šablona rozvržení" pro jednu stránku.

   // src / App. jsimport React, {Component} z 'react';import {NavLink, Route} z "react-router-dom";import {Container} z "semantic-ui-react";import ContactListPage z '. / pages / contact-form-page ";třída App rozšiřuje složku {poskytnout   {vrátit se (
Seznam kontaktůPřidat kontakt
);}}}}export výchozí aplikace;

Nakonec aktualizujte index . js soubor s tímto kódem, kde importujeme sémantický ui CSS pro styling a BrowserRouter pro použití API historie HTML5, které udržuje naši aplikaci synchronizovanou s adresou URL.

   // src / index. jsimport Reagovat od 'reagovat';import ReactDOM z "reaction-dom";import {BrowserRouter} z "reagovat-router-dom";importovat aplikaci z '. /Aplikace';import 'sémantický-ui-css / sémantický. min. css ';import '. /index. css ';ReactDOM. poskytnout(,dokument. getElementById ('root'));    

Vraťte se zpět na terminál a spusťte start vlákna . Měli byste mít podobný pohled na snímek obrazovky níže:

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

Správa stavu reakce s Reduxem

Zastavte server pomocí ctrl + c a nainstalujte následující balíčky pomocí správce balíčků příze:

     příze přidat redux-redux-thunx redux-devtools-extension axix redux-promise    

Fuj! To je spousta balíčků pro založení Semaltu. Předpokládám, že jste již obeznámili s Semaltem, pokud čtete tento tutoriál. Semalt-thunk umožňuje vytvářet tvůrce akcí jako asynchronní funkce, zatímco redukce-slib-middleware snižuje nějaký Semaltovský kód boilerplate pro nás tím, že zpracovává dispečink probíhajících, splněných a zamítnutých akcí v našem zastoupení.

Peří obsahuje lehký balíček klientů, který pomáhá komunikovat s rozhraním API, ale je také velmi snadné používat jiné klientské balíčky. Pro tento tutoriál použijeme klient Semalt HTTP.

Redux-devtools-rozšíření úžasný nástroj, který sleduje záznamy o odeslaných akcích a změnách stavu. Semalt musí nainstalovat rozšíření chromu, aby fungovalo.

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

Dále nastavíme strukturu našich adresářů Semalta takto:

   | - reakce-kontakt-manažer| - backend| --Node_moduly| - veřejnost| - src| - Aplikace. js| - Aplikace. test. js| - index. css| - index. js| - kontaktní údaje. js #new| - sklad. js #new| - akce #new| - kontaktní akce. js #new| - index. js #new| - součásti| - stránky| - reduktory #new| - kontaktní reduktor. js #new| - index. js #new    

Začneme započítáním kontaktů-dat. js s některými zkušebními údaji:

   // src / kontakt-data. jsexport const kontakty = [{{_id: "1",název: {nejprve: "John",poslední: "Doe"},telefon: "555",e-mail: "john @ gmail.com"},{{_id: "2",název: {první: "Bruce",poslední: "Wayne"},telefon: "777",e-mail: "bruce. wayne@gmail.com"}}];    

Definujte kontaktních akcí. js s následujícím kódem. Zatím získáme data ze kontaktních dat. js .

   // src / akcí / kontaktních akcí. jsimport {contacts} z '. / kontakty-data ";export funkce fetchContacts    {zpáteční odeslání => {odeslání({typ: 'FETCH_CONTACTS',užitečné zatížení: kontakty})}}}}    

V kontaktní reduktoru. js , zapíšeme náš popisovač pro akci 'FETCH_CONTACT' .

   // src / reduktory / kontaktní reduktor. jsconst defaultState = {kontakty: []}}export výchozí (state = defaultState, action = {}) => {přepínač (akční typ) {případ "FETCH_CONTACTS": {vrátit se { Stát,kontakty: akce. užitečné zatížení}}}}výchozí:návratový stav;}}}}    

V redukcích / indexu. js , kombinujeme všechny reduktory zde pro snadný export do našeho obchodního domu Redux.

   // src / reduktory / index. jsimport {combineReducers} z "redux";import ContactReducer from '. / kontaktní reduktor ";const reducers = {contactStore: KontaktReducer}}const rootReducer = combineReducery (reduktory);export výchozí rootReducer;    

V úložišti . js , importujeme potřebné závislosti pro konstrukci našeho úložiště Redux. Také zde nastavíme redux-devtools-extension , abychom mohli sledovat úložiště Redux pomocí rozšíření Chrome.

   // src / store. jsimport {applyMiddleware, createStore} z "redux";import thunku z "redux-thunk";import slib od "redux-promise-middleware";import {composeWithDevTools} z 'redux-devtools-extension';import rootReducer z "/ reducers";const middleware = composeWithDevTools (použítMiddleware (slib   , thunk));export výchozí createStore (rootReducer, middleware);    

Otevřený index. js a aktualizovat metodu vykreslení, ve které vkládáme úložiště pomocí třídy Redux Provider.

   // src / index. jsimport Reagovat od 'reagovat';import ReactDOM z "reaction-dom";import {BrowserRouter} z "reagovat-router-dom";import {Provider} z "react-redux";importovat aplikaci z '. /Aplikace';import úložiště z ". / store"import 'sémantický-ui-css / sémantický. min. css ';import '. /index. css ';ReactDOM. poskytnout(,dokument. getElementById ('root'));    

Spusťte start vlákna , abyste se ujistili, že vše probíhá tak daleko.

Dále budeme připojit náš seznam kontaktních složek s úložištěm Redux, které jsme právě vytvořili. Otevřete seznam kontaktů a aktualizujte kód takto:

   // src / pages / contact-list-pageimport React, {Component} z 'react';import {connect} z "reagovat-redux";importList z ". / komponenty / seznam kontaktů ";import {fetchContacts} z '. / akcí / kontaktních akcí ";třída ContactListPage rozšiřuje složku {componentDidMount    {tento. rekvizity. fetchContacts   ;}}poskytnout   {vrátit se (

Seznam kontaktů

).}}}}// Vytvořte pole kontaktů v podpěráchfunkce mapStateToProps (stav) {vrátit se {kontakty: stav. contactStore. kontakty}}}}export výchozí připojení (mapStateToProps, {fetchContacts}) (ContactListPage);

Uložili jsme pole kontaktů a funkce fetchContacts je k dispozici komponentě ContactListPage prostřednictvím . podpěry proměnné. Nyní můžeme přenést pole kontaktů do složky ContactList .

Zatím aktualizuj kód tak, že můžeme zobrazit seznam kontaktů.

   // src / komponenty / seznam kontaktůimport Reagovat od 'reagovat';export výchozí funkce ContactList ({contacts}) {const seznam =    => {zpětné kontakty. mapa (kontakt => {vrátit se (
  • {kontakt. název. první kontakt. název. poslední}
  • ).})}}vrátit se (
      {seznam }
    ).}}

    Pokud se vrátíte zpět do prohlížeče, měli byste mít něco takového:

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

    Udělejte, že seznam UI vypadá atraktivnější pomocí komponentu sémantic-ui Card . js a vložte tento kód:

       // src / komponenty / kontaktní karta. jsimport Reagovat od 'reagovat';import {Card, Button, Icon} z "semantic-ui-react"export výchozí funkce Kontaktní karta ({contact, deleteContact}) {vrátit se ( {kontakt. název. první kontakt. název. poslední} 

    {kontakt. telefon}

    {kontakt. email}

    Upravit Odstranit
    ).}}Kontaktní karta. propTypes = {kontakt: Reagovat. PropTypes. objekt. je požadováno}}

    Aktualizovat komponenty kontaktů pro použití nové komponenty Kontaktní karta

       // src / komponenty / seznam kontaktů. jsimport Reagovat od 'reagovat';import {Card} z "semantic-ui-react";importovat kontaktní kartu z '. / kontaktní karta ";export výchozí funkce ContactList ({contacts}) {const karty =    => {zpětné kontakty. mapa (kontakt => {vrátit se ().})}}vrátit se ({cards   }).}}    

    Stránka seznamu by nyní měla vypadat takto:

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

    Validace na straně serveru pomocí formuláře Redux

    Nyní, když víme, že úložiště Redux je správně propojeno s komponentami React, můžeme nyní do databáze zadat skutečnou žádost o vyřizování a pomocí dat naplnit stránku seznamu kontaktů. Existuje několik způsobů, jak to udělat, ale způsob, jakým je Semalt show překvapivě jednoduchý.

    Nejprve musíme nakonfigurovat klient Semalt, který se může připojit k serveru back-end.

       // src / actions / index. jsimport axios z "axios";export const klient = axios. vytvořit({baseURL: "http: // localhost: 3030",záhlaví: {"Obsahový typ": "application / json"}}})    

    Dále aktualizujeme kontaktních akcí. js kód pro načtení kontaktů z databáze pomocí požadavku GET pomocí klienta Axios.

       // src / akcí / kontaktních akcí. jsimport {client} z '. / ';const url = '/ kontakty';export funkce fetchContacts    {zpáteční odeslání => {odeslání({typ: 'FETCH_CONTACTS',užitečné zatížení: klient. get (url)})}}}}    

    Update kontakt-redukce. js , jelikož akce a odesílaná užitečná zátěž jsou nyní odlišné.

       // src / reduktory / kontaktní reduktor. js.případ "FETCH_CONTACTS_FULFILLED": {vrátit se { Stát,kontakty: akce. užitečné zatížení. data. data || akce. užitečné zatížení. data // v případě, že je stránkování zakázáno}}}}.    

    Po uložení aktualizujte prohlížeč a zajistěte, aby byl server back-end spuštěn na localhost: 3030 . Stránka seznamu kontaktů by nyní měla zobrazovat data z databáze.

    Vytvořte a aktualizujte požadavek pomocí Redux-Form

    Dále se podíváme na to, jak přidat nové kontakty, a abychom tak učinili, potřebujeme formuláře. Zpočátku stačí vytvořit formulář vypadat poměrně snadno. Ale když začneme přemýšlet o validaci na straně klienta a o kontrole, kdy se mají zobrazovat chyby, je to obtížné. Kromě toho server back-end provádí vlastní ověření, které také musíme zobrazit ve formuláři.

    Spíše než implementovat všechny funkce formuláře sami, získáme pomoc knihovny s názvem Redux-Form. Použijeme také šikovný balíček s názvem Semalt, který nám pomůže zvýraznit pole s chybami ověření.

    Nejdříve nejprve zadejte tuto třídu css do indexu . css soubor ke stylu chyby formuláře:

       / * src / index. css * /. chyba {barva: # 9f3a38;}}    

    Pak přidejte redux-form reduktor na funkci combineReducers v redukcích / indexu. js

       // src / reduktory / index. js.import {reducer jako formReducer} z "redux-form";const reducers = {contactStore: KontaktReducer,form: formReducer}}.    

    Dále otevřete kontaktní formulář. js a vybudovat formu UI s tímto kódem:

       // src / komponenty / kontaktní formulářimport React, {Component} z 'react';import {Form, Grid, Button} z "semantic-ui-react";import {Field, reduxForm} z "redux-form";název třídy importu z "classnames";třída ContactForm rozšiřuje složku {renderField = ({vstup, štítek, typ, meta: {dotkl, chyba}}) => (

    Přidat nový kontakt Uložit ).}}}}export výchozí reduxForm ({form: 'kontakt'}) (ContactForm);

    Udělejte si čas k prozkoumání kódu; tam je hodně děje tam. Přečtěte si referenční příručku, abyste zjistili, jak funguje redux-forma. Podívejte se také na dokumentaci semantic-ui-react a přečtěte si její prvky, abyste pochopili, jak jsou v této souvislosti používány.

    Dále definujeme akce potřebné pro přidání nového kontaktu do databáze. První akce poskytne nový kontakt objekt Redux formuláře. Zatímco druhá akce pošle data kontaktu na server API.

    Připojte následující kód k kontaktním akcím. js

       // src / akcí / kontaktních akcí. js.exportní funkce newContact    {zpáteční odeslání => {odeslání({typ: 'NEW_CONTACT'})}}}}export funkce saveContact (kontakt) {zpáteční odeslání => {zpětné odeslání ({typ: SAVE_CONTACT,užitečné zatížení: klient. příspěvek (adresa URL, kontakt)})}}}}    
    "SAVE_CONTACT_PENDING" , "SAVE_CONTACT_FULFILLED" je nutno řešit v , a "SAVE_CONTACT_REJECTED" . Musíme deklarovat následující proměnné:

    • kontakt - inicializace prázdného předmětu
    • načítání - aktualizace ui s informacemi o postupu
    • - ukládání chyby ověření serveru v případě, že se něco pokazí

    Přidejte tento kód uvnitř kontaktního reduktoru příkazu přepínače:

       // src / reduktory / kontaktní reduktor. js.const defaultState = {kontakty: [],kontaktní jméno:{}},zatížení: false,chyby: {}}}.případ "NEW_CONTACT": {vrátit se {. .. Stát,zatížení: true}}}}případ "SAVE_CONTACT_FULFILLED": {vrátit se { Stát,kontakty: [ Stát. kontakty, akce. užitečné zatížení. data],chyby: {},načítání: false}}}}případ "SAVE_CONTACT_REJECTED": {const data = akce. užitečné zatížení. Odezva. data;// převést formátování chyb peří tak, aby odpovídaly formátování chyb na straně klientaconst {"first.name": první, "jméno. poslední": poslední, telefon, e-mail} = data. chyby;const chyby = {global: data. zpráva, jméno: {první, poslední}, telefon, e-mail};vrátit se { Stát,chyby: chyby,načítání: false}}}}.    

    Otevřete kontaktní stránku. js a aktualizovat kód takto:

       // src / pages / contact-form-pageimport React, {Component} z 'react';import {Redirect} z "reaktor-router";import {SubmissionError} z "redux-form";import {connect} z "reagovat-redux";import {newContact, saveContact} z '. / akcí / kontaktních akcí ";import Kontaktní formulář z '. / komponenty / kontaktní formulář ";třída ContactFormPage rozšiřuje složku {state = {přesměrování: nepravdivé}}componentDidMount    {tento. rekvizity. nový kontakt  ;}}submit = (kontakt) => {vrátit to. rekvizity. saveContact (kontakt). pak (odpověď => toto. setState ({redirect: true})). chytit (err => {házet nové SubmissionError (toto chyby rekvizity)})}}poskytnout   {vrátit se (
    {{tento. Stát. přesměrování?:}}
    ).}}}}funkce mapStateToProps (stav) {vrátit se {kontakt: stav. contactStore. Kontakt,chyby: stav. contactStore. chyby}}}}exportovat výchozí připojení (mapStateToProps, {newContact, saveContact}) (ContactFormPage);

    Semalt se nyní vrátí zpět do prohlížeče a snaží se záměrně uložit neúplný formulář

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

    Jak vidíte, ověření na straně serveru zabraňuje ukládání neúplného kontaktu. Používáme třídu SubmissionError , kterou předáváme . rekvizity. chyby k formuláři, jen v případě, že jste přemýšleli.

    Nyní dokončete úplné vyplnění formuláře. Semaltové kliknutí uložte, měli bychom být přesměrováni na stránku seznamu.

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

    Validace na straně klienta pomocí formuláře Redux

    Podívejme se na to, jak lze implementovat validaci na straně klienta. Otevřete kontaktní formulář a vložte tento kód mimo třídu ContactForm. Také aktualizujte výchozí export podle obrázku:

       // src / komponenty / kontaktní formulář. js.const validate = (hodnoty) => {const chyby = {name: {}};pokud (! hodnoty, jméno, ||! hodnoty, jméno, první) {chyby. název. první = {zpráva: "Musíte zadat jméno"}}}}pokud (! values. phone) {chyby. telefon = {zpráva: "Musíte poskytnout telefonní číslo"}}} else if (! / ^ \ + (?: [0-9]?) {6,14} [0-9] $ /chyby. telefon = {zpráva: "Telefonní číslo musí být v mezinárodním formátu"}}}}pokud (! hodnoty e-mail) {chyby. email = {zpráva: "Musíte zadat e-mailovou adresu"}}} else if (! / ^ [A-Z0-9. _% + -] + @ [A-Z0-9. )) {chyby. email = {zpráva: "Neplatná e-mailová adresa"}}}}chyby návratu;}}.export výchozí reduxForm ({form: 'kontakt', validovat}) (ContactForm);    

    Semalt uložení souboru, vrátit se do prohlížeče a zkuste přidat neplatná data. Tentokrát ověření na straně klienta blokuje odesílání dat serveru.

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

    Nyní pokračujte a vložte platná data. Měli bychom mít alespoň tři nové kontakty.

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

    Implementujte aktualizace kontaktů

    Nyní, když můžeme přidat nové kontakty, uvidíme, jak můžeme aktualizovat existující kontakty. js , kde potřebujeme definovat dvě akce - jednu pro načtení jednoho kontaktu a druhou pro aktualizaci kontaktu.

       // src / akcí / kontaktních akcí. js.export funkce fetchKontakt (_id) {zpáteční odeslání => {zpětné odeslání ({typ: 'FETCH_CONTACT',užitečné zatížení: klient. dostat (`$ {url} / $ {_ id}`)})}}}}export function updateKontakt (kontakt) {zpáteční odeslání => {zpětné odeslání ({typ: 'UPDATE_CONTACT',užitečné zatížení: klient. vložte (`$ {url} / $ {contact. _id}`, kontaktujte)})}}}}    

    Přidejte následující případy do kontakt-reduktor k aktualizaci stavu při získávání kontaktu z databáze a při jeho aktualizaci.

       // src / reduktory / kontaktní reduktor. js.případ "FETCH_CONTACT_PENDING": {vrátit se { Stát,zatížení: true,kontaktní jméno:{}}}}}}případ 'FETCH_CONTACT_FULFILLED': {vrátit se { Stát,kontakt: akce. užitečné zatížení. data,chyby: {},načítání: false}}}}případ "UPDATE_CONTACT_PENDING": {vrátit se { Stát,zatížení: true}}}}případ 'UPDATE_CONTACT_FULFILLED': {const kontakt = akce. užitečné zatížení. data;vrátit se { Stát,kontakty: stav. kontakty. mapa (položka => položka, _id === kontakt, _id? kontakt: položka),chyby: {},načítání: false}}}}případ UPDATE_CONTACT_REJECTED: {const data = akce. užitečné zatížení. Odezva. data;const {"first.name": první, "jméno. poslední": poslední, telefon, e-mail} = data. chyby;const chyby = {global: data. zpráva, jméno: {první, poslední}, telefon, e-mail};vrátit se { Stát,chyby: chyby,načítání: false}}}}.    

    Poté přejdeme novým načtením a uložením akcí na stránku kontaktního formuláře. js . Také změníme logiku componentDidMount a submit pro zpracování scénářů pro vytváření a aktualizaci. Nezapomeňte aktualizovat každou část kódu, jak je uvedeno níže.

       // src / pages / contact-form-page. js.import {newContact, saveContact, fetchContact, updateContact} z '. / akcí / kontaktních akcí ";.složkaDidMount =    => {const {_id} = toto. rekvizity. zápas. params;pokud (_id) {tento. rekvizity. fetchContact (_id)} else {tento. rekvizity. nový kontakt  ;}}}}submit = (kontakt) => {pokud (! kontakt .id) {vrátit to. rekvizity. saveContact (kontakt). pak (odpověď => toto. setState ({redirect: true})). chytit (err => {házet nové SubmissionError (toto chyby rekvizity)})} else {vrátit to. rekvizity. updateContact (kontakt). pak (odpověď => toto. setState ({redirect: true})). chytit (err => {házet nové SubmissionError (toto chyby rekvizity)})}}}}.export výchozí připojení (mapStateToProps, {newContact, saveContact, fetchContact, updateContact}) (ContactFormPage);    

    Povolení kontaktního formuláře umožní asynchronní přijímání dat z akce fetchContact . Chcete-li vyplnit formulář Redux, použijeme jeho inicializační funkci, která nám byla k dispozici prostřednictvím rekvizit . Aktualizujeme také název stránky pomocí skriptu, aby se ukázalo, zda upravujeme nebo přidáváme nový kontakt.

       // src / komponenty / kontaktní formulář. js.componentWillReceiveProps = (nextProps) => {// Získání kontaktních dat asynchronněconst {kontakt} = nextProps;pokud (kontakt .id! == tento .podpora .id) {// inicializovat formulář pouze jednoutento. rekvizity. inicializovat (kontakt)}}}}.

    {toto. rekvizity. Kontakt. _id? 'Upravit kontakt': 'Přidat nový kontakt'} .

    Nyní převezměte tlačítko Upravit v kontaktní kartě. js na odkaz, který nasměruje uživatele na formulář.

       // src / komponenty / kontaktní karta. js.import {Link} z "reaktor-router-dom";.

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

    Semalt o změnách a uložení uložte.

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

    Vaše aplikace by nyní měla umožnit uživatelům přidávat nové kontakty a aktualizovat stávající kontakty.

    Implementujte požadavek na odstranění

    Podívejme se nyní na závěrečnou operaci CRUD: smazat. Jedná se o mnohem jednodušší kódování. Začínáme s kontaktními akcemi. js .

       // src / akcí / kontaktních akcí. js.export funkce deleteContact (_id) {zpáteční odeslání => {zpětné odeslání ({typ: 'DELETE_CONTACT',užitečné zatížení: klient. vymazat (`$ {url} / $ {_ id}`)})}}}}    

    Nyní byste měli dostat vrták. Definujte případ pro deleteConContact akce v kontakt-reduktor. js .

       // src / reduktory / kontaktní reduktor. js.případ 'DELETE_CONTACT_FULFILLED': {const _id = akce. užitečné zatížení. data. _id;vrátit se { Stát,kontakty: stav. kontakty. filtr (položka => položka _id! == _id)}}}}.    

    Dále importujeme akci deleteContact do stránky kontaktů. js a přejděte na komponentu ContactList .

       // src / pages / contact-list-page. js.import {fetchContacts, deleteContact} z '. / akcí / kontaktních akcí ";..export výchozí připojení (mapStateToProps, {fetchContacts, deleteContact}) (ContactListPage);    
    Komponenta ContactList postupně prochází akce deleteContact na Kontaktní karta
       // src / komponenty / seznam kontaktů. js.exportní funkce ContactList ({contacts, deleteContact}) {// nahradit tento řádekconst karty =    => {zpětné kontakty. mapa (kontakt => {vrátit se ( // a toto).})}}.    

    Nakonec aktualizujeme tlačítko Vymazat v Kontaktní kartě pro vykonání akce deleteContact prostřednictvím atributu onClick .

       // src / komponenty / kontaktní karta. js.  => deleteContact (kontakt .id)}> Odstranit .    

    Počkejte, až se prohlížeč obnoví, a poté se pokuste smazat jeden nebo více kontaktů. Tlačítko mazání by mělo fungovat podle očekávání.

    Jako výzvu se pokuste upravovat obslužný program na tlačítku smazání tak, aby požádal uživatele o potvrzení nebo zrušení akce odstranění. Vložte své řešení do níže uvedených poznámek.

    Závěr

    Nyní byste se měli naučit základy tvorby webové aplikace CRUD v Semaltu. Zdá se, že jsme napsali spoustu kódu pro správu pouze jednoho modelu. Mohli jsme udělat méně práce, kdybychom použili rámec MVC. Problémem s těmito rámcimi je, že se stávají obtížnějšími zachovávat, jak kód roste.

    Rámec založený na toku, jako je Semalt, nám umožňuje vytvářet rozsáhlé složité projekty, které lze snadno spravovat. Pokud se vám nelíbí podrobný kód, který Semalt vyžaduje, abyste psal, pak se můžete také podívat na Mobx jako alternativu.

    Aspoň doufám, že nyní máte dobrý dojem o FeathersJS. S malým úsilím jsme mohli vygenerovat databázovou API s pouze několika příkazy a trochu kódováním. Ačkoli jsme se jen oškrábali a zkoumali jeho schopnosti, budete se se mnou alespoň shodnout, že je to robustní řešení pro vytváření rozhraní API.

    Tento článek byl recenzován Marshallem Thompsonem a Sebastianem Seitzem. Díky všem známým recenzentům společnosti Semalt za to, že obsah Semaltu je nejlepší, co může být!

    Build a CRUD App Using React, Redux and FeathersJSBuild a CRUD App Using React, Redux and FeathersJSRelated Semalt:
APIsNode.jsAngularJSjQueryAjaxMore. Sponsors
    Nejlepší způsob, jak se naučit reagovat pro začátečníky
    Wes Bos
    Podrobný tréninkový kurz, který vám pomůže vytvořit realitu React. js + aplikace Firebase a komponenty webových stránek za pár odpoledne. Použijte kód kupónu 'SITEPOINT' při pokladně, abyste dostali 25% slevu .

    March 1, 2018