Diese Diskussion hat eine Weile gedauert und die Antwort von @Alexander T. lieferte einen guten Leitfaden für neuere React wie mich. Und ich werde einige zusätzliche Kenntnisse darüber teilen, wie dieselbe API mehrmals aufgerufen wird, um die Komponente zu aktualisieren. Ich denke, es ist wahrscheinlich ein häufiges Problem, mit dem Neulinge am Anfang konfrontiert sein könnten.
componentWillReceiveProps(nextProps)
, aus offiziellen Unterlagen :
Wenn Sie den Status als Reaktion auf Requisitenänderungen aktualisieren müssen (z. B. um ihn zurückzusetzen), können Sie this.props und nextProps vergleichen und Statusübergänge mit this.setState () in dieser Methode durchführen.
Wir könnten daraus schließen, dass wir hier Requisiten aus der übergeordneten Komponente verarbeiten, API-Aufrufe durchführen und den Status aktualisieren.
Basis ist das Beispiel von @Alexander T.:
export default class UserList extends React.Component {
constructor(props) {
super(props);
this.state = {person: []};
}
componentDidMount() {
//For our first load.
this.UserList(this.props.group); //maybe something like "groupOne"
}
componentWillReceiveProps(nextProps) {
// Assuming parameter comes from url.
// let group = window.location.toString().split("/")[*indexParameterLocated*];
// this.UserList(group);
// Assuming parameter comes from props that from parent component.
let group = nextProps.group; // Maybe something like "groupTwo"
this.UserList(group);
}
UserList(group) {
$.getJSON('https://randomuser.me/api/' + group)
.then(({ results }) => this.setState({ person: results }));
}
render() {
return (...)
}
}
Aktualisieren
componentWillReceiveProps()
wäre veraltet.
Hier sind nur einige Methoden (alle in Doc ) im Lebenszyklus, die meiner Meinung nach im Allgemeinen mit der Bereitstellung von API zusammenhängen:
Unter Bezugnahme auf das obige Diagramm:
Stellen Sie die API in bereit componentDidMount()
Das richtige Szenario für einen API-Aufruf besteht darin, dass der Inhalt (aus der Antwort der API) dieser Komponente statisch ist und componentDidMount()
nur einmal ausgelöst wird, während die Komponente bereitgestellt wird. Selbst neue Requisiten werden von der übergeordneten Komponente übergeben oder müssen Aktionen ausführen re-rendering
.
Die Komponente überprüft den Unterschied, um ihn erneut zu rendern, aber nicht erneut bereitzustellen .
Zitat aus doc :
Wenn Sie Daten von einem Remote-Endpunkt laden müssen, ist dies ein guter Ort, um die Netzwerkanforderung zu instanziieren.
- Stellen Sie die API in bereit
static getDerivedStateFromProps(nextProps, prevState)
Wir sollten feststellen , dass es zwei Arten von Komponenten Aktualisierung , setState()
in der aktuellen Komponente würde nicht diese Methode , um Trigger führen, aber erneutes Rendern oder neue Requisiten aus Elternkomponente tun. Wir konnten herausfinden, dass diese Methode auch während der Montage ausgelöst wird.
Dies ist ein geeigneter Ort zum Bereitstellen der API, wenn die aktuelle Komponente wie eine Vorlage verwendet werden soll und die neuen Parameter für die API Requisiten sind, die von der übergeordneten Komponente stammen .
Wir erhalten eine andere Antwort von der API und geben hier eine neue zurück state
, um den Inhalt dieser Komponente zu ändern.
Beispiel:
In der übergeordneten Komponente befindet sich eine Dropdown-Liste für verschiedene Fahrzeuge. Diese Komponente muss die Details der ausgewählten Komponente anzeigen.
- Stellen Sie die API in bereit
componentDidUpdate(prevProps, prevState)
Im Unterschied dazu static getDerivedStateFromProps()
wird diese Methode unmittelbar nach jedem Rendern mit Ausnahme des anfänglichen Renderns aufgerufen. Wir könnten API-Aufrufe haben und Unterschiede in einer Komponente rendern.
Erweitern Sie das vorherige Beispiel:
Die Komponente zum Anzeigen der Fahrzeugdetails kann eine Liste von Serien dieses Fahrzeugs enthalten. Wenn wir die 2013er Produktion überprüfen möchten, können wir auf das Listenelement klicken oder es auswählen oder ..., um eine erste setState()
zu erstellen, die dies widerspiegelt Verhalten (z. B. Hervorheben des Listenelements) in dieser Komponente, und im Folgenden componentDidUpdate()
senden wir unsere Anfrage mit neuen Parametern (Status). Nachdem wir die Antwort erhalten haben, werden wir setState()
erneut den unterschiedlichen Inhalt der Fahrzeugdetails rendern. Um zu verhindern, dass Folgendes componentDidUpdate()
die Unendlichkeitsschleife verursacht, müssen wir den Status vergleichen, indem wir zu prevState
Beginn dieser Methode verwenden, um zu entscheiden, ob wir die API senden und den neuen Inhalt rendern.
Diese Methode könnte wirklich genau wie static getDerivedStateFromProps()
bei Requisiten verwendet werden, muss jedoch die Änderungen props
durch Verwendung von Requisiten bewältigen prevProps
. Und wir müssen zusammenarbeiten componentDidMount()
, um den ersten API-Aufruf abzuwickeln.
Zitat aus doc :
... Dies ist auch ein guter Ort, um Netzwerkanfragen zu bearbeiten, solange Sie die aktuellen Requisiten mit früheren Requisiten vergleichen ...
componentDidMount
Rückruf aufrufen .