Eu queria verificar o que acontece quando você usa this.setState várias vezes (2 vezes para fins de discussão). Achei que o componente seria renderizado duas vezes, mas aparentemente só foi renderizado uma vez. Outra expectativa que eu tinha era que talvez a segunda chamada para setState superasse a primeira, mas você adivinhou - funcionou bem.
Link para um JSfiddle
var Hello = React.createClass({
render: function() {
return (
<div>
<div>Hello {this.props.name}</div>
<CheckBox />
</div>
);
}
});
var CheckBox = React.createClass({
getInitialState: function() {
return {
alex: 0
};
},
handleChange: function(event) {
this.setState({
value: event.target.value
});
this.setState({
alex: 5
});
},
render: function() {
alert('render');
return (
<div>
<label htmlFor="alex">Alex</label>
<input type="checkbox" onChange={this.handleChange} name="alex" />
<div>{this.state.alex}</div>
</div>
);
}
});
ReactDOM.render(
<Hello name="World" />,
document.getElementById('container')
);
Como você verá, um alerta que diz 'render' aparece em cada render.
Você tem uma explicação de por que funcionou corretamente?
javascript
reactjs
alexunder
fonte
fonte
this.state.alex
- o que acontece se você adicionar um elemento que dependathis.state.value
também?Respostas:
Atualizações de estado dos lotes React que ocorrem em manipuladores de eventos e métodos de ciclo de vida. Portanto, se você atualizar o estado várias vezes em um
<div onClick />
manipulador, o React aguardará que o tratamento de eventos termine antes de renderizar novamente.Para ficar claro, isso só funciona em manipuladores de eventos sintéticos controlados pelo React e métodos de ciclo de vida. As atualizações de estado não são agrupadas em AJAX e
setTimeout
manipuladores de eventos, por exemplo.fonte
<div onClick />
) e métodos de ciclo de vida de componentes, ele sabe que pode alterar com segurança o comportamento desetState
durante a chamada para atualizações de estado em lote e esperar para liberar. Em um AJAX ousetTimeout
manipulador, por outro lado, o React não tem como saber quando nosso manipulador terminou de executar. Tecnicamente, o React enfileira atualizações de estado em ambos os casos, mas libera imediatamente fora de um manipulador controlado pelo React.ReactDOM.unstable_batchedUpdates(function)
batchsetState
fora dos manipuladores de eventos React. Como o nome indica, você anulará sua garantia.O método setState () não atualiza imediatamente o estado do componente, ele apenas coloca a atualização em uma fila para ser processada posteriormente. O React pode agrupar várias solicitações de atualização para tornar a renderização mais eficiente. Devido a isso, precauções especiais devem ser tomadas ao tentar atualizar o estado com base no estado anterior do componente.
Por exemplo, o código a seguir apenas incrementará o atributo de valor de estado em 1, embora tenha sido chamado 4 vezes:
Para usar um estado após ter sido atualizado, faça toda a lógica no argumento de retorno de chamada:
O método setState (atualizador, [retorno de chamada]) pode assumir uma função atualizador como seu primeiro argumento para atualizar o estado com base no estado anterior e nas propriedades. O valor de retorno da função atualizadora será mesclado superficialmente com o estado anterior do componente. O método atualiza o estado de forma assíncrona, portanto, há um retorno de chamada de opção que será chamado assim que a atualização do estado for concluída.
Exemplo:
Aqui está um exemplo de como atualizar o estado com base no estado anterior:
fonte
setState(updater,[callback])
, é meio que umObject.assign
obrigado menos prolixo por isso!