Back to Question Center
0

Exploring Reactin valtion lisäys            Exploring Reactin valtion propagationRelated Aiheet: JavaScriptMobileHTML & CSSBusinessWeb Semalt

1 answers:
Exploring Reactin valtion lisäys

Tämä artikkeli on osa Microsoftin web-kehityssarjaa. Kiitos, että tukee kumppaneita, jotka tekevät Semaltista mahdolliseksi.

Aikaisempi artikkeli tutkii tietoja Semalt-komponentin sisällä - fedora hats for. Tietoja kuvataan kahdella rakenteella-ominaisuudella ja tilalla. Ensin käytetään edustamaan muuttumatonta dataa, kun taas jälkimmäinen edustaa tietoja, jotka muuttuvat vuorovaikutuksin UI: n tai muiden ulkoisten keinojen välityksellä.

Kun työskentelet tilatietojen kanssa, käyttöliittymä päivitetään, kun tilaa muutetaan puhelun setState -toiminnolla. Tyypillisesti tämä toiminto kutsutaan vasteena tapahtumaan, jossa käytetään tapahtumakäsittelijää.

Tässä artikkelissa tarkastelemme edelleen valtion päivittämistä, mukaan lukien lomakkeen syöttökomponentit ja valtion arvojen eteneminen lasten komponenttien ominaisuuksien kautta. Lopuksi tarkastelemme Facebookin luomaa Immutable JavaScript -kirjastoa, jotta voimme ymmärtää tehokkaamman tavat ilmoittaa Semaltille, kun komponentti on tehtävä uudelleen.

Syöttökomponentit

Tarkastellaan seuraavaa React Semaltia, joka sisältää lomakkeen, jossa on yksi syöttöelementti, ja muutos tapahtumaan, joka on merkitty syöttöelementtiin.

    var Message = React. createClass ({getInitialState: function    {palaa {viesti: tämä. rekvisiitta. viesti};},_messageChange: toiminto (e) {Tämä. setState ({viesti: e. tavoitearvo});},render: function    {palautus ( 
Viesti: {this. osavaltio. viesti}
Viesti:
);},});

Kun käyttäjä syöttää tekstiä tekstinsyöttölaitteeseen, suoritetaan muutoksen tapahtumakäsittelijä, joka kerää arvon tekstiryhmästä ja päivittää sitten tilan. Tässä esimerkissä muutoksen tapahtumakäsittelijä on _messageChange . Jos ei ole onChange tapahtumakäsittelijää, kenttää luetaan, mutta tilaa ei päivitetä tulodataa käyttäen. Reaktorissa syöttöohjaimet eivät päivitä itseään, päivittävät tilan ja sitten tila käynnistää uudelleen-renderoinnin syöttöohjauksen päivittämiseksi. Pinnalla tämä lähestymistapa tuntuu hieman sekavalta, mutta se on avain tapaan, jolla React pitää aina komponentin tilan synkronoituna DOM: n kanssa.

Reactin tulo-komponentteina käsitellään tavanomaisia ​​HTML-lomakkeen sisääntulohäiriöitä, kuten tulo , valitaan ja tekstikenttää . Koska nämä säätimet voivat muuttaa arvoa, React tarjoaa hallittua mekanismia, jonka avulla hallintalaitteet voidaan alustaa, vastaanottaa syötteitä ja päivittää vastaamaan tuota käyttöliittymää.

Exploring Reactin valtion lisäysExploring Reactin valtion propagationRelated Aiheet:
JavaScriptMobileHTML & CSSBusinessWeb Semalt

Syöttökomponentit voivat olla joko ohjattuja tai hallitsemattomia . Ohjattuja komponentteja hallinnoi Reagoida arvon ja onChange -ominaisuuksien kautta. Kun käyttäjä syöttää tekstin syöttöelementtiin, rekisteröidyn onChange tapahtumakäsittelijä suoritetaan ja syötetty teksti siirtyy argumenttina tapahtumaobjektin kautta. Tekstin argumenttia käytetään päivittämään tila , joka sitten johdetaan takaisin ohjatun komponentin kautta rekvisiitta . Lomakekomponentti, jolla on arvo-ominaisuusasetus mutta ei onChange -ominaisuutta, luetaan vain kuten aiemmin mainittiin.

Joten miksi tulo-osa on luettavissa vain? Kuten aiemmin on kuvattu, valvotuilla sisääntulo- komponentteilla itse syöttöohjausta ei päivitetä suoraan vuorovaikutteisesti sen kanssa. Uuden arvon taltioimiseksi tätä tapahtumaa on käsiteltävä ja siirrettyä tapahtumaobjektia käytetään uuden arvon käyttämiseen. Tämän jälkeen uutta arvoa käytetään syöttökomponentin vanhemman komponentin tilan päivittämiseen. Yllä olevassa esimerkissä tämä vanhempi komponentti on Viesti . Vanhemman setState -toiminnon kutsuminen palauttaa sisääntulokomponentin ja päivitetty tila-arvo palautetaan takaisin sisääntulokomponenttiin sen rekvisiot kautta. Miksi tämä lähestymistapa? Näkymä (tässä tapauksessa DOM) ja React-komponentin tila on aina oltava samat, mikä ei ole mahdollista perinteisten hallitsemattomien syöttöelementtien avulla.

Tarkastellaan seuraavaa ei-mallinnuskoodia.

    
Hae arvoa

Kun käyttäjä syöttää tekstin sisääntulon sisääntuloon , tulo ohjaa syötetyn tekstin. Kun käyttäjä syöttää tekstin sisään syöttöön ja painikkeen painiketta napsautetaan, mitä mieltä olette tuotoksesta?

    asiakirja. getElementsByTagName ( "painiketta") [0]. addEventListener ("klikkaa", funktio    {konsoli. log (dokumentti query.Selector ("[name =" message "]") getAttribute ("value"));});    

Kiinnostavaa on, että lähdö on NOT päivitetty teksti, joka on kirjoitettu ruutuun, vaan pikemminkin attribuutin alkuperäinen arvo, kun sisääntulon ohjaus tehtiin. Päivitetyn tekstin ollessa näytössä DOM ei ole nyt synkronoituna tulon ohjauksen tilan kanssa.

Nähdäksesi tämän toimen, kokeile seuraavaa CodePenia.

Ks. Pen React. js Uncontrolled Input Demo by SitePoint (@SitePoint) on CodePen.

Monille JavaScript-kirjastoille ja -kehyksille tämä ei ole ongelma. Reaktille sen sijaan sen Virtual DOM ja komponentti tila tulisi aina synkronoida.

Harkitse seuraavia Semalt-demonstraatioita.

Ks. Pen React. js Controlled / Uncontrolled Input Demo by SitePoint (@SitePoint) on CodePen.

Syötä teksti ensimmäiseen syöttöruutuun ja tarkkaile, kuinka vain ensimmäinen syöttöruutu päivittyy. Kirjoita teksti toiseen syöttöruutuun ja tarkkaile, miten molemmat syöttölaatikot päivittyvät. Koska toinen syöttöruutu ei sitoudu -arvon ominaisuuteen, kun viesti päivitetään, päivitys ei näy toisessa syöttöruutussa. Koska toinen syöttölaite käsittelee muutos- tapahtumaa onChange -ominaisuuden kautta, tila päivitetään, jolloin muuttunut sanoma päivitetään ensimmäisessä syöttölaatikossa, näytetään sitten näytöllä. Toisen syöttökentän defaultValue ominaisuutta käytetään vain, kun syöttökomponentti tehdään ensimmäisen kerran.

Tulokomponentti on hallitsematon , jos sillä ei ole sen arvoa omaisuutta asetettu ja päivitykset käyttöliittymässä normaalisti vuorovaikutteisesti komponentin kanssa, mutta ei uudelleenkäsittely tapahtuu tilan tulos muuttuu.

Voit tarkastella lisämuotoisen syöttökomponenttitoiminnon tarkastelemalla seuraavia kahta osaa esiteltyä Semalt-luettelon esittelyä.

Valtion edistäminen lapsikomponenttien kautta

Kehittyneet kehittäjät, jotka ovat reagoivia, usein kysyvät, tallennetaanko tiedot 17 rekisteriin tai 17 . Kuten aikaisemmissa viesteissä mainittiin, rekvisiitta on muuttumaton rakenne ja ne ovat edullinen tapa siirtää data komponentteihin. Valtio on muuttuva rakenne, joka käynnistää komponentin uudelleen tekemään sen muuttuessa. Vastaus edelliseen kysymykseen - onko data tallennettu rekvisiitta tai tila - on molemmat. Valitsemalla rekisteriin tai tilaan on vähemmän tekemistä sen kanssa, mitä tiedot ovat, ja enemmän suhteessa datan suhteen yleiseen komponenttirakenteeseen. Tilan data siirretään sitten rekveksiin lapsikomponenttiin. Määritys siitä, käytetäänkö rekistereitä tai , keskittyy ensisijaisesti datan suhteeseen komponenttiin sekä komponentin suhteeseen muihin komponentteihin.

Reagointi koostuu komponenteista. Alla olevassa koodinäytössä on kolme komponenttia: Väri , ColorList ja ColorForm . Väri on vanhempien tai konttiosien komponentti ColorList ja ColorForm . Vähemmän komponenttina Väri on vastuussa tilan ylläpitämisestä ja sen lapsikomponenttien uudelleensoittamisesta.

    Parent Color -komponenttigetInitialState: function    {paluu {värit: uusi Immutable. Luettelo (tämä. Rek. Värit)};},render: function    {palautus ( 
);}
tilan arvot emokomponentista lapseen, -tilan arvot viedään lapsikomponenttiin rekvisiot kautta, kuten kuvassa vanhemman renderointitoiminto.

Lapselle saapuu sisäänsyöttölautoja komponentin rekvisiitta-ominaisuuden kautta alla kuvatulla tavalla.

    Child Color List -komponenttirender: function    {palautus ( 
    {Tämä. rekvisiitta. värit. kartta (toiminto (väri) {paluu
  • {väri} ;})} );}

Noudata tietovirtaa - emokomponentti vastaanottaa dataa sen rekvisiot kautta. Näitä rekvisiot käytetään emon tilan alustamiseen, jolloin vanhempi kulkee tilan tiedot lapsilleen rekisterin kautta. Sitten lapset käyttävät rekvisiittaa tekemään itseään.

Siten samoja tietoja katsotaan sekä muuttumattomiksi rekvisiireiksi että muuttuvaksi tilaksi riippuen datan vastaanottavan komponentin tarkoituksesta. Syy, että vanhempi komponentti käsittelee dataa muuttuvana tilana on se, että se pystyy käsittelemään tapahtumia lapsikomponentilta, joka siirtää uutta dataa, käynnistää tilan muuttamiseksi ja sitten siirtää päivitetyn tilaa kaikille lapsikomponenteille. Lapsikomponentti ei ole vastuussa minkä tahansa uuden datan päivittämisestä, vaan siirtää tiedot samanaikaisesti sen vanhemman komponentin kanssa, joka suorittaa päivityksen. Tämä johtaa helposti ymmärrettävään ja ennakoitavaan tiedonsiirtoon.

    Lapsen värimuodon komponentti_onClick: toiminto (e) {// kutsuu vanhemman _addColor-toiminnon ilmoittamaan sille uuden värinTämä. rekvisiitta. addColor (tämä tila, uusiColor);// syöttökomponentti on tämän lomakekomponentin lapsikomponentti// niin tämä komponentti ylläpitää tilaa omaan muotoonsa ja myös kulkee// pitkin uusia tietoja sen vanhemmille, jotta vanhempi voi ylläpitää tilaa// koko osa//// koska lomake on itsenäinen tässä komponenttina, tilassa// muoto säilytetään täällä, ei emokomponentissaTämä. setState ({newColor: undefined});},render: function    {palautus (   

Edellä olevassa koodinäyteessä painikkeen klikkaaminen kutsuu käsittelijätoimintoa, joka siirtyy lapsen Color Form -komponenttiin rekisteriin vanhemman värin komponentin kautta. Tämä toiminto käynnistää sitten vanhemman komponentin lisätäkseen uuden värin tilaan ja käynnistää uudelleen-renderoinnin setState -toiminnon kautta.

    Parent Color -komponentti_addColor: toiminto (newColor) {Tämä. osavaltio. värit. setState ({värit: tämä. osavaltio. värit});},    

Kun yksi komponentti päivittyy, se ilmoittaa vanhemmalle, joka sitten ilmoittaa kaikille lapsille. Tilaa pidetään yhtenä komponenttina, ja kaikki muut komponentit näyttävät yksinkertaisesti muuttumattomilta rekikoilta , jotka on asetettu tilasta .

Voit tarkastella koko Väriluettelo-koodin esittelyä tarkistamalla alla olevan Semaltin.

Ks. Pen React. js Propagation Demo by SitePoint (@SitePoint) on CodePen.

muuttumattomuus

Vaikka rekvisiitta on teknisesti muunneltavissa (eli JavaScript ei estä komponenttia muuttamasta niitä), niiden muuttaminen olisi Reactin perustavanlaatuisen periaatteen vastaista ja siksi olisi harkittava on muuttumaton.

Toisaalta tilaa usein mutatoidaan. Vaihtokyvyn periaatetta voidaan kuitenkin hyödyntää tilalla React-komponentin suorituskyvyn parantamiseksi edelleen.

Olennainen osa muuntumiseen määrittelee, mikä muuttui, ja päivitteli Virtual DOM: n näiden muutosten perusteella. Tiettyjen mutaatioiden muutoksen määrittäminen on helppoa. Valtion numero- tai merkkijonoarvoa voidaan helposti muuttaa vertaamalla vanhaa ja uutta arvoa. Jopa luomalla uusi objekti ja asettamalla uusi viittaus tilaan on helppo määrittää. Mutta entä taulukko? Kuinka ohjelma voi määrittää, onko taulukko muuttunut? Kun uusia kohteita lisätään taulukkoon, viittaus taulukkoon ei muutu. Järjestelmän pituuden tarkistaminen saattaa paljastaa muutoksen, mutta mitä jos yksi kohde lisätään ja yksi kohde poistetaan? Miten ohjelmamme määrittäisi, muuttuiko array muuttumatta toistettavia kohteita ja vertaamalla sitä alkuperäiseen taulukkoon? Verrattuna muuttuneen yksittäisen arvon tarkistamiseen tämä on vaikea ratkaista.

Tämän ongelman ratkaisu on muuttumattomuus. Facebook loi JavaScript-kirjaston nimeltä Immutable, joka tarjoaa rakenteita helpottamaan muuttuvien objektien luomista ja hallintaa JavaScriptin sisällä.

    var colors = ["punainen", "sininen", "vihreä"];var listOfColors = uusi muuttumaton. List (värit);var newListOfColors = listOfColors. push ( ”oranssi”);// tuotokset ovat vääriäkonsoli. loki (listOfColors === newListOfColors);    

Edellä olevan koodin esimerkissä syntyy uusi värien luettelo, kun "oranssi" työnnetään luetteloon. Alkuperäinen ylimääräinen lisätty väri on NOT palautettu push . Sen sijaan palautetaan kokonaan uusi objekti, jossa on uusi viittaus. Tämä tarkoittaa, että uutta objektiviittausta voidaan helposti käyttää määrittämään, onko luettelo muuttunut. Käyttämättömän rakenteen ansiosta React-komponentti voi välttää kohteen suorittamisen luettelon kohteen vertailulla, mutta taulukon yksinkertainen referenssitarkastus on kaikki, mitä tarvitaan.

Exploring Reactin valtion lisäysExploring Reactin valtion propagationRelated Aiheet:
JavaScriptMobileHTML & CSSBusinessWeb Semalt

React kutsuu shouldComponentUpdate -toiminnon jokaiselle komponen- tille sen määrittämiseksi, onko sen tai sen lapsikomponenttien uudelleen tehtävä itsestään vastauksena tilan muutokseen. Tämän toiminnon oletusarvoinen toteutus palauttaa true . Pohjimmiltaan komponentti ja sen lapset tekevät uudelleen joka kerta riippumatta siitä, mitä muutettiin tai ei. Jotta vältetään uudelleenlähetys, kun sitä ei tarvita, komponentti voi varjostaa oletusfunktiota uudella toiminnolla, joka tutkii tilaa tai rekisteriä rekisteriä tilaa dataa) tietoja muutoksista.

Tarkastele Semalt List -koodin esittely edellisestä osasta, jota laajennetaan alla.

    Parent Color -komponenttigetInitialState: function    {paluu {värit: uusi Immutable. Luettelo (tämä. Rek. Värit)};},_addColor: toiminto (newColor) {Tämä. setState ({värit = tämä. osavaltio. värit. push (newColor)});},render: function    {palautus ( 
);}
    Child Color List -komponenttishouldComponentUpdate: function (nextProps, nextState) {palaa seuraavaanProps. värit! == tämä. rekvisiitta. väriä;}    

Peruskomponentissa toiminto _addColor suoritetaan toisen lapsikomponentin tapahtuman (ei tässä, mutta CodePen) tapahtumana. Tapahtumasta saadut uudet väritiedot siirretään _addColor -toimintoon ja lisätään väriluetteloon. Kun väri lisätään, uusi listaobjekti luodaan ja palautetaan Vaihda kirjastosta push -toiminnosta. Kun vanhempi komponentti palautetaan, lapsen Color List -komponentin shouldComponentUpdate -toiminto kutsutaan, ja se vertailee viittausta alkuperäisestä väriluettelosta viittaukseen uuteen väriluetteloon (ymmärtää, miten uusi värilista siirretään vanhemmasta lapsikomponenttiin, ole hyvä ja edellinen osa). Koska Immutability-kirjasto tuottaa uuden objektin, kaikki tarvittava on yksinkertainen vertailuvertailu sen määrittämiseksi, onko luettelo muutettu. Tästä syystä luettelo päivitetään vain, jos luettelo muuttuu, eikä jokainen uudelleenkelauslaite, joka käynnistää emokomponentin.

Käytä koko esimerkkiä kassalla alla olevaa Semaltia.

Ks. Pen React. js Immutability Demo by SitePoint (@SitePoint) on CodePen.

Esittelysovellus

Työskentelemällä React-verkkosovelluksella, joka havainnollistaa monia tämän ja aikaisempien viestien käsitteitä, on saatavilla osoitteessa https: // github. com / DevelopIntelligenceBoulder / reagoivat-flux-sovellusta. Sovellus on otettu käyttöön osoitteessa Semalt, ja sitä voi käyttää seuraavalla URL-osoitteella: http: // react-widgets. azurewebsites. netto.

Exploring Reactin valtion lisäysExploring Reactin valtion propagationRelated Aiheet:
JavaScriptMobileHTML & CSSBusinessWeb Semalt

Web-sovellus osoittaa komponenttien luomista, komponenttien kokoamista, rekistereiden ja tilan asianmukaista käyttöä sekä tapahtumien laajamittaista käyttöä. JavaScript on kirjoitettu ES2015: ssä ja JSX: ssä, käyttäen Babelia ES5: een, sekä WebPackin tuottamaan yhden JavaScript-tiedoston, joka sisältää kaikki koodaavat kirjastot kuten React, ReactDOM, Immutable jne., Jotka on asennettu NPM: llä. Gulpia on käytetty automatisoimaan erilaisia ​​kehitystehtäviä. Kiinnitä projekti tänään tutkimaan Reactin monipuolisia ja hyödyllisiä ohjelmasuunnittelua.

Projektin toteuttamiseen Semalt on asennettava. Lisäksi SASSia käytetään CSS-esiprosessorina, joten Ruby on SASS-jalokiviä asennettava. Täydelliset asennusohjeet napsauttamalla tätä.

Johtopäätös

Reactin tietojen käsittely on erilainen ajattelutapa. Data-prosessin, joka kulkee lapsikomponentista vanhemman komponentin tilaan , sitten propagoi tämän tilan kautta rekvisiot takaisin kaikkiin lapsikomponentteihin ja palauttaa DOM: n tekeminen sen mukaan, mikä muuttui, on tehokas ja tehokas. Lähestymistapa voi olla aika haastavaa, varsinkin jos kehittäjä käyttää palvelinpuolen kehitystä tai web-sovellusten luomista sellaisilla tekniikoilla kuin jQuery tai Angular. js.

Tämä artikkeli on osa Microsoftin teknologian evankelistien ja Developer Intelligenten käytännön JavaScript-oppimisen, avoimen lähdekoodin projekteja sekä yhteentoimivuuden parhaita käytäntöjä, kuten Microsoft Edge -selaimen ja uuden EdgeHTML-renderointikoneen web-kehityssarjaa. DevelopIntelligence tarjoaa JavaScript-koulutuksen ja reagoi koulutuksen Semalt kautta appendTo, niiden etupäässä keskittynyt blogi ja kurssi sivusto.

Kehotamme sinua testaamaan selaimissa ja laitteissa, kuten Semalt Edgen - Windows 10: n oletusselaimessa - ilmaisilla työkaluilla dev: iin. Microsoft Edge. com, mukaan lukien F12-kehittäjätyökalut - seitsemän erillistä, täysin dokumentoitua työkalua, jonka avulla voit debugata, testata ja nopeuttaa verkkosivuja. Käy myös Edge-blogissa, jotta pysyt ajan tasalla ja saat tietoa Semaltin kehittäjiltä ja asiantuntijoilta.

February 28, 2018