Donc j'ai ceci:
let total = newDealersDeckTotal.reduce(function(a, b) {
return a + b;
},
0);
console.log(total, 'tittal'); //outputs correct total
setTimeout(() => {
this.setState({dealersOverallTotal: total});
}, 10);
console.log(this.state.dealersOverallTotal, 'dealersOverallTotal1'); //outputs incorrect total
newDealersDeckTotal est juste un tableau de nombres, [1, 5, 9]
par exemple this.state.dealersOverallTotal
ne donne pas le total correct mais le total
fait? J'ai même mis un délai d'attente pour voir si cela résolvait le problème. toute évidence ou devrais-je poster plus de code?
javascript
reactjs
state
setstate
Le ver
la source
la source
setState
.setState
est effectivement exécuté une fois que vous avez enregistré l'état. Je pense que ce que vous vouliez faire lors du débogage était de placer laconsole.log
pièce à l'intérieur du délai d'expiration et à l'setState
extérieur.Réponses:
setState()
est généralement asynchrone, ce qui signifie qu'au moment où vousconsole.log
l'état, il n'est pas encore mis à jour. Essayez de mettre le journal dans le rappel de lasetState()
méthode. Il est exécuté une fois le changement d'état terminé:this.setState({ dealersOverallTotal: total }, () => { console.log(this.state.dealersOverallTotal, 'dealersOverallTotal1'); });
la source
setState
.this.setState({someVar: newValue},function(){ console.log("force update") });
useState
hook dans un composant fonctionnel. UtilisezuseEffect
plutôt pour un effet après le rendu.setState est asynchrone. Vous pouvez utiliser la méthode de rappel pour obtenir l'état mis à jour.
changeHandler(event) { this.setState({ yourName: event.target.value }, () => console.log(this.state.yourName)); }
la source
Utiliser async / await
async changeHandler(event) { await this.setState({ yourName: event.target.value }); console.log(this.state.yourName); }
la source
L'
setState()
opération est asynchrone et par conséquent, votreconsole.log()
sera exécuté avant quesetState()
les valeurs ne mute et que vous voyez donc le résultat.Pour le résoudre, enregistrez la valeur dans la fonction de rappel de
setState()
, comme:setTimeout(() => { this.setState({dealersOverallTotal: total}, function(){ console.log(this.state.dealersOverallTotal, 'dealersOverallTotal1'); }); }, 10)
la source
En cas de crochets, vous devez utiliser un
useEffect
crochet.const [fruit, setFruit] = useState(''); setFruit('Apple'); useEffect(() => { console.log('Fruit', fruit); }, [fruit])
la source
useEffect
s'exécute à chaque re-rendu, et si les éléments passés dans le tableau sont des variables d'état, sable changé. Ainsi, lorsque le fruit a changé et que le composant est à nouveau rendu, cet useEffect s'exécute.Le setstate est asynchrone dans react, donc pour voir l'état mis à jour dans la console, utilisez le rappel comme indiqué ci-dessous (la fonction de rappel s'exécutera après la mise à jour de setstate)
La méthode ci-dessous n'est "pas recommandée" mais pour comprendre, si vous changez directement l'état, vous pouvez voir l'état mis à jour dans la ligne suivante. Je répète que ce n'est "pas recommandé"
la source
ajoutez simplement une
componentDidUpdate(){}
méthode dans votre code, et cela fonctionnera. vous pouvez vérifier le cycle de vie de react native ici:https://images.app.goo.gl/BVRAi4ea2P4LchqJ8
la source
J'ai eu un problème lors de la définition de l'état de réaction plusieurs fois (il a toujours utilisé l'état par défaut). Suite à ce problème de réaction / github a fonctionné pour moi
const [state, setState] = useState({ foo: "abc", bar: 123 }); // Do this! setState(prevState => { return { ...prevState, foo: "def" }; }); setState(prevState => { return { ...prevState, bar: 456 }; });
la source
J'ai eu la même situation avec un code alambiqué, et rien des suggestions existantes n'a fonctionné pour moi.
Mon problème était que cela
setState
se produisait à partir de la fonction de rappel, émise par l'un des composants. Et mon soupçon est que l'appel se produisait de manière synchrone, ce qui a empêchésetState
du tout de définir l'état.En termes simples, j'ai quelque chose comme ça:
render() { <Control ref={_ => this.control = _} onChange={this.handleChange} onUpdated={this.handleUpdate} /> } handleChange() { this.control.doUpdate(); } handleUpdate() { this.setState({...}); }
La façon dont je devais "réparer" c'était de mettre
doUpdate()
ensetTimeout
comme ceci:handleChange() { setTimeout(() => { this.control.doUpdate(); }, 10); }
Pas idéal, mais sinon ce serait une refactorisation importante.
la source