Czytam sekcję FormularzeReagujedokumentacja i właśnie wypróbowałem ten kod, aby zademonstrować onChange
użycie ( JSBIN ).
var React= require('react');
var ControlledForm= React.createClass({
getInitialState: function() {
return {
value: "initial value"
};
},
handleChange: function(event) {
console.log(this.state.value);
this.setState({value: event.target.value});
console.log(this.state.value);
},
render: function() {
return (
<input type="text" value={this.state.value} onChange={this.handleChange}/>
);
}
});
React.render(
<ControlledForm/>,
document.getElementById('mount')
);
Kiedy aktualizuję <input/>
wartość w przeglądarce, druga console.log
część handleChange
oddzwaniania drukuje to samo value
co pierwsza console.log
, dlaczego nie widzę wyniku this.setState({value: event.target.value})
w zakresie handleChange
oddzwaniania?
javascript
reactjs
react-jsx
tarrsalah
źródło
źródło
Odpowiedzi:
Z dokumentacji React :
Jeśli chcesz, aby funkcja była wykonywana po zmianie stanu, przekaż ją jako wywołanie zwrotne.
źródło
componentDidUpdate
. Zostanie wywołany po zmianie stanu.shouldComponentUpdate
inaczej. Co dokładnie próbujesz zrobić w przekazanym wywołaniu zwrotnym,setState
które chcesz wykonać przed ponownym renderowaniem?Jak wspomniano w dokumentacji React, nie ma gwarancji
setState
synchronicznego odpalenia, więcconsole.log
możesz zwrócić stan przed aktualizacją.Michael Parker wspomina o przekazaniu oddzwonienia w obrębie
setState
. Innym sposobem obsługi logiki po zmianie stanu jestcomponentDidUpdate
metoda cyklu życia, która jest metodą zalecaną w dokumentach React.Jest to szczególnie przydatne, gdy mogą być
setState
uruchamiane kolejne s, a chcesz uruchomić tę samą funkcję po każdej zmianie stanu. Zamiast dodawać do każdego wywołanie zwrotnesetState
, możesz umieścić funkcję wewnątrzcomponentDidUpdate
, z określoną logiką w razie potrzeby.źródło
Możesz spróbować użyć ES7 async / czekaj. Na przykład używając twojego przykładu:
źródło
setState
jest asynchroniczny, ale nic nie zwraca , więcawait
będzie działał przez większość czasu, ale tylko przez przypadek, ponieważ jest to warunek wyścigu.Uważaj na metody cyklu życia reakcji!
Pracowałem przez kilka godzin, aby dowiedzieć się, które
getDerivedStateFromProps
będą wywoływane za każdym razemsetState()
.😂
źródło
async-await
składnia działa idealnie dla czegoś takiego jak poniżej ...źródło
Przeczytaj o pętli zdarzeń, aby uzyskać wyraźny obraz natury asynchronicznej w JS i powodów, dla których aktualizacja wymaga czasu -
W związku z tym -
ponieważ aktualizacja wymaga czasu. Aby osiągnąć powyższy proces -
źródło