私の質問はこれです。 2つのコンポーネントがあります。最初のコンポーネントは画像クロッパーです。 2番目のコンポーネントは、トリミングされた画像を表示するコンポーネントです。
私が直面している問題は、トリミングした画像を2番目のコンポーネントに渡すことができますが、画像をトリミングして2番目のコンポーネントに渡すボタンを2回押す必要があります。 2回目のクリックでは、画像のみが2番目のコンポーネントに渡されます。しかし、私は最初のコンポーネントでトリミングされた画像をワンクリックでのみ表示できます。 reactjsの状態変化がすぐには起こらないので、それが起こっていると思います。どうすればこれを修正できますか?.
私のアプローチは、最初のコンポーネントにprop
関数をthis.props.croppedImage(this.state.preview.img);
として作成することでしたthis.state.preview.img
はトリミングされた画像です。そして、2番目のコンポーネントでは、prop関数を呼び出して、トリミングされた画像を取得しています。
私のコード
最初のコンポーネント(クロッパー)
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;
2番目のコンポーネント
ここでは基本的に次のことを行っています。
<CropperTest croppedImage = {this.getCroppedImg}/>
getCroppedImg(img){
alert("Perfect Storm");
this.setState({
previewImg:img
})
}
reactjsの状態変化がすぐに発生していないので、それは起こっていると思います。どうすればこれを修正できますか?
_React#setState
_ から、
setState(updater、[callback])
setState()
は、コンポーネントの状態の変更をキューに入れます。setState
はすぐに状態を更新しません。setState()
は常にコンポーネントをすぐに更新するわけではありません。更新をバッチ処理するか、後で延期する場合があります。これにより、setState()
を呼び出した直後に_this.state
_を読み取ることが潜在的な落とし穴になります。代わりに、componentDidUpdate
またはsetState
コールバック_(setState(updater, callback))
_を使用してください
setState
コールバックで_this.props.croppedImage
_を呼び出します。コンポーネントの状態の更新された値を取得します。あなたの場合、その_this.state.preview
_
_this.setState({
preview: {
img,
scale: this.state.scale,
}
}, () => {
this.props.croppedImage(this.state.preview.img);
})
_