Gostaria de perguntar por que meu estado não está mudando quando faço um evento onclick. Eu pesquisei há um tempo que preciso vincular a função onclick no construtor, mas ainda assim o estado não está atualizando. Este é meu código:
import React from 'react';
import Grid from 'react-bootstrap/lib/Grid';
import Row from 'react-bootstrap/lib/Row';
import Col from 'react-bootstrap/lib/Col';
import BoardAddModal from 'components/board/BoardAddModal.jsx';
import style from 'styles/boarditem.css';
class BoardAdd extends React.Component {
constructor(props){
super(props);
this.state = {
boardAddModalShow: false
}
this.openAddBoardModal = this.openAddBoardModal.bind(this);
}
openAddBoardModal(){
this.setState({ boardAddModalShow: true });
// After setting a new state it still return a false value
console.log(this.state.boardAddModalShow);
}
render() {
return (
<Col lg={3}>
<a href="javascript:;" className={style.boardItemAdd} onClick={this.openAddBoardModal}>
<div className={[style.boardItemContainer,style.boardItemGray].join(' ')}>
Create New Board
</div>
</a>
</Col>
)
}
}
export default BoardAdd
javascript
reactjs
ecmascript-6
Sydney Loteria
fonte
fonte
setState
não retorna uma promessa. Se funcionou, só funcionou porqueawait
introduz um "tique" assíncrono na função e aconteceu que a atualização de estado foi processada durante esse tique. Não é garantido. Como esta resposta diz, você precisa usar o retorno de chamada de conclusão (se você realmente precisar fazer algo depois que o estado for atualizado, o que é incomum; normalmente, você só quer renderizar novamente, o que acontece automaticamente).Respostas:
Este retorno de chamada é realmente confuso. Em vez disso, use async await:
fonte
setState
não retorna uma promessa.setState
não retorna uma promessa, então NÃO deve ser aguardada. Dito isso, acho que posso ver por que isso está funcionando para algumas pessoas, porque await coloca o funcionamento interno de setState na pilha de chamadas à frente do resto da função, então ele é processado primeiro e, portanto, parece que o estado foi conjunto. Se setState tivesse ou implementasse qualquer nova chamada assíncrona, esta resposta falharia. Para implementar esta função corretamente, você pode usar isto:await new Promise(resolve => this.setState({ boardAddModalShow: true }, () => resolve()))
async this.setState({})
resolveu meu problema? Tínhamos o código funcionando, mais algum desenvolvimento foi feito, mas nada mudou essa parte do aplicativo. Apenas um dos dois objetos em setState estava sendo atualizado, tornando a funcionalidade retornada assíncrona e agora ambos os objetos estão sendo atualizados corretamente. Não tenho a mínima ideia do que diabos estava errado.Seu estado precisa de algum tempo para sofrer mutação e, como é
console.log(this.state.boardAddModalShow)
executado antes da mutação do estado, você obtém o valor anterior como saída. Então você precisa escrever o console no callback para asetState
funçãosetState
é assíncrono. Isso significa que você não pode chamá-lo em uma linha e assumir que o estado mudou na próxima.De acordo com a documentação do React
Por que eles fariam
setState
assíncronosfonte
Felizmente
setState()
leva um retorno de chamada. E é aqui que obtemos o estado atualizado.Considere este exemplo.
Portanto, quando o retorno de chamada é acionado, this.state é o estado atualizado.
Você pode obter
mutated/updated
dados no retorno de chamada.fonte
initMap()
, por exemploComo setSatate é uma função assíncrona, você precisa consolar o estado como um retorno de chamada como este.
fonte
setState()
nem sempre atualiza imediatamente o componente. Ele pode agrupar ou adiar a atualização para mais tarde. Isso torna a leitura de this.state logo após chamarsetState()
uma armadilha potencial. Em vez disso, usecomponentDidUpdate
ou umsetState
retorno de chamada (setState(updater, callback)
), sendo que qualquer um deles será acionado após a aplicação da atualização. Se você precisar definir o estado com base no estado anterior, leia sobre o argumento do atualizador abaixo.setState()
sempre levará a uma nova renderização, a menos queshouldComponentUpdate()
retorne falso. Se objetos mutáveis estão sendo usados e a lógica de renderização condicional não pode ser implementada emshouldComponentUpdate()
, chamarsetState()
apenas quando o novo estado for diferente do estado anterior evitará renderizações desnecessárias.O primeiro argumento é uma função atualizadora com a assinatura:
state
é uma referência ao estado do componente no momento em que a alteração está sendo aplicada. Não deve sofrer mutação direta. Em vez disso, as mudanças devem ser representadas pela construção de um novo objeto com base na entrada de estado e adereços. Por exemplo, suponha que desejamos incrementar um valor no estado por props.step:fonte
Se você deseja acompanhar se o estado está sendo atualizado ou não, a outra maneira de fazer a mesma coisa é
Dessa forma, você pode chamar o método "_stateUpdated" toda vez que tentar atualizar o estado para depuração.
fonte
setState()
é assíncrono. A melhor forma de verificar se o estado está atualizando seria nocomponentDidUpdate()
e não colocar umconsole.log(this.state.boardAddModalShow)
depoisthis.setState({ boardAddModalShow: true })
.de acordo com React Docs
fonte
De acordo com o React Docs
Exemplo:
fonte
Para quem está tentando fazer isso com ganchos, você precisa
useEffect
.Resultado:
fonte
quando estava executando o código e verificando minha saída no console, ele mostrava que ele está indefinido. Depois de pesquisar e encontrar algo que funcionou para mim.
Eu adicionei esse método em meu código após constructor (). verifique o ciclo de vida do fluxo de trabalho nativo reactivo.
https://images.app.goo.gl/BVRAi4ea2P4LchqJ8
fonte
fonte
Sim porque setState é uma função assíncrona. A melhor maneira de definir o estado logo depois de escrever o estado definido é usando Object.assign assim: Por exemplo, você deseja definir uma propriedade isValid como true, faça assim
Você pode acessar o estado atualizado logo após escrever esta linha.
fonte