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()
getSnapshotBeforeUpdate()
componentDidUpdate()
shouldComponentUpdate()
render()
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
-
displayName
defaultProps
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ä tukemaanreturn test && <Child />
mallia, jossatest
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
taidefaultColor
. Tämän jälkeen voidaan pakottaa komponentti ”nollaamaan” sen sisäinen tila muuttamalla senkey
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)
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 sijaancomponentDidCatch()
.
componentDidCatch ()
componentDidCatch(error, info)
tähän elinkaareen vedotaan laskijan heitettyä virheen component.It saa kaksi parametria:
-
error
– heitetyn virheen. -
info
– objekti, jonkacomponentStack
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()
soittamallasetState
, 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 hallitsemattomaksikey
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 miksi
setState()
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.