dans mon réagir application, je voudrais un bouton qui dit normalement Ceci est ma première tentative: P> Enregistrer code>, modifications Son texte à sauvegarde ... code> Lorsque vous avez cliqué et le modifie le retour sur Enregistrer code> Une fois la sauvegarde terminée. const { isWorking } = this.props.isWorking;
3 Réponses :
Pouvez-vous voir? https://developer.mozilla.org/tr/docs/ Web / JavaScript / référence / Global_Objects / Promise
Componeur parent Fonction P>
onClick(){
this.setState({ isSaving : true });
this.props.onClick().then(function(){
this.setState({ isSaving : false });
});
}
Cela ne fonctionne pas parce que le STSTAT et cela.PROSS.ONCLICK () (transmis par le composant parent) sont exécutés de manière asynchrone, donc Les appels renvoient immédiatement et le passage à l'état est probablement perdu En réagissant d'optimisation p>
setstate code> peut Prenez un rappel à Que vous sachiez une fois que l'état a été mis à jour, vous pouvez donc avoir: p>xxx pré> si
ceci.props.onclick () code> est aussi async, tournez-le dans une promesse: p>xxx pré> blockquote>
Voici votre code qui fonctionne:
import React from 'react';
import { Button } from 'react-bootstrap';
class SaveButton extends React.Component {
constructor() {
super();
this.state = {
isSaving: false
};
this.handleOnClick = this.handleOnClick.bind(this);
}
handleOnClick() {
this.setState(prevState => {
return {
isSaving: !prevState.isSaving
}
});
console.log("Clicked!",this.state.isSaving);
this.handleSave();
}
handleSave() {
// Do what ever and if true => set isSaving = false
setTimeout(()=>{
this.setState(prevState=>{
return {
isSaving: !prevState.isSaving
}
})
},5000)
}
render() {
const isWorking = this.state.isSaving;
return (
<Button
bsStyle="primary"
onClick={this.handleOnClick}
>
{isWorking ? 'Saving...' : 'Save'}
</Button>
);
}
}
export default SaveButton;
Vous ne voulez généralement pas utiliser de réf. Au lieu de cela, pourquoi ne pas avoir le composant parent transmet également une poignée à un
onsavesuccy () code> fonction que les enfants peuvent appeler au besoin?Pouvez-vous simplement attendre la demande OnClick? En supposant que l'ONCLICK est une demande postale à un serveur, vous
attendre code> theonclick () code> de sorte queasync onclick () code> n'atteint jamais lececi.setstate ({émettant: faux}); code> jusqu'à ce que la demande soit terminée.