ES6 - Avertissement: setState(...): Impossible de mettre à jour au cours de la transition d'état
Je suis la réécriture de certains vieux ReactJS code, et s'est coincé la fixation de cette erreur (l'erreur se répète environ 1700 fois dans la console, les DOM ne rend pas du tout):
Avertissement: setState(...): Impossible de mettre à jour lors d'un état existant
de transition (comme dansrender
ou d'un autre composant
le constructeur). Le rendu des méthodes doit être une pure fonction des accessoires et des
de l'état; constructeur effets secondaires sont un anti-modèle, mais peut être déplacé
pourcomponentWillMount
.
Je suis un Composant qui passe de l'état bas à un composant qui devrait rendre certains contrôles. Basé sur l'cliqué contrôles, l'état doit changer, et de nouveaux contrôles devraient rendre.
Donc c'est mon composant Conteneur:
class TeaTimer extends Component {
constructor(props) {
super(props);
this.state = {
count: 120,
countdownStatus: 'started'
}
}
componentDidUpdate(prevProps, prevState) {
if (this.state.countdownStatus !== prevState.countdownStatus) {
switch (this.state.countdownStatus) {
case 'started':
this.startTimer();
break;
case 'stopped':
this.setState({count:0});
}
}
}
componentWillUnmount() {
clearInterval(this.timer);
delete this.timer;
}
startTimer() {
this.timer = setInterval(() => {
let newCount = this.state.count -1;
this.setState({
count: newCount >= 0 ? newCount : 0
});
if(newCount === 0) {
this.setState({countdownStatus: 'stopped'});
}
}, 1000)
}
handleStatusChange(newStatus) {
this.setState({ countdownStatus: newStatus });
}
render() {
let {count, countdownStatus} = this.state;
let renderStartStop = () => {
if (countdownStatus !== 'stopped') {
return <StartStop countdownStatus={countdownStatus} onStatusChange={this.handleStatusChange()}/>
} else {
return <div>This will be the slider form</div>
}
};
return(
<div className={styles.container}>
<p>This is the TeaTimer component</p>
<Clock totalSeconds={count}/>
{renderStartStop()}
</div>
)
}
}
Et c'est mon composant de contrôles:
class StartStop extends Component {
constructor(props) {
super(props);
}
onStatusChange(newStatus) {
return() => {
this.props.onStatusChange(newStatus);
}
}
render() {
let {countdownStatus} = this.props;
let renderStartStopButton = () => {
if(countdownStatus === 'started') {
return <button onClick={()=> this.onStatusChange('stopped')}>Reset</button>;
} else {
return <button onClick={()=> this.onStatusChange('started')}>Start</button>
}
};
return(
<div className={styles.tt.Controls}>
{renderStartStopButton()}
</div>
)
}
}
StartStop.propTypes = {
countdownStatus: React.PropTypes.string.isRequired,
onStatusChange: React.PropTypes.func.isRequired
};
Je suis désolé pour le mur de texte, mais je ne peux vraiment pas trouver où est l'erreur vient - et donc ne sais pas quelle partie du code, je peux partir.
J'ai essayé la mise en œuvre de la solution trouvée dans un apparemment liés à la question, mais ne peut pas le faire fonctionner.
return <StartStop countdownStatus={countdownStatus} onStatusChange={this.handleStatusChange}/>
et voir si cela résout-il?Cela a résolu mon problème initial 🙂
OriginalL'auteur Miha Šušteršič | 2017-01-02
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez une erreur dans cette ligne:
Il devrait être:
Vous semblez être l'appel de la méthode
handleStatusChange
au lieu de passer comme un rappel.OriginalL'auteur Michał Grzejszczak
Votre metods appeler les uns les autres de sorte que vous devez définir deux instance de votre metods.
OriginalL'auteur Vahap Gençdal
Dans cette ligne dans votre
return <StartStop countdownStatus={countdownStatus} onStatusChange={this.handleStatusChange()}/>
donne l'avertissement, le handleStatusChanged fonction est appelée en appuyant sur un bouton qui tente de modifier l'état par setState mot-clé. chaque fois que l'état est modifié à rendre la fonction est appelée de nouveau, mais dans votre cas, de rendre la fonction est en cours de retour alors que le rendu de la fonction est appelée de nouveau par setState mot-clé.OriginalL'auteur Codesingh