Chciałem sprawdzić, co się dzieje, gdy używasz this.setState wiele razy (2 razy na potrzeby dyskusji). Myślałem, że komponent zostanie wyrenderowany dwukrotnie, ale najwyraźniej jest renderowany tylko raz. Innym oczekiwaniem było to, że może drugie wywołanie setState przejdzie przez pierwsze, ale zgadłeś - działało dobrze.
Link do 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')
);
Jak zobaczysz, przy każdym renderowaniu pojawia się alert z napisem „renderuj”.
Czy masz wyjaśnienie, dlaczego to działało prawidłowo?
javascript
reactjs
alexunder
źródło
źródło
this.state.alex
- co się stanie, jeśli dodasz element, od którego również zależythis.state.value
?Odpowiedzi:
Reaguj aktualizacje stanu partii, które występują w programach obsługi zdarzeń i metodach cyklu życia. Dlatego jeśli wielokrotnie aktualizujesz stan w
<div onClick />
module obsługi, React będzie czekał na zakończenie obsługi zdarzenia przed ponownym renderowaniem.Aby było jasne, działa to tylko w kontrolowanych przez React syntetycznych programach obsługi zdarzeń i metodach cyklu życia. Na przykład aktualizacje stanu nie są grupowane w programach AJAX i
setTimeout
programach obsługi zdarzeń.źródło
<div onClick />
) i metody cyklu życia komponentów, wie, że może bezpiecznie zmienić zachowaniesetState
na czas trwania wywołania aktualizacji stanu wsadowego i czekać na opróżnienie. WsetTimeout
przeciwieństwie do AJAX lub programu obsługi, React nie ma możliwości dowiedzenia się, kiedy nasz program obsługi zakończył wykonywanie. Technicznie rzecz biorąc, React kolejkuje aktualizacje stanu w obu przypadkach, ale opróżnia je natychmiast poza program obsługi kontrolowany przez React.ReactDOM.unstable_batchedUpdates(function)
do wsadowaniasetState
poza programami obsługi zdarzeń React. Jak sama nazwa wskazuje, utracisz gwarancję.Metoda setState () nie aktualizuje natychmiast stanu komponentu, po prostu umieszcza aktualizację w kolejce do przetworzenia później. React może grupować wiele żądań aktualizacji, aby renderowanie było bardziej wydajne. Z tego powodu przy próbie aktualizacji stanu w oparciu o poprzedni stan składnika należy zachować szczególne środki ostrożności.
Na przykład poniższy kod zwiększy atrybut wartości stanu tylko o 1, mimo że został wywołany 4 razy:
Aby użyć stanu po jego aktualizacji, wykonaj całą logikę w argumencie callback:
Metoda setState (updater, [callback]) może przyjąć funkcję aktualizującą jako pierwszy argument do aktualizacji stanu na podstawie poprzedniego stanu i właściwości. Wartość zwracana funkcji aktualizującej zostanie płytko scalona z poprzednim stanem komponentu. Metoda aktualizuje stan asynchronicznie, więc istnieje wywołanie zwrotne opcji, które zostanie wywołane po zakończeniu pełnej aktualizacji stanu.
Przykład:
Oto przykład, jak zaktualizować stan na podstawie poprzedniego stanu:
źródło
setState(updater,[callback])
, to jest jak mniej szczegółoweObject.assign
dzięki za to!