React-Dropzone图像预览未显示

meg*_*ams 10 dropzone.js reactjs

使用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>
    )
}
Run Code Online (Sandbox Code Playgroud)

};

meg*_*ams 14

正确答案:成为一个假人,忘了绑这个.

<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>
Run Code Online (Sandbox Code Playgroud)

https://toddmotto.com/react-create-class-versus-component/

  • JSX道具不应使用.bind()。绑定在构造函数中。 (2认同)
  • 切勿在Dropzone onDrop调用中直接绑定函数。这样做的缺点是每次上传图像时或组件渲染/重新渲染时,都会在webpack bundle.js中创建一个新功能,从而增加bundle.js文件的大小。因此,不要总是在构造函数中进行绑定,然后在需要时调用该引用。这仅在首次加载组件时创建一个新功能。 (2认同)

Ale*_*rev 8

您正在存储文件imageFiles,但在render方法中您正在映射this.state.files数组.

更改:

<div>{this.state.files.map((file) => <img src={file.preview} /> )}</div>
Run Code Online (Sandbox Code Playgroud)

至:

<div>{this.state.imageFiles.map((file) => <img src={file.preview} /> )}</div>
Run Code Online (Sandbox Code Playgroud)

或者,因为你有这个常数const files = this.state.imageFiles,你可以改变上面提到的语句:

<div>{files.map((file) => <img src={file.preview} /> )}</div>
Run Code Online (Sandbox Code Playgroud)