Je lis la section Formulaires dereactjsdocumentation et vient d'essayer ce code pour démontrer l' onChange
utilisation ( 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')
);
Lorsque je mets à jour la <input/>
valeur dans le navigateur, la seconde console.log
à l'intérieur du handleChange
rappel imprime la même chose value
que la première console.log
, pourquoi je ne vois pas le résultat de this.setState({value: event.target.value})
dans la portée du handleChange
rappel?
javascript
reactjs
react-jsx
tarrsalah
la source
la source
Réponses:
De la documentation de React :
Si vous souhaitez qu'une fonction soit exécutée après le changement d'état, transmettez-la en tant que rappel.
la source
componentDidUpdate
. Il sera appelé après le changement d'état.shouldComponentUpdate
spécifie le contraire. Qu'essayez-vous exactement de faire dans le rappelsetState
auquel vous passez que vous souhaitez voir se produire avant le rendu?Comme mentionné dans la documentation React, il n'y a aucune garantie d'
setState
être déclenché de façon synchrone, vousconsole.log
pouvez donc retourner l'état avant sa mise à jour.Michael Parker mentionne avoir passé un rappel au sein du
setState
. Une autre façon de gérer la logique après un changement d'état est via lacomponentDidUpdate
méthode du cycle de vie, qui est la méthode recommandée dans les documents React.Ceci est particulièrement utile lorsqu'il peut y avoir des
setState
déclenchements successifs et que vous souhaitez déclencher la même fonction après chaque changement d'état. Plutôt que d'ajouter un rappel à chacunsetState
, vous pouvez placer la fonction à l'intérieur ducomponentDidUpdate
, avec une logique spécifique à l'intérieur si nécessaire.la source
Vous pouvez essayer d'utiliser ES7 async / wait. Par exemple, en utilisant votre exemple:
la source
setState
est asynchrone mais ne renvoie rien , doncawait
fonctionnera la plupart du temps mais seulement par hasard car c'est une condition de course.Méfiez-vous des méthodes de cycle de vie de réagir!
J'ai travaillé plusieurs heures pour savoir qui
getDerivedStateFromProps
sera appelé après chaquesetState()
.😂
la source
async-await
la syntaxe fonctionne parfaitement pour quelque chose comme ce qui suit ...la source
Veuillez lire la boucle d'événements pour avoir une image claire de la nature asynchrone dans JS et pourquoi la mise à jour prend du temps -
Par conséquent -
car il faut du temps pour mettre à jour. Pour réaliser le processus ci-dessus -
la source