React-dropzone( https://www.npmjs.com/package/react-dropzone )を使用し、コンソールにログを記録するファイルを取得しますが、状態の変化時に画像のプレビューを取得できません。私が間違っていることは何か考えていますか?
export default class JoinForm extends Component {
constructor(props) {
super(props)
this.state = {
imageFiles: []
}
}
onDrop(imageFiles) {
this.setState({
imageFiles: imageFiles
})
console.log(imageFiles)
}
render() {
return(
<form className='join-form' ref='joinForm' autoComplete='off'>
<Dropzone
onDrop={this.onDrop}
className='dropzone'
activeClassName='active-dropzone'
multiple={false}>
<div>Drag and drop or click to select a 550x550px file to upload.</div>
</Dropzone>
{this.state.imageFiles.length > 0 ? <div>
<h2>Uploading {this.state.imageFiles.length} files...</h2>
<div>{this.state.imageFiles.map((file) => <img src={file.preview} /> )}</div>
</div> : null}
</form>
)
}
};
これに対する正解:ダミーであり、これをバインドするのを忘れた。
<Dropzone
onDrop={this.onDrop.bind(this)} //<= Here
className='dropzone'
activeClassName='active-dropzone'
multiple={false}
style={imageUploadStyle}>
<div>Drag and drop or click to select a 550x550px file to upload.</div>
</Dropzone>
ファイルはimageFiles
に保存していますが、render
メソッドではthis.state.files
配列。
変化する:
<div>{this.state.files.map((file) => <img src={file.preview} /> )}</div>
に:
<div>{this.state.imageFiles.map((file) => <img src={file.preview} /> )}</div>
または、この定数const files = this.state.imageFiles
、上記のステートメントを次のように変更できます。
<div>{files.map((file) => <img src={file.preview} /> )}</div>
レンダリング関数をimageFilesに変更します。
render() {
const files = this.state.imageFiles
return(
<form className='join-form' ref='joinForm' autoComplete='off'>
<Dropzone
onDrop={this.onDrop}
className='dropzone'
activeClassName='active-dropzone'
multiple={false}>
<div>Drag and drop or click to select a 550x550px file to upload.</div>
</Dropzone>
{this.state.imageFiles.length > 0 ? <div>
<h2>Uploading {this.state.imageFiles.length} files...</h2>
<div>{this.state.imageFiles.map((file) => <img src={file.preview} /> )}</div>
</div> : null}
</form>
)