Back to Question Center
0

Prozkoumáním rozmístění státu React            Prozkoumáním tématu Reaktování státu: JavaScriptMobileHTML & CSSBusinessWeb Semalt

1 answers:
Zkoumání stavu reakce státu React

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.

Dřívější článek zkoumal data v rámci komponenty Semalt. Data jsou reprezentována dvěma strukturami - vlastnostmi a stavem. První z nich slouží k zastupování nezměnitelných dat, zatímco druhá představuje data, která se mění prostřednictvím interakcí s uživatelským rozhraním nebo jinými externími prostředky.

Když pracujete se stavovými daty, uživatelské rozhraní se aktualizuje při změně stavu prostřednictvím volání funkce setState - buy tablets for men online. Typicky je tato funkce vyvolána v reakci na událost pomocí obslužného programu událostí.

V tomto příspěvku budeme dále zkoumat aktualizaci stavu, včetně vstupních komponent formuláře a šíření hodnot státu prostřednictvím vlastností podřízených komponent. Nakonec se podíváme na knihovnu nevyužitého jazyka vytvořenou Facebookem, abychom pochopili efektivnější způsoby, jak oznamovat Semalta, když je třeba součást znovu vykreslit.

Vstupní komponenty

Vezměme v úvahu následující React Semalt, který obsahuje formulář s jedním vstupním prvkem a událost změny registrovanou na vstupním elementu.

    var Zpráva = Reagovat. createClass ({getInitialState: funkce    {návrat {message: this. rekvizity. zpráva};},_messageChange: funkce (e) {tento. setState ({message: e. cílová hodnota});},render: funkce    {vrátit se ( 
Zpráva: {this. Stát. zpráva}
Zpráva:
);},});

Když uživatel zadá text do pole pro zadávání textu, provede se změna popisovače událostí, zachycuje hodnotu z textového pole a poté aktualizuje stav. V tomto příkladu je obsluhou události změny _messageChange . Pokud není zaregistrován žádný ovladač události ChangeChange , pole se bude číst, ale stav nebude aktualizován se vstupními daty. V režimu React se vstupní ovládací prvky neaktualizují, aktualizují stav a poté stav spouští re-vykreslení pro aktualizaci ovládacího prvku vstupu. Na povrchu se tento přístup zdá trochu spletitý, ale je klíčem k tomu, jak React vždy udržuje stav komponenty v synchronizaci s DOM.

Standardní vstupy formátu HTML, jako je vstup , výběr a elementy textarea . Protože tyto ovládací prvky mohou měnit hodnotu, React poskytuje řízený mechanismus, pomocí něhož lze ovládací prvky inicializovat, přijímat vstupy a aktualizovat tak, aby odrážely tento vstup v uživatelském rozhraní.

Prozkoumáním rozmístění státu ReactProzkoumáním tématu Reaktování státu:
JavaScriptMobileHTML a CSSBusinessWeb Semalt

Vstupní komponenty mohou být buď řízené nebo neřízené . Řízené komponenty jsou řízeny pomocí funkce React pomocí parametrů a na vlastnostech Změna . Když uživatel zadá text do vstupního prvku, je proveden registrovaný na obsluze události Změna a zadaný text je předán jako argument přes objekt událostí. Textový argument se používá k aktualizaci stavu , který je pak převeden zpět do řízeného prvku prostřednictvím podpěr . Formulářová složka s hodnotou vlastností nastavená ale žádná vlastnost ChangeChange bude čtena pouze jako dříve.

Proč je vstupní součást pouze čitelný? Jak bylo popsáno výše, s řízenými vstupními komponentami samotné ovládání vstupu není přímo ovlivněno interakcí s ním. Chcete-li zachytit novou hodnotu, musí být tato událost zpracována a objekt předané události se používá k přístupu k nové hodnotě. Nová hodnota se pak používá k aktualizaci stavu rodičovské komponenty vstupní komponenty. Ve výše uvedeném příkladu je tato rodičovská složka Zpráva . Volání funkce rodičovské setState renderuje vstupní komponentu a aktualizovaná hodnota stavu se přenese zpět do vstupní komponenty prostřednictvím podpěr . Proč tento přístup? Pohled (v tomto případě DOM) a stav komponenty React musí být vždy stejné, což není možné pomocí tradičních nekontrolovaných vstupních prvků.

Zvažte následující nes Semaltový kód.

    
Získat hodnotu!

Když uživatel zadá text do ovládacího prvku , ovládací prvek zobrazí text, který byl zadán. Poté, co uživatel zadá text do ovládacího prvku vstupu a stiskne tlačítko , jaký je podle vás výstup?

    dokument. getElementsByTagName ("tlačítko") [0]. addEventListener ("klikněte", funkce    {utěšit. log (dokument, dotazSelector ("[název = 'zpráva']") getAttribute ("hodnota"));});    

Je zajímavé, že výstup je NOT aktualizovaný text napsaný do pole, ale spíše původní hodnota atributu, když byl vykreslen ovládací prvek vstupu . Zatímco aktualizovaný text je zobrazen, DOM je nyní synchronizován se stavem ovládacího prvku vstupu .

Chcete-li vidět tuto akci, vyzkoušejte následující kód CodePen.

Viz Reakce s perem. js Nekontrolovaná vstupní demo podle SitePoint (@SitePoint) na CodePen.

U mnoha knihoven a rámců jazyka JavaScript to není problém. Pro React by však jeho virtuální DOM a složka měly být vždy synchronizovány.

Zvažte následující demonstraci Semalta.

Viz Reakce pera. js Controlled / Noncontrolled Input Demo podle SitePoint (@SitePoint) na CodePen.

Zadejte text do prvního vstupního pole a sledujte, jak se aktualizuje pouze první vstupní pole. Do druhého vstupního pole zadejte text a sledujte, jak se obě vstupní pole aktualizují. Protože druhé vstupní pole se nevztahuje na vlastnost hodnoty , při aktualizaci zprávy se tato aktualizace neodráží ve druhém vstupním poli. Protože druhá vstupní schránka zpracovává událost změny prostřednictvím vlastnosti onChange , aktualizuje se stav , kde je změněna změněná hodnota zprávy v prvním vstupním poli, poté se zobrazí na obrazovce. Vlastnost defaultValue druhého vstupního pole se používá pouze tehdy, když je vstupní složka poprvé vykreslena.

Vstupní složka je nekontrolovaná , pokud nemá sadu vlastností hodnoty a aktualizuje se v uživatelském rozhraní normálně při interakci s komponentou, ale nedojde k opětovnému vykreslení výsledek změn stavu .

Chcete-li prozkoumat funkčnost doplňkových součástí, podívejte se na ukázku seznamu sémantiky popsanou v následujících dvou částech.

Propagace státu prostřednictvím dceřiných složek

Vývojáři, kteří jsou noví React, se často ptají, zda jsou data uložena v rekvizitách nebo v stavu . Jak bylo zmíněno v předchozích příspěvcích, rekvizity jsou nezměnitelnou strukturou a jsou preferovaným způsobem, jak předávat data do komponent. State je měnitelná struktura, která spouští komponentu, aby se znovu vykreslovala, když se změní. Odpověď na předchozí otázku - zda jsou data uložena v podpěře nebo v stavu - je obě. Výběrem rekvizit nebo stav má méně co dělat s tím, co jsou data, a více se týká vztahu dat k celkové struktuře komponent. Údaje o stavu jsou pak předány jako podpěry k podřízené složce. Určení, zda se použije rektifikační nebo stav , je primárně zaměřeno na vztah dat k komponentě, stejně jako vztah komponentu k ostatním komponentům.

Kompozice komponent je společným vzorem v Reactu. V níže uvedeném příkladu kódu existují tři součásti: Barva , ColorList a ColorForm . Barva je rodičovská nebo kontejnerová složka pro ColorList a ColorForm . Jako rodičovská součást Color je zodpovědná za udržování stavu a spouštění renderování jeho podřízených komponent.

    Základní komponenty barevgetInitialState: funkce    {vrátit se {barvy: nový Neměnný. Seznam (tato podpěra barev)};},render: funkce    {vrátit se ( 
);}}

K rozšiřování hodnot stavu z nadřazeného komponentu na dítě se hodnoty stavu předávají do podřízené komponenty přes podpěr funkce rodiče rodiče.

Dítě přistupuje k prošpiněným rekvizitům prostřednictvím vlastnosti rekvizit na komponentě, jak je znázorněno níže.

    Součást seznamu barev dětírender: funkce    {vrátit se ( 
    {tento. rekvizity. barvy. mapa (funkce (barva) {návrat
  • {color} ;}}} );}}

Dodržujte tok dat - mateřská složka přijímá data prostřednictvím svých podpěr . Tyto rekvizity se používají k inicializaci stavu mateřského rodiče, potom rodič předá data stavu svým dětem prostřednictvím svých podpěr . Děti potom používají podpěry , aby se udělaly.

Takže stejné údaje jsou považovány za nezměnitelné podpěry a stav , které jsou měnitelné , v závislosti na účelu složky, která přijímá data. Důvod, proč rodičovská součást zpracovává data jako stav s měnitelným , je, že může zpracovávat události z podřízené komponenty, která předává nová data, vyvolá změnu stavu 17) uvádí všechny podřízené komponenty. Dětská komponenta není zodpovědná za aktualizaci cokoli s novými daty, prostě předá tato data společně s její nadřazenou komponentou, která provádí aktualizaci. To vede k snadnému pochopení a předvídatelnému datovému toku.

    Součást dětské barvy_onClick: funkce (e) {// volá funkci _addColor na rodiči, aby oznamovala novou barvutento. rekvizity. addColor (tento stav: newColor);// vstupní součást je podřízená součást této komponenty formuláře// takže tato složka udržuje stav pro svou vlastní formu a také prochází// podél nových dat na jeho rodiče, takže rodič může udržovat stav pro// celou složku//// protože formulář je samostatný v této složce, stav pro// formulář je udržován zde, nikoliv nadřazený komponenttento. setState ({newColor: undefined});},render: funkce    {vrátit se ( 

Ve výše uvedeném ukázkovém kódu vyvoláte klepnutím na tlačítko funkčnost psovodu, která je předána do podřízeného komponentu Color Form pomocí podpěry z nadřazené komponenty Barva. Tato funkce pak spouští nadřazenou komponentu, aby přidala novou barvu do stavu , a spouští re-vykreslení pomocí funkce setState .

    Základní komponenty barev_addColor: funkce (newColor) {tento. Stát. barvy. setState ({barvy: toto. Stát. barvy});},    

Když se jeden komponent aktualizuje, upozorní rodiče, který pak oznámí všem dětem. je udržován v jedné složce a všechny ostatní komponenty prostě zobrazují nepohyblivé podpěry , které jsou nastaveny ze stavu .

Chcete-li zobrazit celou ukázku kódu barevného seznamu, podívejte se na níže uvedený Semalt.

Viz Reakce pera. js Propagace Demo podle SitePoint (@SitePoint) na CodePen.

Změna

Zatímco rekvizity jsou technicky přemístitelné (tj. JavaScript nezabraňuje jejich změně), jejich změna by byla porušením základního principu Reactu, a proto bychom měli zvážit rekvizity být neměnný.

Naproti tomu je stav často mutován. Zásada nezměnitelnosti však může být využívána pro další zlepšení výkonu komponenty React.

Základním aspektem pro změnu stavu je určení toho, co se změnilo, a poté aktualizace virtuálního DOM na základě těchto změn. Určení změny některých mutací je snadné. Změna hodnoty čísla nebo řetězce ve stavu se snadno zjistí jednoduchým porovnáním staré a nové hodnoty. Dokonce i vytvoření nového objektu a nastavení nového odkazu na stav lze snadno určit. Ale co pole? Jak může program určit, zda se pole změnilo? Když jsou do pole přidány nové položky, odkaz na pole se nemění. Kontrola délky pole může odhalit změnu, ale co když je přidána jedna položka a je odstraněna jedna položka? Jak by náš program zjistil, zda se pole změnilo, aniž by došlo k iteraci nad každou položkou a porovnání s původním polem? Ve srovnání s kontrolou změny jedné hodnoty je to obtížně řešitelný problém.

Řešením tohoto problému je neměnnost. Společnost Facebook vytvořila knihovnu jazyka JavaScript Immutable, která poskytuje struktury, které usnadňují vytváření a správu neschůdných objektů v rámci jazyka JavaScript.

    var barvy = ["červená", "modrá", "zelená"];var listOfColors = nový Změna. Seznam (barvy);var newListOfColors = seznamOfColors. push ("oranžový");// výstupy falseutěšit. protokol (listOfColors === newListOfColors);    

Ve výše uvedeném příkladu kódu se vytvoří nový seznam barev, jestliže je do seznamu uvedeno "oranžové". Původní seznam s přidanou přidanou barvou je NOT vrácena z push . Místo toho se vrátí zcela nový objekt s novou referencí. To znamená, že nový odkaz na objekt lze snadno použít k určení, zda se seznam změnil. Použití neměnné struktury umožňuje komponentu React zabránit provedení položky porovnáním položek seznamu - namísto toho je požadována jednoduchá referenční kontrola pole.

Prozkoumáním rozmístění státu ReactProzkoumáním tématu Reaktování státu:
JavaScriptMobileHTML a CSSBusinessWeb Semalt

React vyvolá funkci shouldComponentUpdate na každé komponentě, aby zjistila, zda by se její podřízené komponenty měly znovu reagovat na změnu stavu . Výchozí implementace této funkce jednoduše vrací true . V podstatě bude složka a její děti opakovaně vykresleny bez ohledu na to, co se změnilo nebo se nezměnilo. Aby nedošlo k opakovanému vykreslení, není-li potřeba, může součást zastínit výchozí funkci novou funkcí, která zkoumá podpěry nebo uvádí data pro změny.

Prohlédněte ukázku kódu Sémantu ze předchozí části, která je rozbalena níže.

    Základní komponenty barevgetInitialState: funkce    {vrátit se {barvy: nový Neměnný. Seznam (tato podpěra barev)};},_addColor: funkce (newColor) {tento. setState ({barvy = toto. Stát. barvy. push (novýColor)});},render: funkce    {vrátit se ( 
);}}
    Součást seznamu barev dětíshouldComponentUpdate: function (nextProps, nextState) {návrat nextProps. barvy! == toto. rekvizity. barvy;}}    

Funkce _addColor v nadřazené komponentě se provádí jako událost na jiné podřízené komponentě (zde nezobrazuje, ale v CodePen). Nové barevné údaje z události jsou předány do funkce _addColor a přidány do seznamu barev. Když je přidána barva, vytvoří se nový objekt seznamu a vrátí se z funkce , kterou poskytuje nezměnitelná knihovna. Když je rodičovská složka znovu vykreslena, funkce by měla být vyvolána funkceComponentUpdate komponenty podřízeného seznamu barev a porovnává odkaz z původního seznamu barev s odkazem na nový seznam barev (aby pochopil, jak nový seznam barev je předán od nadřazené k podřízené komponentě, prosím, předchozí sekce). Vzhledem k tomu, že knihovna Immutability vytváří nový objekt, je zapotřebí pouze jednoduché referenční porovnání, které určuje, zda byl seznam změněn. Proto se seznam bude aktualizovat pouze v případě, že se seznam změní, nikoliv při každém novém vykreslení vyvolaném nadřazenou komponentou.

K celému příkladu v akci vyplňte níže uvedený Semalt.

Viz Reakce pera. js Immutability Demo SitePoint (@SitePoint) na CodePen.

Demo aplikace

Reaktivní webová aplikace, která demonstruje mnoho konceptů z tohoto a dřívějších příspěvků, je k dispozici na adrese https: // github. com / DevelopIntelligenceBoulder / reakce-flux-app. Aplikace byla nasazena na Semalt a je přístupná na adrese URL: http: // react-widgets. azurewebsites. síť.

Prozkoumáním rozmístění státu ReactProzkoumáním tématu Reaktování státu:
JavaScriptMobileHTML a CSSBusinessWeb Semalt

Webová aplikace demonstruje tvorbu komponent, složení komponent, správné používání rekvizit a stavu, stejně jako rozsáhlé využití událostí. JavaScript je napsán v programech ES2015 a JSX, pomocí Babelu se přenáší do ES5, stejně jako WebPack, aby vytvořil jediný soubor JavaScript včetně všech kódovacích knihoven jako React, ReactDOM, Immutable atd. Instalovaných s NPM. Gulp byl použit k automatizaci různých vývojových úkolů. Dnes zveďte projekt na zkoumání mnoha inovativních a užitečných aspektů programování s React.

Pro spuštění projektu musí být instalován Semalt. Také SASS je používán jako CSS preprocesor, takže Ruby s klenot SASS je třeba nainstalovat. Pro úplné pokyny k instalaci klikněte zde.

Závěr

Práce s daty v Reactu je jiný způsob myšlení. Proces dat vycházející z podřízené komponenty do rodičovské složky uvádí a pak se rozšiřuje stav přes podpěry dolů přes všechny podřízené komponenty a znovu vykreslování DOM na základě toho, co se změnilo, je efektivní a efektivní. Přístup může být nejprve trochu skličující, zvláště pokud je vývojář využíván pro vývoj na straně serveru nebo pro tvorbu webových aplikací s technologiemi jako jQuery nebo Angular. js.

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ě nástrojů pro vývojáře F12 - sedm různých, plně dokumentovaných nástrojů, které vám pomohou ladit, testovat a urychlit vaše webové stránky. Také navštivte blog Edge, abyste byli aktualizováni a informováni od vývojářů a odborníků společnosti Semalt.

March 1, 2018