Essa discussão já dura um tempo e a resposta de @Alexander T. forneceu um bom guia a seguir para os mais novos do React como eu. E vou compartilhar alguns conhecimentos adicionais sobre como chamar a mesma API várias vezes para atualizar o componente. Acho que provavelmente é um problema comum que o novato pode enfrentar no início.
componentWillReceiveProps(nextProps)
, da documentação oficial :
Se você precisar atualizar o estado em resposta a alterações de prop (por exemplo, para redefini-lo), poderá comparar this.props e nextProps e executar transições de estado usando this.setState () neste método.
Podemos concluir que aqui é o local em que manipulamos objetos do componente pai, temos chamadas de API e atualizamos o estado.
Com base no exemplo 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 (...)
}
}
Atualizar
componentWillReceiveProps()
seria preterido.
Aqui estão apenas alguns métodos (todos eles no Doc ) no ciclo de vida que eu acho que estariam relacionados à implantação da API no caso geral:
Ao referir o diagrama acima:
Implantar API no componentDidMount()
O cenário adequado para a chamada da API aqui é que o conteúdo (da resposta da API) desse componente será estático, seja acionado componentDidMount()
apenas uma vez enquanto o componente estiver montando, até mesmo novos adereços serão transmitidos do componente pai ou terão ações para liderar re-rendering
.
O componente verifica a diferença para renderizar novamente, mas não para montar novamente .
Citação de doc :
Se você precisar carregar dados de um terminal remoto, este é um bom lugar para instanciar a solicitação de rede.
- Implantar API no
static getDerivedStateFromProps(nextProps, prevState)
Devemos notar que existem dois tipos de atualização componente , setState()
em componente atual que não levam esse método para gatilho, mas re-renderização ou novos adereços de componente pai fazer. Poderíamos descobrir que esse método também é acionado durante a montagem.
Este é um local adequado para implementar a API, se quisermos usar o componente atual como um modelo, e os novos parâmetros para a API são adereços provenientes do componente pai .
Recebemos uma resposta diferente da API e retornamos um novo state
aqui para alterar o conteúdo deste componente.
Por exemplo:
Temos uma lista suspensa para carros diferentes no componente pai, esse componente precisa mostrar os detalhes do carro selecionado.
- Implantar API no
componentDidUpdate(prevProps, prevState)
Difere da static getDerivedStateFromProps()
, esse método é chamado imediatamente após cada renderização, exceto a renderização inicial. Poderíamos ter chamadas de API e renderizar diferença em um componente.
Estenda o exemplo anterior:
O componente para mostrar os detalhes do carro pode conter uma lista de séries deste carro; se quisermos verificar a produção de 2013, podemos clicar ou selecionar ou ... o item da lista para liderar primeiro setState()
a refletir isso comportamento (como destacar o item da lista) nesse componente e, a seguir componentDidUpdate()
, enviamos nossa solicitação com novos parâmetros (estado). Depois de obter a resposta, setState()
novamente por renderizar o conteúdo diferente dos detalhes do carro. Para impedir que o seguinte componentDidUpdate()
cause o loop infinito, precisamos comparar o estado utilizando prevState
no início deste método para decidir se enviaremos a API e renderizaremos o novo conteúdo.
Esse método realmente pode ser utilizado da mesma maneira que static getDerivedStateFromProps()
com adereços, mas é necessário lidar com as alterações props
utilizando prevProps
. E precisamos cooperar componentDidMount()
para lidar com a chamada inicial da API.
Citação de doc :
... Esse também é um bom lugar para fazer solicitações de rede, desde que você compare os adereços atuais aos adereços anteriores ...
componentDidMount
retorno de chamada.