Questa discussione è stata per un po 'e la risposta di @Alexander T. ha fornito una buona guida da seguire per i più recenti di React come me. E condividerò alcune conoscenze aggiuntive su come chiamare la stessa API più volte per aggiornare il componente, penso che sia probabilmente un problema comune che i principianti potrebbero affrontare all'inizio.
componentWillReceiveProps(nextProps)
, dalla documentazione ufficiale :
Se è necessario aggiornare lo stato in risposta alle modifiche prop (ad esempio, per ripristinarlo), è possibile confrontare this.props e nextProps ed eseguire transizioni di stato utilizzando this.setState () in questo metodo.
Potremmo concludere che qui è il posto in cui gestiamo i puntelli dal componente padre, abbiamo chiamate API e stato di aggiornamento.
Basati sull'esempio di @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 (...)
}
}
Aggiornare
componentWillReceiveProps()
sarebbe deprecato.
Qui ci sono solo alcuni metodi (tutti in Doc ) nel ciclo di vita che penso siano collegati alla distribuzione dell'API in generale:
Riferendosi al diagramma sopra:
Distribuire l'API in componentDidMount()
Lo scenario corretto per far chiamare l'API qui è che il contenuto (dalla risposta dell'API) di questo componente sarà statico, sparerà componentDidMount()
solo una volta mentre il componente sta montando, anche i nuovi oggetti di scena vengono passati dal componente padre o hanno azioni da condurre re-rendering
.
Il componente controlla la differenza per eseguire nuovamente il rendering ma non per il re-mount .
Citazione dal documento :
Se è necessario caricare dati da un endpoint remoto, questo è un buon posto per creare un'istanza della richiesta di rete.
- Distribuire l'API in
static getDerivedStateFromProps(nextProps, prevState)
Dobbiamo notare che ci sono due tipi di aggiornamento dei componenti , setState()
a componente corrente sarebbe non portare questo metodo per grilletto, ma ri-rendering o nuovi oggetti di scena di componente padre facciamo. Abbiamo scoperto che questo metodo si attiva anche durante il montaggio.
Questo è il posto giusto per distribuire l'API se vogliamo usare il componente corrente come un modello, ei nuovi parametri per l'API sono oggetti di scena provenienti dal componente padre .
Riceviamo una risposta diversa dall'API e ne restituiamo una nuova state
qui per modificare il contenuto di questo componente.
Ad esempio:
abbiamo un elenco a discesa per diverse auto nel componente principale, questo componente deve mostrare i dettagli di quello selezionato.
- Distribuire l'API in
componentDidUpdate(prevProps, prevState)
Diversamente da static getDerivedStateFromProps()
, questo metodo viene invocato immediatamente dopo ogni rendering tranne il rendering iniziale. Potremmo avere chiamate API e rendere la differenza in un componente.
Estendi l'esempio precedente:
il componente per mostrare i dettagli dell'auto potrebbe contenere un elenco di serie di questa auto, se vogliamo controllare quello di produzione 2013, possiamo fare clic o selezionare o ... l'elemento dell'elenco per portare un primo setState()
a riflettere questo comportamento (come l'evidenziazione della voce di elenco) in questo componente e di seguito componentDidUpdate()
inviamo la nostra richiesta con nuovi parametri (stato). Dopo aver ottenuto la risposta, siamo di setState()
nuovo per il rendering dei diversi contenuti dei dettagli dell'auto. Per evitare che ciò componentDidUpdate()
causi il ciclo infinito, è necessario confrontare lo stato utilizzando prevState
all'inizio di questo metodo per decidere se inviare l'API e rendere il nuovo contenuto.
Questo metodo potrebbe davvero essere utilizzato proprio come static getDerivedStateFromProps()
con gli oggetti di scena, ma è necessario gestire i cambiamenti props
utilizzando prevProps
. E dobbiamo collaborare con componentDidMount()
per gestire la chiamata API iniziale.
Citazione dal documento :
... Questo è anche un buon posto per fare richieste di rete purché si confrontino gli oggetti di scena attuali con oggetti di scena precedenti ...
componentDidMount
callback.