Quando um estado do componente de reação é alterado, o método de renderização é chamado. Portanto, para qualquer alteração de estado, uma ação pode ser executada no corpo dos métodos de renderização. Existe um caso de uso específico para o retorno de chamada setState?
191
render()
, ela será executada toda vez que QUALQUER estado for atualizado, o que provavelmente não é o que você deseja. Isso também tornará seu código menos legível e lógico.Respostas:
Sim, existe, pois
setState
funciona de umaasynchronous
maneira. Isso significa que depois de ligarsetState
athis.state
variável não é alterada imediatamente. portanto, se você deseja executar uma ação imediatamente após definir o estado em uma variável de estado e retornar um resultado, um retorno de chamada será útilConsidere o exemplo abaixo
O código acima pode não funcionar como esperado, pois o
title
variável pode não ter sido alterada antes da validação ser executada nela. Agora você pode se perguntar se podemos realizar a validação narender()
própria função, mas seria melhor e mais limpo se conseguirmos lidar com isso na própria função changeTitle, pois isso tornaria seu código mais organizado e compreensívelNesse caso, o retorno de chamada é útil
Outro exemplo será quando você quiser
dispatch
e ação quando o estado for alterado. você desejará fazê-lo em um retorno de chamada, e não no modorender()
como será chamado sempre que ocorrer a renderização novamente; portanto, muitos desses cenários são possíveis nos quais você precisará de retorno de chamada.Outro caso é um
API Call
Pode ocorrer um caso quando você precisar fazer uma chamada de API com base em uma alteração de estado específica; se você fizer isso no método de renderização, ela será chamada em todas as
onState
alterações de renderização ou porque algum Prop passou para aChild Component
alteração.Nesse caso, você deseja usar a
setState callback
para passar o valor do estado atualizado para a chamada da APIfonte
if (this.title.length === 0) {
deveria serthis.state.title.length
, certo?setState(state => state.title.length ? { titleError: "Title can't be blank" } : null)
e a alteração será empilhada. Não é necessário renderização dupla.fonte
O 1. caso de uso que me vem à cabeça é uma
api
chamada que não deve entrar na renderização, porque será executada paraeach
mudança de estado. E a chamada da API deve ser realizada apenas em alterações de estado especiais, e não em todas as renderizações.Prática muito ruim , porque o
render
método-deve ser puro, significa que nenhuma ação, mudanças de estado, chamadas de API devem ser executadas, apenas componha sua visualização e retorne-a. As ações devem ser executadas apenas em alguns eventos. Renderizar não é um evento, mascomponentDidMount
por exemplo.fonte
Considere a chamada setState
IDÉIA
Então você não pode confiar
this
. Se a chamada acima foi feita dentro de uma função assíncrona,this
ela se referirá ao estado do componente naquele momento, mas esperamos que isso se refira à propriedade dentro do estado no momento em que a chamada setState ou no início da tarefa assíncrona. E, como a tarefa era assíncrona, a propriedade pode ter mudado com o tempo. Portanto, não é confiável usarthis
palavra-chave para se referir a alguma propriedade do estado, portanto, usamos a função de retorno de chamada cujos argumentos são previousState e props, o que significa que quando a tarefa assíncrona foi concluída e que era hora de atualizar o estado usando a chamada setState, prevState se referirá ao estado agora quando setState ainda não começou. Garantindo a confiabilidade de que o nextState não seja corrompido.Código errado: levaria à corrupção de dados
Código correto com setState com função de retorno de chamada:
Portanto, sempre que precisamos atualizar nosso estado atual para o próximo estado com base no valor possuído pela propriedade agora e tudo isso está acontecendo de maneira assíncrona, é uma boa ideia usar setState como função de retorno de chamada.
Eu tentei explicá-lo em codepen aqui CODE PEN
fonte