reagoi.Komponentti

tällä sivulla on yksityiskohtainen API-viittaus React-komponenttiluokan määritelmään. Siinä oletetaan, että olet perehtynyt Perusreaktiokäsitteisiin, kuten komponentteihin ja rekvisiittaan, sekä tilaan ja elinkaareen. Jos et ole, lue ne ensin.

Overview

React voit määritellä komponentit luokiksi tai funktioiksi. Luokiksi määritellyt komponentit tarjoavat tällä hetkellä enemmän ominaisuuksia, jotka on kuvattu yksityiskohtaisesti tällä sivulla. React-komponenttiluokan määrittelemiseksi on laajennettava React.Component:

class Welcome extends React.Component { render() { return <h1>Hello, {this.props.name}</h1>; }}

ainoa React.Component alaluokka on nimeltään render(). Kaikki muut tällä sivulla kuvatut menetelmät ovat valinnaisia.

suosittelemme vahvasti olemaan luomatta omia peruskomponenttiluokkia. React-komponenteissa koodin uudelleenkäyttö tapahtuu ensisijaisesti koostumuksen eikä periytymisen kautta.

Huomautus:

reagointi ei pakota käyttämään ES6-luokan syntaksia. Jos haluat välttää sitä, voit käyttää create-react-class modulia tai vastaavaa mukautettua abstraktiota sen sijaan. Lue lisää käyttämällä React ilman ES6: ta.

komponentin elinkaari

jokaisella komponentilla on useita ”elinkaarimenetelmiä”, jotka voit ohittaa ajaaksesi koodia tiettyinä prosessin ajankohtina. Voit käyttää tätä elinkaarikaaviota lunttilappuna. Alla olevassa luettelossa yleisesti käytetyt elinkaarimenetelmät on merkitty lihavoidulla. Loput ovat olemassa suhteellisen harvinaisiin käyttötapauksiin.

asennus

näitä menetelmiä kutsutaan seuraavassa järjestyksessä, Kun luodaan jonkin komponentin instanssi ja lisätään Dom: iin:

  • constructor()
  • static getDerivedStateFromProps()render()componentDidMount()

huomaa:

näitä menetelmiä pidetään vanhoina ja niitä kannattaa välttää uudessa koodissa:

    UNSAFE_componentWillMount()/ul>

päivittäminen

päivitys voi johtua rekvisiitan tai tilan muutoksista. Näitä menetelmiä kutsutaan seuraavassa järjestyksessä komponenttia uudelleen renderöidessä:

  • static getDerivedStateFromProps()
  • shouldComponentUpdate()render()

  • getSnapshotBeforeUpdate()
  • componentDidUpdate()

Huom:

näitä menetelmiä pidetään vanhoina ja niitä kannattaa välttää uudessa koodissa:

    UNSAFE_componentWillUpdate()UNSAFE_componentWillReceiveProps()

irrottamatta

tätä menetelmää kutsutaan, kun komponentti poistetaan DOM:

  • componentWillUnmount()

virheenkäsittely

näitä menetelmiä kutsutaan, kun renderöinnin aikana, elinkaarimenetelmässä tai minkä tahansa lapsikomponentin rakentajassa on virhe.

    static getDerivedStateFromError() componentDidCatch()

muut sovellusliittymät

jokainen komponentti sisältää myös joitakin muita sovellusliittymiä:

    setState()forceUpdate()

Luokkaominaisuudet

    defaultProps

  • displayName

instance properties

  • props
  • state

viite

yleisesti käytetyt elinkaarimenetelmät

tämän jakson menetelmät kattavat suurin osa käyttötapauksista törmäät react-komponenttien luomiseen. Katso kuva tästä elinkaarikaaviosta.

renderöinti ()

render()

render() menetelmä on luokkakomponentin ainoa vaadittu menetelmä.

kutsuttaessa tulisi tutkia this.props ja this.state ja palauttaa jokin seuraavista tyypeistä:

  • reagoivat elementit. Tyypillisesti luotu kautta JSX. Esimerkiksi <div /> ja <MyComponent /> ovat Reaktioalkioita, jotka ohjeistavat reagoimaan tekemään Dom-solmun tai toisen käyttäjän määrittelemän komponentin.
  • Arrays and fragments. Voit palauttaa useita elementtejä renderistä. Katso lisätietoja fragmenttien dokumentaatiosta.
  • portaalit. Anna sinun tehdä lapsista eri osa-alueita. Katso lisätietoja portaalien dokumentaatiosta.
  • merkkijono ja numerot. Nämä ovat renderöity tekstisolmuina DOM: ssä.
  • Booleans tai null. Älä tee mitään. (Esiintyy lähinnä tukemaan return test && <Child /> mallia, jossa test on boolea.)

render() funktion tulee olla puhdas, eli se ei muuta komponentin tilaa, se palauttaa saman tuloksen joka kerta, kun sitä kutsutaan, eikä se ole suoraan vuorovaikutuksessa selaimen kanssa.

Jos haluat olla vuorovaikutuksessa selaimen kanssa, tee työsi componentDidMount() tai muilla elinkaarimenetelmillä sen sijaan. render() puhtaana pitäminen helpottaa komponenttien miettimistä.

Huomautus

render()ei vedota, josshouldComponentUpdate()palauttaa epätosi.

konstruktori ()

constructor(props)

Jos ei alusteta tilaa eikä sidota menetelmiä, Reaktiokomponentille ei tarvitse toteuttaa konstruktoria.

Reaktiokomponentin rakentaja kutsutaan ennen sen asentamista. Toteutettaessa konstruktoria React.Component alaluokalle, kannattaa soittaa super(props) ennen mitään muuta lausetta. Muuten this.props jää määrittelemättömäksi konstruktorissa, mikä voi johtaa bugeihin.

tyypillisesti React-konstruktioita käytetään vain kahteen tarkoitukseen:

  • alustaa paikallista tilaa antamalla objekti this.state.
  • Binding event handler methods to an instance.

setState()constructor(). Sen sijaan, jos komponenttisi tarvitsee käyttää paikallista tilaa, anna alkutila this.state suoraan konstruktoriin:

constructor(props) { super(props); // Don't call this.setState() here! this.state = { counter: 0 }; this.handleClick = this.handleClick.bind(this);}

Constructor on ainoa paikka, jossa sinun tulee antaa this.state suoraan. Kaikissa muissa menetelmissä on käytettävä this.setState() sen sijaan.

Vältä lisäämästä mitään sivuvaikutuksia tai tilauksia konstruktoriin. Näissä käyttötapauksissa käytetään sen sijaan componentDidMount().

Huomautus

Vältä rekvisiitan kopioimista tilaan! Tämä on yleinen virhe:

constructor(props) { super(props); // Don't do this! this.state = { color: props.color };}

ongelma on, että se on sekä tarpeeton (voit käyttää this.props.color suoraan sen sijaan), ja luo vikoja (color prop ei näy tilassa).

käytä tätä mallia vain, jos haluat tarkoituksella jättää prop-päivitykset huomiotta. Tällöin on järkevää nimetä prop uudelleen nimellä initialColor tai defaultColor. Tämän jälkeen voidaan pakottaa komponentti ”nollaamaan” sen sisäinen tila muuttamalla sen key tarvittaessa.

Lue blogikirjoituksemme johdetun tilan välttämisestä saadaksesi tietoa siitä, mitä tehdä, jos luulet tarvitsevasi jonkin tilan riippumaan rekvisiitasta.

componentDidMount ()

componentDidMount()

componentDidMount()vedotaan heti, kun osa on asennettu (työnnetty puuhun). Alustus, joka vaatii Dom solmut pitäisi mennä tähän. Jos haluat ladata tietoja etäpisteestä, tämä on hyvä paikka asentaa verkkopyyntö.

tällä menetelmällä on hyvä perustaa mahdolliset liittymät. Jos teet sen, älä unohda peruuttaa componentWillUnmount().

setState() välittömästi componentDidMount(). Se käynnistää ylimääräisen renderöinnin, mutta se tapahtuu ennen kuin selain päivittää näytön. Tämä takaa sen, että vaikka render() kutsutaan tässä tapauksessa kahdesti, käyttäjä ei näe välitilaa. Käytä tätä mallia varoen, koska se aiheuttaa usein suorituskykyyn liittyviä ongelmia. Useimmissa tapauksissa alkutila pitäisi voida määrittää constructor() sen sijaan. Se voi kuitenkin olla tarpeen tapauksissa, kuten modaalit ja työkaluvihjeet, kun sinun täytyy mitata Dom-solmu ennen kuin teet jotain, joka riippuu sen koosta tai sijainnista.

componentDidUpdate ()

componentDidUpdate(prevProps, prevState, snapshot)

componentDidUpdate() vedotaan heti päivityksen tapahduttua. Tätä menetelmää ei vaadita alkuperäiseen renderöintiin.

käytä tätä mahdollisuutena toimia DOM: llä, kun komponentti on päivitetty. Tämä on myös hyvä paikka tehdä verkostopyyntöjä, kunhan vertaa nykyistä rekvisiittaa aikaisempiin rekvisiittoihin (esim. verkko-pyyntö ei välttämättä ole tarpeen, jos rekvisiitta ei ole muuttunut).

componentDidUpdate(prevProps) { // Typical usage (don't forget to compare props): if (this.props.userID !== prevProps.userID) { this.fetchData(this.props.userID); }}

voit kutsua setState() heti componentDidUpdate(), mutta huomaa, että se on käärittävä yllä olevan esimerkin kaltaiseen tilaan, tai aiheutat äärettömän silmukan. Se aiheuttaisi myös ylimääräisen uudelleen renderöinnin, joka voi vaikuttaa osan suorituskykyyn, vaikka se ei näy käyttäjälle. Jos yrität ”peili”jonkin valtion prop tulevat ylhäältä, harkitse prop suoraan sijaan. Lue lisää siitä, miksi rekvisiitan kopioiminen tilaan aiheuttaa vikoja.

Jos komponenttisi toteuttaa getSnapshotBeforeUpdate() elinkaaren (mikä on harvinaista), sen palauttama arvo siirtyy kolmantena ”snapshot” – parametrina componentDidUpdate(). Muussa tapauksessa tämä parametri on määrittelemätön.

Huomautus

componentDidUpdate()ei vedota, josshouldComponentUpdate()palauttaa epätosi.

componentWillUnmount ()

componentWillUnmount()

componentWillUnmount()vedotaan välittömästi ennen kuin osa irrotetaan ja tuhotaan. Suorita kaikki tarvittavat puhdistukset tässä menetelmässä, kuten ajastimien mitätöinti, verkkopyyntöjen peruuttaminen tai componentDidMount()luotujen tilausten puhdistaminen.

setState() in componentWillUnmount(), koska komponenttia ei koskaan renderöidä uudelleen. Kun komponentti tapaus on irrotettu, se ei koskaan asentaa uudelleen.

harvoin käytetyt Elinkaarimenetelmät

tämän jakson menetelmät vastaavat melko harvinaisia käyttötapauksia. Ne ovat käteviä silloin tällöin, mutta suurin osa komponenteistasi ei luultavasti tarvitse niitä. Näet suurimman osan alla olevista menetelmistä tässä elinkaarikaaviossa, jos klikkaat” Näytä harvinaisemmat elinkaaret ” – valintaruutua sen yläosassa.

shouldComponentUpdate(nextProps, nextState)

käytä shouldComponentUpdate() reagoidaksesi, jos nykyinen tilan tai rekvisiitan muutos ei vaikuta komponentin ulostuloon. Oletuskäyttäytyminen on renderöidä jokaisen tilan muutoksen, ja useimmissa tapauksissa sinun pitäisi luottaa oletuskäyttäytymiseen.

shouldComponentUpdate() vedotaan ennen renderöintiä, kun vastaanotetaan uutta rekvisiittaa tai tilaa. Oletusarvo on true. Tätä menetelmää ei vaadita alkuperäiseen renderöintiin tai kun forceUpdate() käytetään.

tämä menetelmä on olemassa vain suorituskyvyn optimointina. Älä luota sen” estää ” renderöinti, koska tämä voi johtaa vikoja. Harkitse sisäänrakennetun PureComponent sen sijaan, että kirjoittaisit shouldComponentUpdate() käsin. PureComponent suorittaa pinnallisen rekvisiitan ja tilan vertailun, ja vähentää mahdollisuutta ohittaa välttämätön päivitys.

Jos olet varma, että haluat kirjoittaa sen käsin, voit verrata this.props kanssa nextProps ja this.state kanssa nextState ja palata false kertoakseen reagoivansa päivityksen voi ohittaa. Huomaa, että false palauttaminen ei estä lasten osia renderöimästä uudelleen, kun niiden tila muuttuu.

emme suosittele syvien tasa-arvotarkastusten tekemistä tai JSON.stringify() in shouldComponentUpdate(). Se on erittäin tehoton ja vahingoittaa suorituskykyä.

tällä hetkellä, jos shouldComponentUpdate() palauttaa false, niin UNSAFE_componentWillUpdate()render(), ja componentDidUpdate() ei vedota. Jatkossa React saattaa käsitellä shouldComponentUpdate() vihjeenä tiukan direktiivin sijaan, ja palauttaminen false saattaa vielä johtaa komponentin uudelleenrenderöintiin.

staattinen getderivedstateefromprops ()

static getDerivedStateFromProps(props, state)

getDerivedStateFromProps vedotaan juuri ennen renderöintimenetelmän kutsumista sekä ensimmäisellä kiinnityksellä että myöhemmissä päivityksissä. Sen pitäisi palauttaa objekti päivittääkseen tilan, tai null päivittääkseen mitään.

tämä menetelmä on olemassa harvinaisiin käyttötapauksiin, joissa tila riippuu rekvisiitan ajan myötä tapahtuvista muutoksista. Esimerkiksi, se voisi olla kätevä toteuttaa <Transition> komponentti, joka vertaa aikaisempia ja seuraavia lapsia päättää, kumpi heistä animoida sisään ja ulos.

derivoituva tila johtaa monisanaiseen koodiin ja tekee komponenteista vaikeasti ajateltavia.Varmista, että tunnet yksinkertaisemmat vaihtoehdot:

  • Jos tarvitset rekvisiitan muutoksen vuoksi jonkin sivuvaikutuksen (esimerkiksi datan noutamisen tai animoinnin), käytä componentDidUpdate elinkaari sen sijaan.
  • Jos haluat laskea joitakin tietoja uudelleen vasta kun rekvisiitta muuttuu, käytä sen sijaan memoization helperia.
  • Jos haluat ”nollata” jonkin tilan, kun rekvisiitta muuttuu, harkitse joko komponentin muuttamista täysin kontrolloiduksi tai täysin hallitsemattomaksi key sen sijaan.

tällä menetelmällä ei ole pääsyä komponenttiesiintymään. Jos haluat, voit käyttää uudelleen jonkin koodin getDerivedStateFromProps() ja muiden luokkamenetelmien välillä erottamalla osan rekvisiitan ja tilan puhtaista toiminnoista luokkamäärityksen ulkopuolella.

huomaa, että tällä menetelmällä ammutaan jokaista renderöintiä, aiheuttajasta riippumatta. Tämä on toisin kuin UNSAFE_componentWillReceiveProps, joka laukeaa vain vanhemman aiheuttaessa uudelleenrenderöinnin eikä paikallisen setState.

getSnapshotBeforeUpdate ()

getSnapshotBeforeUpdate(prevProps, prevState)

getSnapshotBeforeUpdate() vedotaan juuri ennen kuin viimeksi renderöity ulostulo sidotaan esim. Sen avulla komponentti voi kaapata joitakin tietoja DOM (esim. vieritys) ennen kuin se on mahdollisesti muuttunut. Kaikki tämän elinkaaren palauttamat arvot siirretään parametriksi componentDidUpdate().

tämä käyttötapaus ei ole yleinen, mutta se voi esiintyä UIs: ssa chat-langan tavoin, jonka täytyy käsitellä vierityspaikkaa erityisellä tavalla.

snapshot-arvo (tai null) tulee palauttaa.

esimerkiksi:

class ScrollingList extends React.Component { constructor(props) { super(props); this.listRef = React.createRef(); } getSnapshotBeforeUpdate(prevProps, prevState) { // Are we adding new items to the list? // Capture the scroll position so we can adjust scroll later. if (prevProps.list.length < this.props.list.length) { const list = this.listRef.current; return list.scrollHeight - list.scrollTop; } return null; } componentDidUpdate(prevProps, prevState, snapshot) { // If we have a snapshot value, we've just added new items. // Adjust scroll so these new items don't push the old ones out of view. // (snapshot here is the value returned from getSnapshotBeforeUpdate) if (snapshot !== null) { const list = this.listRef.current; list.scrollTop = list.scrollHeight - snapshot; } } render() { return ( <div ref={this.listRef}>{/* ...contents... */}</div> ); }}

edellä mainituissa esimerkeissä on tärkeää lukea scrollHeight ominaisuus getSnapshotBeforeUpdate, koska ”renderöinnin” vaiheen elinkaarien välillä voi olla viiveitä (kuten render) ja ”commit” – vaiheen elinkaaret (kuten getSnapshotBeforeUpdate ja componentDidUpdate).

Virherajat

Virherajat ovat Reagointikomponentteja, jotka havaitsevat JavaScript-virheet missä tahansa niiden lapsikomponenttipuussa, kirjaavat nämä virheet ja näyttävät varauloskäynnin kaatuneen komponenttipuun sijaan. Virherajat havaitsevat virheitä renderöinnin aikana, elinkaarimenetelmissä ja niiden alapuolella olevan koko puun rakenteissa.

luokkakomponentista tulee virheraja, jos se määrittelee jommankumman (tai molemmat) elinkaarimenetelmistä static getDerivedStateFromError() tai componentDidCatch(). Päivittäminen tila näistä elinkaaren avulla voit kaapata käsittelemätön JavaScript virhe alla puu ja näyttää varauloskäynti UI.

käytä virherajoja vain odottamattomista poikkeuksista toipumiseen; älä yritä käyttää niitä virtauksen säätöön.

tarkemmat tiedot, Katso Virhekäsittely kohdasta React 16.

Huomautus

Virherajat vain nappaavat virheitä niiden alapuolella olevissa komponenteissa puussa. Virheraja ei saa kiinni virhettä itsessään.

staattinen getDerivedStateFromError ()

static getDerivedStateFromError(error)

tähän elinkaareen vedotaan laskijan heitettyä virheen component.It vastaanottaa parametrina heitetyn virheen ja palauttaa arvon päivitystilaan.

class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } static getDerivedStateFromError(error) { // Update state so the next render will show the fallback UI. return { hasError: true }; } render() { if (this.state.hasError) { // You can render any custom fallback UI return <h1>Something went wrong.</h1>; } return this.props.children; }}

Note

getDerivedStateFromError()kutsutaan ”render”-vaiheen aikana, joten sivuvaikutukset eivät ole sallittuja.Näissä käyttötapauksissa käytetään sen sijaan componentDidCatch().

componentDidCatch ()

componentDidCatch(error, info)

tähän elinkaareen vedotaan laskijan heitettyä virheen component.It saa kaksi parametria:

  1. error – heitetyn virheen.
  2. info – objekti, jonka componentStack avain sisältää tiedon siitä, mikä komponentti heitti virheen.

componentDidCatch() kutsutaan” commit ” – vaiheen aikana, joten haittavaikutukset ovat permitted.It pitäisi käyttää asioita, kuten kirjausvirheet:

class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } static getDerivedStateFromError(error) { // Update state so the next render will show the fallback UI. return { hasError: true }; } componentDidCatch(error, info) { // Example "componentStack": // in ComponentThatThrows (created by App) // in ErrorBoundary (created by App) // in div (created by App) // in App logComponentStackToMyService(info.componentStack); } render() { if (this.state.hasError) { // You can render any custom fallback UI return <h1>Something went wrong.</h1>; } return this.props.children; }}

Reactin tuotanto-ja kehitysrakenteet eroavat hieman siinä, miten componentDidCatch() käsittelee virheitä.

kehityksessä virheet pulpahtavat aina window, tämä tarkoittaa, että mikä tahansa window.onerror tai window.addEventListener('error', callback) korjaa virheet, jotka ovat jääneet componentDidCatch().

tuotannossa virheet eivät sen sijaan pulpahda esiin, mikä tarkoittaa, että esi-isien virheiden käsittelijä saa vain virheitä, joita ei ole erikseen pyydetty componentDidCatch().

huomaa

virheen sattuessa voi tehdä varaliittymän componentDidCatch() soittamalla setState, mutta tämä vanhentuu tulevassa julkaisussa.Käytä static getDerivedStateFromError() vararenderöinnin hoitamiseen sen sijaan.

Vanhat Elinkaarimenetelmät

alla olevat elinkaarimenetelmät on merkitty ”vanhoiksi”. Ne toimivat edelleen, mutta emme suosittele niiden käyttöä uudessa koodissa. Voit oppia lisää siirtymisestä pois legacy lifecycle menetelmiä tässä blogikirjoitus.

UNSAFE_componentWillMount ()

UNSAFE_componentWillMount()

Huomautus

Tämä elinkaari oli aiemmin nimetty componentWillMount. Tämä nimi toimii versioon 17 asti. Käytä rename-unsafe-lifecycles codemod päivittääksesi komponentit automaattisesti.

UNSAFE_componentWillMount() vedotaan juuri ennen asennusta. Sitä kutsutaan ennen render(), joten kutsuminen setState() synkronisesti tässä menetelmässä ei aiheuta ylimääräistä renderöintiä. Yleisesti suosittelemme käyttämään constructor() sen sijaan alustustilan.

Vältä sivuvaikutusten tai tilausten käyttöä tässä menetelmässä. Näissä käyttötapauksissa käytetään sen sijaan componentDidMount().

Tämä on ainoa elinkaarimenetelmä, jota kutsutaan palvelimella renderöinniksi.

UNSAFE_componentWillReceiveProps ()

UNSAFE_componentWillReceiveProps(nextProps)

Huomautus

tämä elinkaari oli aiemmin nimetty componentWillReceiveProps. Tämä nimi toimii versioon 17 asti. Käytä rename-unsafe-lifecycles codemod päivittääksesi komponentit automaattisesti.

Huomautus:

tämän elinkaarimenetelmän käyttö johtaa usein virheisiin ja epäjohdonmukaisuuksiin

  • Jos tarvitset jonkin sivuvaikutuksen (esimerkiksi tietojen nouto tai animaatio) vastauksena rekvisiitan muutokseen, käytä componentDidUpdate elinkaari sen sijaan.
  • Jos käytit componentWillReceiveProps joidenkin tietojen uudelleenlaskentaan vain rekvisiitan muuttuessa, käytä sen sijaan muistioapulaista.
  • Jos käytit componentWillReceiveProps jonkin tilan ”nollaamiseen”, kun rekvisiitta muuttuu, harkitse joko komponentin muuttamista täysin kontrolloiduksi tai täysin hallitsemattomaksi key sen sijaan.

muissa käyttötapauksissa kannattaa noudattaa tämän blogikirjoituksen suosituksia johdetusta tilasta.

UNSAFE_componentWillReceiveProps() vedotaan ennen kuin asennettu komponentti saa uutta rekvisiittaa. Jos tila on päivitettävä rekvisiittamuutosten vuoksi (esimerkiksi sen nollaamiseksi), voit verrata this.props ja nextProps ja suorittaa tilan siirtymät käyttämällä this.setState() tässä menetelmässä.

huomaa, että jos jokin vanhempi komponentti aiheuttaa komponenttisi uudelleenrenderöinnin, tätä menetelmää kutsutaan, vaikka rekvisiitta ei olisikaan muuttunut. Muista vertailla nykyisiä ja seuraavia arvoja, jos haluat vain käsitellä muutoksia.

React ei kutsu UNSAFE_componentWillReceiveProps() initial rekvisiitalla asennuksen aikana. Se vain kutsuu tätä menetelmää, jos jotkut osan rekvisiitta voi päivittää. Kutsuminen this.setState() ei yleensä laukaise UNSAFE_componentWillReceiveProps().

UNSAFE_componentWillUpdate ()

UNSAFE_componentWillUpdate(nextProps, nextState)

Huomautus

tämä elinkaari oli aiemmin nimetty componentWillUpdate. Tämä nimi toimii versioon 17 asti. Käytä rename-unsafe-lifecycles codemod päivittääksesi komponentit automaattisesti.

UNSAFE_componentWillUpdate() vedotaan juuri ennen renderöintiä, kun vastaanotetaan uutta rekvisiittaa tai tilaa. Käytä tätä mahdollisuutena suorittaa valmistelu ennen päivitystä. Tätä menetelmää ei vaadita alkuperäiseen renderöintiin.

huomaa, että et voi soittaa this.setState() tähän; eikä sinun pitäisi tehdä mitään muuta (esim.lähettää Redux-toiminto), joka laukaisisi päivityksen Reagointikomponenttiin ennen kuin UNSAFE_componentWillUpdate() palaa.

tyypillisesti tämä menetelmä voidaan korvata componentDidUpdate(). Jos luit DOM: stä tässä menetelmässä (esimerkiksi tallentaaksesi vierityspaikan), voit siirtää kyseisen logiikan getSnapshotBeforeUpdate().

Huomautus

UNSAFE_componentWillUpdate()ei vedota, josshouldComponentUpdate()palauttaa epätosi.

muut sovellusliittymät

toisin kuin yllä olevat elinkaarimenetelmät (jotka reagoivat kutsuihin puolestasi), alla olevat menetelmät ovat menetelmiä, joita voit kutsua komponenteistasi.

niitä on vain kaksi: setState() ja forceUpdate().

setState ()

setState(updater, )

setState() tiedustelee komponentin tilan muutoksia ja kertoo Reactille, että tämä komponentti ja sen lapset täytyy renderoida uudelleen päivitetyn tilan kanssa. Tämä on ensisijainen tapa päivittää käyttöliittymä vastauksena tapahtumankäsittelijöiden ja palvelimen vastauksia.

ajattele setState() pikemminkin pyyntönä kuin välittömänä käskynä päivittää komponentti. Paremman koetun suorituskyvyn saavuttamiseksi React voi viivyttää sitä ja päivittää useita komponentteja yhdellä syötöllä. React ei takaa, että valtion muutoksia sovelletaan välittömästi.

setState() ei aina Päivitä komponenttia välittömästi. Se voi eritellä tai lykätä päivitystä myöhempään. Tämä tekee lukemisesta this.state heti soitettuaan setState() mahdollisen sudenkuopan. Sen sijaan käytetään componentDidUpdate tai setState callback (setState(updater, callback)), joista jompikumpi varmasti ampuu päivityksen jälkeen. Jos haluat asettaa tilan edellisen tilan perusteella, Lue updater argumentti alta.

setState() johtaa aina uudelleen renderöintiin, ellei shouldComponentUpdate() palauta false. Jos käytetään mutabiileja olioita eikä ehdollista renderöintilogiikkaa voida toteuttaa shouldComponentUpdate(), kutsumalla setState() vain silloin, kun uusi tila eroaa edellisestä tilasta, vältetään turhat uudelleenrendit.

ensimmäinen argumentti on updater funktio, jolla on allekirjoitus:

(state, props) => stateChange

state on viittaus osan tilaan muutoksen toteutushetkellä. Sitä ei saa suoraan mutatoida. Sen sijaan muutokset tulisi esittää rakentamalla uusi kohde, joka perustuu state ja props. Oletetaan esimerkiksi, että haluamme kasvattaa tilan arvoa props.step:

this.setState((state, props) => { return {counter: state.counter + props.step};});

sekä state että props päivitysfunktion vastaanottamat ovat taatusti ajan tasalla. Updaterin ulostulo sulautuu matalasti state.

setState() toinen parametri on valinnainen takaisinkutsufunktio, joka suoritetaan, kun setState on suoritettu ja komponentti on renderoitu uudelleen. Yleisesti suosittelemme käyttämään componentDidUpdate() tällaista logiikkaa sen sijaan.

voit valinnaisesti siirtää objektin ensimmäiseksi argumentiksi setState() funktion sijaan:

setState(stateChange)

Tämä suorittaa stateChange uuden tilan, esim.kappalemäärä:

this.setState({quantity: 2})

tämä muoto setState() on myös asynkroninen, ja saman syklin aikana useita kutsuja voidaan lyödä yhteen. Esimerkiksi, jos yrität lisätä kohteen määrää useammin kuin kerran samassa syklissä, se johtaa ekvivalenttiin:

Object.assign( previousState, {quantity: state.quantity + 1}, {quantity: state.quantity + 1}, ...)

myöhemmät puhelut ohittavat saman syklin aikaisempien puhelujen arvot, joten määrää korotetaan vain kerran. Jos Seuraava tila riippuu nykyisestä tilasta, suosittelemme käyttämään updater-funktiolomaketta, sen sijaan:

this.setState((state) => { return {quantity: state.quantity + 1};});

tarkemmat tiedot, katso:

  • tila-ja Elinkaariopas
  • syvällisesti: milloin ja miksisetState() calls batched?
  • syvällisesti: miksei this.state päivitetty heti?

forceUpdate ()

component.forceUpdate(callback)

oletuksena, kun komponenttisi tila tai rekvisiitta muuttuu, komponenttisi renderoituu uudelleen. Jos render() menetelmä riippuu jostain muusta datasta, voit kertoa Reactille komponentin tarvitsevan renderöinnin kutsumalla forceUpdate().

kutsuminen forceUpdate() aiheuttaa render() kutsumisen komponenttiin, ohittaen shouldComponentUpdate(). Tämä käynnistää lapsen osien tavanomaiset elinkaarimenetelmät, mukaan lukien shouldComponentUpdate() – menetelmä jokaiselle lapselle. React päivittää DOM: n edelleen vain, jos merkintä muuttuu.

normaalisti forceUpdate() ja luetaan vain this.props ja this.state in render().

Luokkaominaisuudet

defaultProps

defaultProps voidaan määritellä ominaisuudeksi itse komponenttiluokalle, jolloin asetetaan luokan oletusasetukset. This is used for undefined props, but not for null props. For example:

class CustomButton extends React.Component { // ...}CustomButton.defaultProps = { color: 'blue'};

If props.color is not provided, it will be set by default to 'blue':

 render() { return <CustomButton /> ; // props.color will be set to blue }

If props.color is set to null, it will remain null:

 render() { return <CustomButton color={null} /> ; // props.color will remain null }

displayName

The displayName string is used in debugging messages. Yleensä, sinun ei tarvitse asettaa sitä nimenomaisesti, koska se on päätelty nimen funktion tai luokan, joka määrittelee komponentin. Haluat ehkä asettaa sen nimenomaisesti, jos haluat näyttää eri nimen virheenkorjausta varten tai kun luot korkeamman kertaluvun komponentin, katso näytön nimen käärimistä, jotta virheenkorjaus on helppoa.

instanssin ominaisuudet

rekvisiitta

this.props sisältää rekvisiitan, jonka tämän komponentin soittaja on määritellyt. Katso komponentit ja rekvisiitta esittelystä rekvisiittaan.

erityisesti this.props.children on erityinen rekvisiitta, jonka lapsitunnisteet tyypillisesti määrittelevät JSX-lausekkeessa eikä itse merkissä.

tila

tila sisältää tätä komponenttia koskevia tietoja, jotka voivat muuttua ajan myötä. Tila on käyttäjän määrittelemä, ja sen pitäisi olla tavallinen JavaScript-objekti.

Jos jotain arvoa ei käytetä renderöintiin tai tiedonkulkuun (esimerkiksi ajastintunnusta), sitä ei tarvitse laittaa tilaan. Tällaiset arvot voidaan määritellä komponenttiesiintymän kentiksi.

Katso lisätietoja tilasta ja elinkaaresta.

ei koskaan mutatoidu this.state suoraan, koska setState() jälkeenpäin voi korvata tekemäsi mutaation. Käsittele this.state ikään kuin se olisi muuttumaton.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *