Ma question est la suivante. J'ai deux composantes. Le premier composant est un recadrage d'image. Le deuxième composant est celui que je devrais afficher l'image recadrée.
Le problème auquel je suis confronté est que je peux transmettre l'image recadrée à mon deuxième composant, mais je dois appuyer deux fois sur le bouton qui recadre l'image et passer au deuxième composant. Au deuxième clic, seule mon image passe au deuxième composant. Mais je ne peux afficher l'image recadrée dans le premier composant qu'en un seul clic. Je pense que cela se produit parce que dans l'état actuel des changements d'état ne se produisent pas immédiatement. Alors, comment puis-je résoudre ce problème.
Mon approche était de créer une fonction prop
dans le 1er composant comme this.props.croppedImage(this.state.preview.img);
ici this.state.preview.img
est l'image recadrée. Et dans le 2ème composant, j'obtiens l'image recadrée en appelant la fonction prop.
Mon code
1er composant (cropper)
class CropperTest extends React.Component {
constructor(props) {
super(props);
this.state = {
name: "beautiful",
scale: 1,
preview: null,
}
this.handleSave = this.handleSave.bind(this);
}
handleSave = () => {
const img = this.editor.getImageScaledToCanvas().toDataURL();
this.setState({
preview: {
img,
scale: this.state.scale,
}
})
this.props.croppedImage(this.state.preview.img);
}
setEditorRef = (editor) => {
this.editor = editor
}
render() {
return (
<div>
<div className="overlay"></div>
<div className="crop_div">
<AvatarEditor
image={this.props.cropImage}
ref={this.setEditorRef}
width={450}
height={450}
border={50}
color={[255, 255, 255, 0.6]} // RGBA
scale={this.state.scale}
rotate={0}
/>
</div>
<div className="zoom_slider text_align_center">
<input className="crop_btn" type='button' onClick={this.handleSave} value='Save'/>
</div>
</div>
)
}
}
export default CropperTest;
2e composant
Ici, je fais essentiellement ce qui suit.
<CropperTest croppedImage = {this.getCroppedImg}/>
getCroppedImg(img){
alert("Perfect Storm");
this.setState({
previewImg:img
})
}
Je pense que cela se produit parce que dans Reacts les changements d'état ne se produisent pas immédiatement. Alors, comment puis-je résoudre ce problème?
À partir de React#setState
,
setState (programme de mise à jour, [rappel])
setState()
met en file d'attente les modifications apportées à l'état du composant.setState
ne met pas immédiatement à jour l'état.setState()
ne met pas toujours à jour immédiatement le composant. Il peut par lots ou différer la mise à jour à plus tard. Cela fait de la lecture dethis.state
Juste après avoir appelésetState()
un piège potentiel. Au lieu de cela, utilisezcomponentDidUpdate
ou un rappel desetState
(setState(updater, callback))
Appelez le this.props.croppedImage
Dans le rappel setState
. Vous obtiendrez des valeurs mises à jour de l'état du composant. Dans votre cas, son this.state.preview
this.setState({
preview: {
img,
scale: this.state.scale,
}
}, () => {
this.props.croppedImage(this.state.preview.img);
})