deze pagina bevat een gedetailleerde API referentie voor de React component klasse definitie. Het veronderstelt dat u vertrouwd bent met fundamentele react-concepten, zoals componenten en rekwisieten, evenals staat en levenscyclus. Zo niet, lees ze dan eerst.
overzicht
React laat u componenten definiëren als klassen of functies. Componenten gedefinieerd als klassen bieden momenteel meer functies die in detail worden beschreven op deze pagina. Om een react componentklasse te definiëren, moet u React.Component
uitbreiden:
class Welcome extends React.Component { render() { return <h1>Hello, {this.props.name}</h1>; }}
de enige methode die u moet definiëren in een React.Component
subklasse wordt render()
genoemd. Alle andere op deze pagina beschreven methoden zijn optioneel.
we raden ten zeerste aan om geen eigen basiscomponentklassen te maken. In React componenten wordt code hergebruik voornamelijk bereikt door compositie in plaats van overerving.
opmerking:
React dwingt u niet om de syntaxis van de ES6-klasse te gebruiken. Als u het liever vermijdt, kunt u in plaats daarvan de
create-react-class
module of een soortgelijke aangepaste abstractie gebruiken. Bekijk het gebruik van React without ES6 voor meer informatie.
de Component Lifecycle
elk onderdeel heeft verschillende” lifecycle methods ” die u op bepaalde momenten in het proces kunt overschrijven om code uit te voeren. U kunt dit levenscyclusdiagram gebruiken als een spiekbriefje. In de onderstaande lijst zijn veelgebruikte levenscyclusmethoden vetgedrukt. De rest bestaat voor relatief zeldzame gebruiksgevallen.
Aankoppelen
Deze methoden worden genoemd in de volgende volgorde wanneer een exemplaar van een component wordt gemaakt en ingevoegd in de DOM:
constructor()
static getDerivedStateFromProps()
render()
componentDidMount()
Nb:
Deze methoden zijn als verouderd beschouwd en je moet voorkomen dat ze in de nieuwe code in:
UNSAFE_componentWillMount()
Bijwerken
Een update kan worden veroorzaakt door veranderingen rekwisieten of staat. Deze methoden worden genoemd in de volgende volgorde wanneer een component wordt opnieuw weergegeven:
static getDerivedStateFromProps()
shouldComponentUpdate()
render()
getSnapshotBeforeUpdate()
componentDidUpdate()
Opmerking:
Deze methoden zijn als verouderd beschouwd en je moet voorkomen dat ze in de nieuwe code:
UNSAFE_componentWillUpdate()
UNSAFE_componentWillReceiveProps()
Ontkoppelen
Deze methode wordt aangeroepen wanneer een component wordt verwijderd van de DOM:
componentWillUnmount()
Fout Afhandeling
Deze methoden worden aangeroepen wanneer er een fout is opgetreden tijdens het renderen, in een lifecycle-methode, of in de constructor van een kind component.
static getDerivedStateFromError()
componentDidCatch()
andere API ’s
elk onderdeel biedt ook enkele andere API’ s:
setState()
forceUpdate()
Klasse-Eigenschappen
defaultProps
displayName
– Instance Eigenschappen
props
state
Referentie
Algemeen Gebruikt Levenscyclus Methodes
De methoden in dit hoofdstuk betreffen de overgrote meerderheid van de use cases die u zult tegenkomen creëren Reageren onderdelen. Voor een visuele referentie, kijk op dit levenscyclusdiagram.
render ()
render()
de render()
methode is de enige vereiste methode in een klasse-component.
wanneer deze wordt aangeroepen, moet this.props
en this.state
worden onderzocht en een van de volgende typen worden geretourneerd:
- React elements. Meestal gemaakt via JSX. Bijvoorbeeld,
<div />
en<MyComponent />
zijn React-elementen die React instrueren om respectievelijk een DOM-node of een ander door de gebruiker gedefinieerd onderdeel te maken. - Arrays en fragmenten. Laat u meerdere elementen van render. Zie de documentatie over fragmenten voor meer details.
- Portals. Laat je kinderen maken in een andere DOM subtree. Zie de documentatie over portals voor meer informatie.
- tekenreeks en getallen. Deze worden weergegeven als tekstknooppunten in de DOM.
- Booleans or
null
. Render niets. (Bestaat meestal omreturn test && <Child />
patroon te ondersteunen, waarbijtest
Booleaans is.)
de functie render()
moet zuiver zijn, wat betekent dat de component status niet wordt gewijzigd, het geeft hetzelfde resultaat elke keer dat het wordt aangeroepen, en het heeft geen directe interactie met de browser.
Als u met de browser wilt communiceren, voer dan uw werk uit in componentDidMount()
of in de andere levenscyclusmethoden. Het behouden van render()
pure maakt het makkelijker om over componenten na te denken.
Note
render()
zal niet worden aangeroepen alsshouldComponentUpdate()
geeft false terug.
constructor()
constructor(props)
Als u de status niet initialiseert en geen bindmethoden gebruikt, hoeft u geen constructor te implementeren voor uw react-component.
de constructor voor een React component wordt aangeroepen voordat het aangekoppeld wordt. Bij het implementeren van de constructor voor een React.Component
subklasse, moet u super(props)
aanroepen voor enig ander statement. Anders zal this.props
niet gedefinieerd zijn in de constructor, wat kan leiden tot bugs.
gewoonlijk worden constructors in React alleen gebruikt voor twee doeleinden:
- initialiseren van lokale status door een object toe te wijzen aan
this.state
. - bind event handler methoden aan een instantie.
u mag setState()
niet aanroepen in de constructor()
. In plaats daarvan, als uw component lokale status moet gebruiken, wijs de initiële status toe aan this.state
direct in de constructor:
constructor(props) { super(props); // Don't call this.setState() here! this.state = { counter: 0 }; this.handleClick = this.handleClick.bind(this);}
Constructor is de enige plaats waar u this.state
direct moet toewijzen. In alle andere methoden moet u this.setState()
gebruiken.
vermijd het introduceren van bijwerkingen of abonnementen in de constructor. Voor die use cases, gebruik componentDidMount()
in plaats daarvan.
Note
vermijd het kopiëren van rekwisieten naar status! Dit is een veel voorkomende fout:
constructor(props) { super(props); // Don't do this! this.state = { color: props.color };}
het probleem is dat het zowel onnodig is (u kunt
this.props.color
direct gebruiken in plaats daarvan), en fouten maakt (updates van decolor
prop zullen niet worden weergegeven in de status).gebruik dit patroon alleen als u opzettelijk prop-updates wilt negeren. In dat geval is het zinvol om de prop te hernoemen naar
initialColor
ofdefaultColor
. U kunt een component vervolgens dwingen zijn interne toestand te “resetten”door zijnkey
indien nodig te wijzigen.Lees onze blogpost over het vermijden van afgeleide status om te leren over wat te doen als je denkt dat je een bepaalde status nodig hebt om afhankelijk te zijn van de rekwisieten.
componentDidMount()
componentDidMount()
componentDidMount()
wordt onmiddellijk aangeroepen nadat een component is aangekoppeld (ingevoegd in de boom). Initialisatie die DOM-knooppunten vereist moet hier gaan. Als u gegevens van een extern eindpunt moet laden, is dit een goede plek om de netwerkaanvraag te instantiëren.
Deze methode is een goede plek om abonnementen in te stellen. Als u dat doet, vergeet dan niet om u uit te schrijven in componentWillUnmount()
.
u kunt setState()
onmiddellijk aanroepen in componentDidMount()
. Het zal leiden tot een extra rendering, maar het zal gebeuren voordat de browser updates van het scherm. Dit garandeert dat, hoewel de render()
in dit geval tweemaal zal worden aangeroepen, de gebruiker de tussenliggende status niet zal zien. Gebruik dit patroon met de nodige voorzichtigheid omdat het vaak problemen met de prestaties veroorzaakt. In de meeste gevallen zou u de initiële status in de constructor()
moeten kunnen toewijzen. Het kan echter nodig zijn voor gevallen zoals modals en tooltips wanneer u een DOM-knooppunt moet meten voordat u iets rendert dat afhankelijk is van de grootte of positie.
componentDidUpdate ()
componentDidUpdate(prevProps, prevState, snapshot)
componentDidUpdate()
wordt onmiddellijk na het bijwerken aangeroepen. Deze methode wordt niet aangeroepen voor de initiële render.
Gebruik dit als een mogelijkheid om op het DOM te werken wanneer het onderdeel is bijgewerkt. Dit is ook een goede plek om netwerkverzoeken te doen, zolang je de huidige props vergelijkt met eerdere props (bijv. een netwerk verzoek kan niet nodig zijn als de rekwisieten niet zijn veranderd).
componentDidUpdate(prevProps) { // Typical usage (don't forget to compare props): if (this.props.userID !== prevProps.userID) { this.fetchData(this.props.userID); }}
u kunt setState()
direct aanroepen incomponentDidUpdate()
maar merk op dat het moet worden verpakt in een voorwaarde zoals in het voorbeeld hierboven, anders veroorzaakt u een oneindige lus. Het zou ook een extra re-rendering veroorzaken die, hoewel niet zichtbaar voor de gebruiker, de prestaties van de component kan beïnvloeden. Als je probeert een bepaalde staat te “spiegelen” aan een prop die van bovenaf komt, overweeg dan om de prop direct in plaats daarvan te gebruiken. Lees meer over waarom het kopiëren van rekwisieten naar de staat bugs veroorzaakt.
als uw component de getSnapshotBeforeUpdate()
lifecycle implementeert (wat zeldzaam is), zal de waarde die het retourneert als een derde “snapshot” parameter worden doorgegeven aan componentDidUpdate()
. Anders is deze parameter niet gedefinieerd.
Note
componentDidUpdate()
zal niet worden aangeroepen alsshouldComponentUpdate()
geeft false terug.
componentWillUnmount()
componentWillUnmount()
componentWillUnmount()
wordt aangeroepen onmiddellijk voordat een component wordt afgekoppeld en vernietigd. Voer elke noodzakelijke opschoning uit in deze methode, zoals het ongeldig maken van timers, het annuleren van netwerkaanvragen, of het opschonen van alle abonnementen die zijn gemaakt in componentDidMount()
.
u mag setState()
niet aanroepen in componentWillUnmount()
omdat de component nooit opnieuw zal worden gerenderd. Zodra een component instantie is ontkoppeld, zal het nooit meer worden gemount.
zelden gebruikte Levenscyclusmethoden
de methoden in deze sectie komen overeen met soms voorkomende gebruiksgevallen. Ze zijn handig af en toe, maar de meeste van uw componenten waarschijnlijk niet nodig een van hen. U kunt de meeste van de onderstaande methoden op dit levenscyclusdiagram zien als u het selectievakje “minder gangbare levenscycli weergeven” bovenaan klikt.
shouldComponentUpdate ()
shouldComponentUpdate(nextProps, nextState)
gebruik shouldComponentUpdate()
om React te laten weten of de uitvoer van een component niet wordt beïnvloed door de huidige verandering in status of props. Het standaard gedrag is om te Re-renderen op elke statuswijziging, en in de overgrote meerderheid van de gevallen moet u vertrouwen op het standaard gedrag.
shouldComponentUpdate()
wordt aangeroepen alvorens te renderen wanneer nieuwe props of status worden ontvangen. Standaard true
. Deze methode wordt niet aangeroepen voor de initiële render of wanneer forceUpdate()
wordt gebruikt.
deze methode bestaat alleen als prestatieoptimalisatie. Vertrouw er niet op om een rendering te” voorkomen”, omdat dit kan leiden tot bugs. Overweeg om de ingebouwde PureComponent
te gebruiken in plaats van shouldComponentUpdate()
handmatig te schrijven. PureComponent
voert een oppervlakkige vergelijking uit van props en status, en vermindert de kans dat u een noodzakelijke update overslaat.
Als u er zeker van bent dat u het met de hand wilt schrijven, kunt u this.props
vergelijken met nextProps
en this.state
met nextState
en false
om react te vertellen dat de update kan worden overgeslagen. Merk op dat het retourneren van false
niet verhindert dat dochtercomponenten opnieuw worden weergegeven wanneer hun status verandert.
we raden niet aan om diepe gelijkheidscontroles uit te voeren of JSON.stringify()
te gebruiken in shouldComponentUpdate()
. Het is zeer inefficiënt en zal de prestaties schaden.
als shouldComponentUpdate()
false
geeft, dan zal UNSAFE_componentWillUpdate()
render()
, en componentDidUpdate()
niet worden aangeroepen. In de toekomst kan React shouldComponentUpdate()
behandelen als een hint in plaats van een strikte richtlijn, en het retourneren van false
kan nog steeds resulteren in een herweergave van de component.
static getDerivedStateFromProps ()
static getDerivedStateFromProps(props, state)
getDerivedStateFromProps
wordt aangeroepen vlak voordat de rendermethode wordt aangeroepen, zowel op de initiële mount als bij volgende updates. Het moet een object teruggeven om de status bij te werken, of null
om niets bij te werken.
deze methode bestaat voor zeldzame gevallen waarin de status afhankelijk is van veranderingen in props in de tijd. Bijvoorbeeld, het kan handig zijn voor het implementeren van een<Transition>
component die zijn vorige en volgende kinderen vergelijkt om te beslissen welke van hen te animeren in en uit.
het afleiden van de status leidt tot uitgebreide code en maakt uw componenten moeilijk om over na te denken.Zorg ervoor dat u vertrouwd bent met eenvoudiger alternatieven:
- Als u een bijwerking wilt uitvoeren (bijvoorbeeld gegevens ophalen of een animatie) als reactie op een verandering in rekwisieten, gebruik dan
componentDidUpdate
lifecycle. - als u enkele gegevens alleen opnieuw wilt berekenen wanneer een prop verandert, gebruik dan een memoization helper.
- Als u een toestand wilt” resetten”wanneer een prop verandert, overweeg dan om een component volledig gecontroleerd of volledig ongecontroleerd te maken met een
key
in plaats daarvan.
Deze methode heeft geen toegang tot de component instantie. Als u wilt, kunt u enige code hergebruiken tussen getDerivedStateFromProps()
en de andere klasse methoden door pure functies van de component props te extraheren en staat buiten de klasse definitie.
merk op dat deze methode op elke render wordt afgevuurd, ongeacht de oorzaak. Dit in tegenstelling tot UNSAFE_componentWillReceiveProps
, die alleen start als de ouder een re-render veroorzaakt en niet als gevolg van een lokale setState
.
getSnapshotBeforeUpdate ()
getSnapshotBeforeUpdate(prevProps, prevState)
getSnapshotBeforeUpdate()
wordt aangeroepen vlak voordat de meest recent gerenderde uitvoer wordt vastgelegd aan bijvoorbeeld de DOM. Het stelt uw component in staat om wat informatie van de DOM (bijvoorbeeld scroll positie) vast te leggen voordat het mogelijk wordt gewijzigd. Elke waarde die door deze levenscyclus wordt geretourneerd, zal als parameter worden doorgegeven aan componentDidUpdate()
.
Deze use case is niet gebruikelijk, maar het kan voorkomen in UIs zoals een chat thread die Scrollpositie op een speciale manier moet afhandelen.
een snapshotwaarde (of null
) moet worden geretourneerd.
bijvoorbeeld:
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> ); }}
In de bovenstaande voorbeelden, is het belangrijk om te lezen van de scrollHeight
goederen in getSnapshotBeforeUpdate
want er kunnen vertragingen tussen de “render” fase levenscyclus (zoals render
) en “commit” – fase levenscyclus (zoals getSnapshotBeforeUpdate
en componentDidUpdate
).
Foutgrenzen
Foutgrenzen zijn react-componenten die JavaScript-fouten overal in hun onderliggende component-boom vangen, die fouten registreren en een fallback-UI weergeven in plaats van de component-boom die gecrasht is. Foutgrenzen vangen fouten op tijdens het renderen, in levenscyclusmethoden en in constructeurs van de hele boom eronder.
een klasse-component wordt een foutgrens als het een of beide levenscyclusmethoden definieert static getDerivedStateFromError()
of componentDidCatch()
. Bijwerken staat van deze lifecycles kunt u een niet-afgehandelde JavaScript fout in de onderstaande boom vast te leggen en weer te geven een fallback UI.
gebruik alleen Foutgrenzen voor het herstellen van onverwachte uitzonderingen; probeer ze niet te gebruiken voor controlestroom.
voor meer details, zie foutafhandeling in React 16.
opmerking
Foutgrenzen vangen alleen fouten op in de componenten eronder in de boom. Een foutgrens kan geen fout in zichzelf opvangen.
static getDerivedStateFromError ()
static getDerivedStateFromError(error)
deze levenscyclus wordt aangeroepen nadat een fout is geworpen door een afstammeling component.It ontvangt de fout die werd gegooid als een parameter en zou een waarde moeten retourneren om de status bij te werken.
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()
wordt aangeroepen tijdens de “render”-fase, dus bijwerkingen zijn niet toegestaan.Voor die use cases, gebruikcomponentDidCatch()
in plaats daarvan.
componentDidCatch ()
componentDidCatch(error, info)
deze levenscyclus wordt aangeroepen nadat een fout is gemaakt door een afstammeling component.It ontvangt twee parameters:
-
error
– de fout die werd gegooid. -
info
– Een object met eencomponentStack
sleutel die informatie bevat over welk onderdeel de fout heeft gemaakt.
componentDidCatch()
wordt aangeroepen tijdens de” commit ” fase, dus bijwerkingen zijn permitted.It moet worden gebruikt voor dingen zoals logging fouten:
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; }}
productie en ontwikkeling van React verschillen enigszins in de manier waarop componentDidCatch()
fouten verwerkt.
bij ontwikkeling zullen de fouten bubbelen tot window
, dit betekent dat elke window.onerror
of window.addEventListener('error', callback)
de fouten onderschept die zijn opgevangen door componentDidCatch()
.
tijdens de productie zullen de fouten niet opvallen, wat betekent dat elke voorouderfout-handler alleen fouten zal ontvangen die niet expliciet zijn opgenomen door componentDidCatch()
.
Note
In het geval van een fout kunt u een fallback UI renderen met
componentDidCatch()
doorsetState
aan te roepen, maar dit zal in een toekomstige release worden afgekeurd.Gebruikstatic getDerivedStateFromError()
om fallback rendering te verwerken.
Legacy Lifecycle Methods
de lifecycle methods hieronder zijn gemarkeerd als”legacy”. Ze werken nog steeds, maar we raden niet aan ze te gebruiken in de nieuwe code. U kunt meer informatie over migreren weg van legacy lifecycle methoden in deze blog post.
UNSAFE_componentWillMount ()
UNSAFE_componentWillMount()
opmerking
deze levenscyclus werd eerder
componentWillMount
genoemd. Die naam zal blijven werken tot versie 17. Gebruik derename-unsafe-lifecycles
codemod om automatisch uw componenten bij te werken.
UNSAFE_componentWillMount()
wordt aangeroepen net voordat het aankoppelen plaatsvindt. Het wordt voor render()
aangeroepen, daarom zal het synchroon aanroepen van setState()
in deze methode geen extra rendering veroorzaken. Over het algemeen raden we aan om de constructor()
te gebruiken voor het initialiseren van de status.
vermijd het introduceren van bijwerkingen of abonnementen in deze methode. Voor die use cases, gebruik componentDidMount()
in plaats daarvan.
Dit is de enige levenscyclusmethode die wordt aangeroepen bij het renderen van de server.
UNSAFE_componentWillReceiveProps ()
UNSAFE_componentWillReceiveProps(nextProps)
opmerking
deze levenscyclus werd eerder
componentWillReceiveProps
genoemd. Die naam zal blijven werken tot versie 17. Gebruik derename-unsafe-lifecycles
codemod om automatisch uw componenten bij te werken.
opmerking:
het gebruik van deze levenscyclusmethode leidt vaak tot bugs en inconsistenties
- Als u een bijwerking (bijvoorbeeld gegevens ophalen of een animatie) wilt uitvoeren als reactie op een verandering in props, gebruik dan
componentDidUpdate
lifecycle in plaats daarvan.- Als u
componentWillReceiveProps
gebruikt voor het opnieuw berekenen van sommige gegevens alleen wanneer een prop verandert, gebruik dan een memoization helper.- Als u
componentWillReceiveProps
gebruikt om een toestand te “resetten” wanneer een prop verandert, overweeg dan in plaats daarvan een component volledig gecontroleerd of volledig ongecontroleerd te maken met eenkey
.voor andere use cases, volg de aanbevelingen in deze blogpost over afgeleide staat.
UNSAFE_componentWillReceiveProps()
wordt aangeroepen voordat een aangekoppeld onderdeel nieuwe props ontvangt. Als u de status moet bijwerken als reactie op prop-wijzigingen (bijvoorbeeld om het te resetten), kunt u this.props
en nextProps
vergelijken en statusovergangen uitvoeren met this.setState()
in deze methode.
merk op dat als een ouder component ervoor zorgt dat uw component opnieuw wordt weergegeven, deze methode zal worden aangeroepen, zelfs als de rekwisieten niet zijn veranderd. Zorg ervoor dat u de huidige en volgende waarden vergelijkt als u alleen wijzigingen wilt verwerken.
React roept UNSAFE_componentWillReceiveProps()
niet aan met initiële props tijdens het aankoppelen. Het roept deze methode alleen aan als sommige rekwisieten van component kunnen worden bijgewerkt. Het aanroepen van this.setState()
geeft over het algemeen geen aanleiding tot UNSAFE_componentWillReceiveProps()
.
UNSAFE_componentWillUpdate ()
UNSAFE_componentWillUpdate(nextProps, nextState)
Note
deze levenscyclus werd eerder
componentWillUpdate
genoemd. Die naam zal blijven werken tot versie 17. Gebruik derename-unsafe-lifecycles
codemod om automatisch uw componenten bij te werken.
UNSAFE_componentWillUpdate()
wordt aangeroepen vlak voor het renderen wanneer nieuwe props of status worden ontvangen. Gebruik dit als een kans om de voorbereiding uit te voeren voordat een update plaatsvindt. Deze methode wordt niet aangeroepen voor de initiële render.
merk op dat u this.setState()
hier niet kunt aanroepen; noch moet u iets anders doen (bijvoorbeeld een Redux-actie verzenden) dat een update naar een React-component zou veroorzaken voordat UNSAFE_componentWillUpdate()
retourneert.
gewoonlijk kan deze methode worden vervangen door componentDidUpdate()
. Als u in deze methode van de DOM leest (bijvoorbeeld om een Scrollpositie op te slaan), kunt u die logica verplaatsen naar getSnapshotBeforeUpdate()
.
Note
UNSAFE_componentWillUpdate()
zal niet worden aangeroepen alsshouldComponentUpdate()
geeft false terug.
andere API ‘ s
In tegenstelling tot de levenscyclusmethoden hierboven (die oproepen voor u reageren), zijn de onderstaande methoden de methoden die u vanuit uw componenten kunt aanroepen.
er zijn er slechts twee: setState()
en forceUpdate()
.
setState ()
setState(updater, )
setState()
vraagt wijzigingen in de component status en vertelt React dat dit onderdeel en zijn kinderen opnieuw moeten worden gerenderd met de bijgewerkte status. Dit is de primaire methode die u gebruikt om de gebruikersinterface bij te werken in reactie op event handlers en serverreacties.
denk aan setState()
als een verzoek in plaats van een onmiddellijk commando om de component bij te werken. Voor betere waargenomen prestaties, React kan vertragen, en vervolgens een aantal componenten bij te werken in een enkele pas. React garandeert niet dat de statuswijzigingen onmiddellijk worden toegepast.
setState()
werkt de component niet altijd onmiddellijk bij. Het kan batch of uitstellen van de update tot later. Dit maakt het lezen van this.state
direct na het aanroepen van setState()
een potentiële valkuil. Gebruik in plaats daarvan componentDidUpdate
of een setState
callback (setState(updater, callback)
), waarvan beide gegarandeerd zullen branden nadat de update is toegepast. Als u de status moet instellen op basis van de vorige status, lees dan hieronder het argument updater
.
setState()
zal altijd leiden tot een re-render tenzij shouldComponentUpdate()
geeft false
. Als veranderbare objecten worden gebruikt en conditionele renderinglogica niet kan worden geïmplementeerd in shouldComponentUpdate()
, zal het aanroepen van setState()
alleen als de nieuwe status verschilt van de vorige status onnodige her-renders voorkomen.
het eerste argument is eenupdater
functie met de handtekening:
(state, props) => stateChange
state
is een verwijzing naar de component status op het moment dat de wijziging wordt toegepast. Het mag niet direct gemuteerd worden. In plaats daarvan moeten veranderingen worden weergegeven door een nieuw object te bouwen gebaseerd op de invoer van state
en props
. Bijvoorbeeld, stel dat we een waarde in Status willen verhogen met props.step
:
this.setState((state, props) => { return {counter: state.counter + props.step};});
beide state
en props
ontvangen door de updater-functie zijn gegarandeerd up-to-date. De uitvoer van de updater wordt oppervlakkig samengevoegd met state
.
de tweede parameter voor setState()
is een optionele callback functie die zal worden uitgevoerd zodra setState
is voltooid en de component opnieuw wordt gerenderd. Over het algemeen raden we aan om componentDidUpdate()
voor een dergelijke logica te gebruiken.
U kunt eventueel doorgeven van een object als het eerste argument naar setState()
in plaats van een functie:
setState(stateChange)
Dit voert een ondiepe samenvoegen van stateChange
in de nieuwe staat, bijvoorbeeld voor het aanpassen van een winkelwagen hoeveelheid:
this.setState({quantity: 2})
Deze vorm van setState()
is ook asynchrone en meerdere gesprekken tijdens dezelfde cyclus kunnen worden gegroepeerd bij elkaar. Bijvoorbeeld, als u probeert om een item hoeveelheid meer dan eens te verhogen in dezelfde cyclus, dat zal resulteren in het equivalent van:
Object.assign( previousState, {quantity: state.quantity + 1}, {quantity: state.quantity + 1}, ...)
volgende oproepen overschrijven de waarden van eerdere oproepen in dezelfde cyclus, zodat de hoeveelheid slechts één keer wordt verhoogd. Als de volgende status afhankelijk is van de huidige status, raden we aan om in plaats daarvan het updater functieformulier te gebruiken:
this.setState((state) => { return {quantity: state.quantity + 1};});
voor meer details, zie:
- Status en Lifecycle guide
- in depth: wanneer en waarom worden
setState()
aangeroepen? - In de diepte: Waarom is
this.state
niet onmiddellijk bijgewerkt?
forceUpdate ()
component.forceUpdate(callback)
standaard wordt uw component opnieuw weergegeven wanneer de status of de props van uw component veranderen. Als uwrender()
methode afhankelijk is van enkele andere gegevens, kunt u React vertellen dat het onderdeel opnieuw moet worden gerenderd doorforceUpdate()
aan te roepen.
aanroep forceUpdate()
zal ervoor zorgen dat render()
wordt aangeroepen op de component, waarbij shouldComponentUpdate()
wordt overgeslagen. Dit zal de normale levenscyclusmethoden voor dochtercomponenten activeren, inclusief deshouldComponentUpdate()
methode van elk kind. React zal nog steeds alleen de DOM updaten als de opmaak verandert.
normaal gesproken moet u proberen alle gebruik van forceUpdate()
te vermijden en alleen lezen van this.props
en this.state
in render()
.
Klasse eigenschappen
defaultProps
defaultProps
kan worden gedefinieerd als een eigenschap op de component klasse zelf, om de standaard props voor de klasse. 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. Meestal hoeft u het niet expliciet in te stellen omdat het wordt afgeleid uit de naam van de functie of klasse die de component definieert. U kunt deze expliciet instellen als u een andere naam wilt weergeven voor debugdoeleinden of als u een component met een hogere volgorde maakt, zie de weergavenaam omwikkelen voor eenvoudige Debugging voor details.
Instance Properties
props
this.props
bevat de props die zijn gedefinieerd door de aanroeper van dit onderdeel. Zie componenten en Props voor een inleiding tot props.
in het bijzonder, this.props.children
is een speciale prop, meestal gedefinieerd door de onderliggende tags in de JSX expressie in plaats van in de tag zelf.
status
de status bevat specifieke gegevens voor dit onderdeel die in de loop van de tijd kunnen veranderen. De status is door de gebruiker gedefinieerd en het moet een eenvoudig JavaScript-object zijn.
als een waarde niet wordt gebruikt voor rendering of gegevensstroom (bijvoorbeeld een timer-ID), hoeft u deze niet in de status te zetten. Dergelijke waarden kunnen worden gedefinieerd als velden op de component instantie.
zie Status en levenscyclus voor meer informatie over de status.
muteer nooit this.state
direct, omdat het aanroepen van setState()
achteraf de door u gemaakte mutatie kan vervangen. Behandel this.state
alsof het onveranderlijk is.