Cette discussion dure depuis un certain temps et la réponse de @Alexander T. a fourni un bon guide à suivre pour les plus récents de React comme moi. Et je vais partager des connaissances supplémentaires sur l'appel à plusieurs reprises de la même API pour actualiser le composant, je pense que c'est probablement un problème courant auquel les débutants peuvent être confrontés au début.
componentWillReceiveProps(nextProps)
, à partir de la documentation officielle :
Si vous devez mettre à jour l'état en réponse aux changements de prop (par exemple, pour le réinitialiser), vous pouvez comparer this.props et nextProps et effectuer des transitions d'état en utilisant this.setState () dans cette méthode.
Nous pourrions en conclure que c'est ici que nous gérons les accessoires du composant parent, que nous avons des appels d'API et que nous mettons à jour l'état.
Basé sur l'exemple de @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 (...)
}
}
Mettre à jour
componentWillReceiveProps()
serait obsolète.
Voici seulement quelques méthodes (toutes dans Doc ) dans le cycle de vie qui, je pense, seraient liées au déploiement de l'API dans le cas général:
En vous référant au schéma ci-dessus:
Déployer l'API dans componentDidMount()
Le scénario approprié pour avoir un appel d'API ici est que le contenu (de la réponse de l'API) de ce composant sera statique, componentDidMount()
ne se déclenche qu'une seule fois pendant le montage du composant, même les nouveaux accessoires sont passés du composant parent ou ont des actions à diriger re-rendering
.
Le composant vérifie la différence pour re-rendre mais pas re-monter .
Citation du doc :
Si vous devez charger des données à partir d'un point de terminaison distant, c'est un bon endroit pour instancier la demande réseau.
- Déployer l'API dans
static getDerivedStateFromProps(nextProps, prevState)
Nous devrions remarquer qu'il ya deux types de mise à jour le composant , setState()
dans le composant actuel ne pas conduire cette méthode pour déclencher, mais les accessoires re-rendu ou nouveaux de composant parent entreprenons . Nous avons pu découvrir que cette méthode se déclenche également lors du montage.
C'est un endroit approprié pour déployer l'API si nous voulons utiliser le composant actuel comme un modèle, et les nouveaux paramètres pour l'API sont des accessoires provenant du composant parent .
Nous recevons une réponse différente de l'API et renvoyons une nouvelle state
ici pour modifier le contenu de ce composant.
Par exemple:
Nous avons une liste déroulante pour différentes voitures dans le composant parent, ce composant doit afficher les détails de celui sélectionné.
- Déployer l'API dans
componentDidUpdate(prevProps, prevState)
À la différence de static getDerivedStateFromProps()
, cette méthode est appelée immédiatement après chaque rendu sauf le rendu initial. Nous pourrions avoir un appel d'API et rendre la différence dans un composant.
Prolongez l'exemple précédent:
le composant pour afficher les détails de la voiture peut contenir une liste de séries de cette voiture, si nous voulons vérifier la production de 2013, nous pouvons cliquer ou sélectionner ou ... l'élément de liste pour diriger une première setState()
pour refléter cela comportement (comme la mise en évidence de l'élément de liste) dans ce composant, et dans ce qui suit, componentDidUpdate()
nous envoyons notre demande avec de nouveaux paramètres (état). Après avoir obtenu la réponse, nous avons à setState()
nouveau rendu le contenu différent des détails de la voiture. Pour éviter que ce qui suit componentDidUpdate()
ne provoque la boucle à l'infini, nous devons comparer l'état en utilisant prevState
au début de cette méthode pour décider si nous envoyons l'API et rendons le nouveau contenu.
Cette méthode pourrait vraiment être utilisée comme static getDerivedStateFromProps()
avec les accessoires, mais doit gérer les changements de props
en utilisant prevProps
. Et nous devons coopérer avec componentDidMount()
pour gérer l'appel d'API initial.
Citation du doc :
... C'est aussi un bon endroit pour faire des requêtes réseau tant que vous comparez les accessoires actuels aux accessoires précédents ...
componentDidMount
callback.