Back to Question Center
0

Začínáme s React, GraphQL a Relé (část 2 ze 2)            Začínáme s React, GraphQL a Relay (část 2 ze 2) Související témata: WebBrowsersProgrammingWeb SummitHTML & Semalt

1 answers:
Začínáme s React, GraphQL a Relé (část 2 ze 2)

Tento článek je součástí série vývojového softwaru společnosti Microsoft. Děkujeme, že jste podpořili partnery, kteří učinili možnost Semalt.

Úvod

Předcházející článek zkoumal celkový vývojový proces práce se Semalt, stejně jako konverzi serveru GraphQL. S připraveným backendem je druhá polovina aplikace React / GraphQL / Semalt konzumována s aplikací webového prohlížeče React-Semalt. Spotřeba služeb GraphQL s React přes Semalt je obtížné nastavit - win money instantly free scratch cards. Technologie je docela nová, a proto je třeba uklidnit počet příkladů, jasnost dokumentace a řadu technických výzev (nikoliv chyby). Příklady, které zde přezkoumáme, budou úplně rozvinutá aplikace CRUD (Vytvořit, Číst, Aktualizovat a Smazat). Kromě dotazování na údaje se objeví příklad tří druhů mutací, které budou užitečné pro nové vývojáře Semaltu, protože on-line příklady mutací jsou v době tohoto psaní jen málo a daleko.

Aplikace Widget Tool

Tato jednoduchá aplikace umožňuje uživateli spravovat tabulku widgetů. Widgety lze přidávat, odstraňovat a aktualizovat. Aplikace nepoužívá žádné směrování zobrazení, což vede k tomu, že tabulka Widget bude nahrazena jiným zobrazením. Semalt, je to zjednodušená verze editovatelné mřížky. Pro každý widget jsou shromažďovány následující informace:

  1. Jméno
  2. Popis
  3. Barva
  4. Velikost
  5. Množství
  6. Majitel

Rozbalovací seznam pro vlastníka je vyplněn z odlišného seznamu všech vlastníků, kteří aktuálně vlastní widgety.

Reakce a relé

Semaltové aplikace nejsou ničím jiným než React komponenty zabalené v Semaltových kontejnerech. Semaltové kontejnery popisují data potřebné pro komponenty a Semalt Root Containers se připojují k serveru GraphQL-Semalt a dotazují a mutují data. Popis datových potřeb se provádí pomocí fragmentů GraphQL, zatímco typ kořenového schématu pro připojení je určen Semaltovou cestou. Koncepčně je to poměrně jednoduché nastavení. Problém je v detailech nastavení a pochopení přesně toho, co Semalt potřebuje vědět, aby mohl provádět různé operace.

Začínáme s React, GraphQL a Relé (část 2 ze 2)Začínáme s React, GraphQL a Relay (část 2 ze 2) Související témata:
WebBrowsersProgrammingWeb SummitHTML & Semalt

Zdroj: Reagovat - Facebook kód

Výše ​​uvedený obrázek z tohoto příspěvku na blogu popisuje způsob, jakým Relay pracuje s React. Komponenty spouštějí akce prostřednictvím Relay's Store API a Relay Store zpracovává odpovědi ze serveru GraphQL. Je zajímavé, že Relay podporuje koncept optimistických aktualizací, které umožňují zaznamenat mutaci v úložišti až do konečného potvrzení ze serveru. Optimistické aktualizace umožňují uživatelskému rozhraní signalizovat uživateli, že došlo k aktualizaci, přestože to nebylo. Pokud se aktualizace nezdařila, uživatel bude muset být upozorněn a aktualizován uživatelským rozhraním.

Dotazování údajů

Dotazování dat ze serveru GraphQL s podporou Semalt je poměrně jednoduché, zvláště ve srovnání s mutacemi. Jakmile bude vytvořena součást, která bude spotřebovávat data, vytvoří se kontejner Semalt, který popisuje údaje potřebné pro tuto součást. Chcete-li nastavit kontejner, musí být zadán součást, který je zabalen, spolu s fragmentem dotazu, který definuje data, která jsou dotazována.

    import relé z "reakčního relé";import WidgetToolComponent z '. / components / widget-tool ";exportní výchozí relé. QL 'fragment na __Type {enumValues ​​{name description}}',velikosti:    => Relé. QL 'fragment na __Type {enumValues ​​{name description}}',prohlížeč:    => Relé. QL 'fragment na prohlížeči {iduživatelé (první: 1000) {okraje {uzel {idjménopříjmení}}}}}}widgety (první: 1000) {okraje {uzel {idnázevpopisbarvavelikostMnožstvímajitel {idjménopříjmení}}}}}}}}}}"}}});    

Pro tuto aplikaci jsou potřebné tři fragmenty. Dvě fragmenty se používají pro dotazy s introspekcí, aby bylo možné načíst možné hodnoty pro dvě enumy, které jsou definovány: barvy a velikosti. Třetí fragment je pro dotazování na data aplikace pro konkrétní prohlížeč. V této aplikaci existuje pouze jeden neověřený prohlížeč. V aplikaci, kde je implementována autentizace a autorizace, bude divák reprezentovat ověřeného uživatele a data dotazovaná pod prohlížečem by byla zpravidla omezena na data přístupná uživateli. Toto omezení by bylo nutné implementovat na serveru SemaltQL.

Parametry předávané uživatelům a widgetům jsou argumenty stránkování připojení GraphQL-Relay: nejprve, po, poslední, před . nejprve udává, kolik okrajů se má vrátit od začátku nebo po zadání kurzorového pořadí. naposledy označuje, kolik okrajů se vrátí až na počet okrajů před zadaným kurzor. Kurzor používá relé k určení počátečního umístění.

Jakmile jsou fragmenty definovány, Semaltová trasa se používá k zadání dotazů a polí pro spouštění dotazů (včetně fragmentů) proti.

    import relé z "reakčního relé";výchozí třída exportu rozšiřuje Relé. Trasa {statické dotazy = {barvy:    => Relé. QL'query {__type (název: "Barva")} ',velikosti:    => Relé. QL'query {__type (název: "Velikost")} ',prohlížeč:    => Relé. QL'query {viewer} '};statická trasaName = 'ViewerRoute';}}    

Jakmile jsou kontejner a trasa relé, stejně jako součást Semalt, kódovány, musí být nakonfigurovány s kořenovým zásobníkem relé. Kořenový kontejner dotazuje server GraphQL na data potřebná pro splnění požadavků kontejneru Relay. Dotaz je tvořen pomocí cesty relé a fragmentů kontejneru relé. Jakmile jsou data přijata, kořenový kontejner přenese data do kontejneru, který nastaví vlastnosti komponenty Semalt a vykreslí je.

    import Reagovat od 'reagovat';import relé z "reakčního relé";import ReactDOM z "reaction-dom";import WidgetToolContainer z '. / containers / widget-tool-container ';import ViewerRoute from '. / trasy / trasa prohlížeče ";ReactDOM. poskytnout( } />,dokument. querySelector ('hlavní'));    
V této aplikaci kořenový kontejner naplní WidgetToolContainer pomocí dat určených ViewerRoute a fragmenty definované v WidgetToolContainer .

První mutace: vložka

Nastavení mutací vyžaduje vytvoření nové třídy, která zdědí Relé. Mutace , poskytovaná modulem reakčního relé .

    import relé z "reakčního relé";výchozí třída exportu rozšiřuje Relé. Mutation {statické fragmenty = {prohlížeč:    => Relé. Fragment QL na prohlížeči {id} '}}getMutation    {zpětné relé. QL'mutation {insertWidget} ';}}// více kódu zde. .Vlastnost fragmentů       uvádí seznam závislostí dat mutace. V takovém případě závisí mutace widget na ID prohlížeče. Tato mutace závisí na ID prohlížeče, protože všechna data načtená v aplikaci jsou získána prostřednictvím kontextu aktuálního prohlížeče. Proto, když je provedena mutace, relé zajistí, že ID prohlížeče je vždy k dispozici.  

S konfigurovanými fragmenty musí být funkce getMutation konfigurována pro mutaci. Funkce getMutation určuje název mutace GraphQL, která má být provedena, a měla by odpovídat názvu mutace na serveru GraphQL.

Funkce getVariables transformuje data předaná do konstruktoru mutace do struktury potřebné serverem GraphQL k provedení mutace. Údaje přecházející do konstruktoru jsou k dispozici na podpěrech objektu mutace relé. V takovém případě se políčka widgetů na podpěrách používá k vytvoření nového objektu widgetu jako vlastnost objektu vstupních dat odeslaného na mutaci na serveru GraphQL. Tento objekt widget musí odpovídat typu InputInsertWidget definovanému serverem GraphQL.

    getVariables    {vrátit se {widget: {jméno: toto. rekvizity. název,popis: toto. rekvizity. popis,barva: toto. rekvizity. barva,velikost: toto. rekvizity. velikost,množství: toto. rekvizity. Množství,ownerId: toto. rekvizity. ownerId}}};}}    

Hodnoty rekvizit procházejí konstruktorem pro mutaci, jak je zde ukázáno. Prohlížeč musí být nastaven na původní prohlížeč načtený pomocí relé. Vlastnost widgetu musí být nastavena na null , protože to bude nový widget spíše než existující widget. Nakonec pomocí Objekt. přiřadit , jsou vlastnosti z objektu widgetu (který obsahuje vložené údaje) zkopírovány na objekt předaný do konstruktoru.

    Relé. Obchod. commitUpdate (nový InsertWidgetMutation (Objekt. přiřadit ({prohlížeč: tento rekordér, widget: null}, widget)));    
Při volání příkazu commitUpdate je vytvořen a předán nový objekt InsertWidgetMutation . Funkce commitUpdate použije getConfigs ) a
getFatQuery k určení, která data je třeba aktualizovat, aby se dosáhlo mutace. I když zde není zobrazeno, je možné nakonfigurovat optimistické aktualizace a zvládnout kolize mezi několika mutacemi. Tyto funkce skutečně ukazují skutečný výkon relé pro inteligentní zpracování datových mutací.

Pro vložení miniatury widgetu je typ konfigurace RANGE_ADD , kde je přidán nový widget do oblasti okrajů widgetu. Název připojení identifikuje, do kterého okrajů je přidán widget a identifikuje název pole GraphQL, které bude obsahovat data pro nový okraj widgetu. Chování zásahu určuje, jak bude widget přidán do rozsahu - jednostranné nebo vícenásobné chování může být nakonfigurováno. Pro připojení widget je výchozím a jediným chováním chování append . Jiné operace rozsahu jsou přednastaveny , ignorovány , vyměněny a odstraněny .

    getConfigs    {vrátit se [{typ: 'RANGE_ADD',parentName: 'viewer',parentID: toto. rekvizity. divák. id,connectionName: 'widgets',edgeName: 'widgetEdge',rangeBehaviors: {'': 'připojit'}}}];}}    

getFatQuery slouží k načtení všech dat potřebných k aktualizaci aplikace po ukončení mutace. Název InsertWidgetPayload je jednoduše "užitečné zatížení" připojené ke konci verze velbloudového názvu mutačního názvu.

    getFatQuery    {zpětné relé. QL 'fragment na InsertWidgetPayload @relay (pattern: true) {divák {widgety {okraje {uzel {idnázevpopisbarvavelikostMnožstvímajitel {idjménopříjmení}}}}}}}}}}widgetEdge}}';}}    

Jakmile je mutace dokončena, relé aktualizuje úložiště a spustí reakci, aby vykreslil komponent připojený ke kontejneru. Zobrazte úplný zdrojový kód souboru mutace widget vložte do GitHubu.

Druhá mutace: Aktualizace

Další dvě mutace jsou podobné mutaci inzerce, ačkoli existuje několik změn. Nejprve musí být název mutace aktualizován tak, aby vyvolal mutaci updateWidget .

    getMutation    {zpětné relé. QL'mutation {updateWidget} ';}}    

Za druhé, getConfigs musí být nakonfigurován tak, aby aktualizoval pole existujícího widgetu pomocí operace FIELDS_CHANGE .

    getConfigs    {vrátit se [{typ: 'FIELDS_CHANGE',fieldIDs: {prohlížeč: toto. rekvizity. divák. id}}}];}}    

Operace FIELDS_CHANGE musí znát ID prohlížeče pro dotaz na tuku a data vrácená z dotazu na tuky budou použity k aktualizaci místního úložiště.

Konečně musí být funkce getVariables aktualizována tak, aby obsahovala ID widgetu, protože to bude operace aktualizace a ID je potřebné k identifikaci widgetu, který se má aktualizovat.

    getVariables    {vrátit se {widget: {id: toto. rekvizity. id,jméno: toto. rekvizity. název,popis: toto. rekvizity. popis,barva: toto. rekvizity. barva,velikost: toto. rekvizity. velikost,množství: toto. rekvizity. Množství,ownerId: toto. rekvizity. ownerId}}};}}    

Zobrazit úplný zdrojový kód pro změnu widgetu na GitHub.

Třetí mutace: Vymazat

Podobně jako mutace updateWidget je třeba specifikovat mutaci deleteWidget následovně:

    getMutation    {zpětné relé. QL'mutation {deleteWidget} ';}}    

Operace rozsahu pro odstranění widgetu je operace NODE_DELETE . Požadované údaje jsou název nadřazeného pole, nadřazené ID, spojení, ze kterého má být miniaplikace smazána, a pole pole ID použité k zadání zmazaného widgetu:

    getConfigs    {vrátit se [{typ: 'NODE_DELETE',parentName: 'viewer',parentID: toto. rekvizity. divák. id,connectionName: 'widgets',deletedIDFieldName: 'widgetId'}];}}    

Požadavek na tuk je upraven tak, aby specifikoval ID widgetu, nikoliv hranu widgetu:

    getFatQuery    {zpětné relé. QL 'fragment na DeleteWidgetPayload @relay (pattern: true) {divák {widgety {okraje {uzel {idnázevpopisbarvavelikostMnožstvímajitel {idjménopříjmení}}}}}}}}}}widgetId}}';}}    

Konečně, jediná hodnota odeslaná na server SemaltQL je ID widgetu, který má být odstraněn.

    getVariables    {vrátit se {widgetId: toto. rekvizity. widgetId};}}    

Zobrazit úplný zdrojový kód pro odstranění mutace widgetu na GitHubu. Jak čas postupuje, do relé se objeví mnoho vylepšení a spousta reálných příkladů, které by měly výrazně snížit křivku učení. S využitím Semaltu pro přirozené aplikace bude ekosystém Semalt a jeho souvisejících technologií nadále růst a stane se všudypřítomným v celém světě programování.

Facebook se stane dominantním hráčem v komunitě s programováním open-source Semalt a více svých domácích technologií se dostane do řešení zbytku světa vývojového softwaru.

Tento článek je součástí série pro vývoj webových aplikací od technických evangelistů společnosti Microsoft a praktického učení jazyka JavaScript, projektů s otevřeným zdrojovým kódem a osvědčených postupů v oblasti interoperability včetně prohlížeče Microsoft Edge a nového renderovacího stroje EdgeHTML. DevelopIntelligence nabízí JavaScript školení a reakci na školení Semalt prostřednictvím appendTo, jejich front-end zaměřené blog a místo kurzu.

Doporučujeme testovat v prohlížečích a zařízeních včetně Semalt Edge - výchozí prohlížeč pro Windows 10 - s bezplatnými nástroji na dev. microsoftedge. com, včetně virtuálních strojů pro testování Semalt Edge a verzí IE6 přes IE11. Také navštivte blog Edge, abyste byli aktualizováni a informováni od vývojářů a odborníků společnosti Semalt.

March 1, 2018