【问题标题】:Component not re rendering even after calling the setState即使在调用 setState 后组件也不会重新渲染
【发布时间】:2019-03-05 01:47:01
【问题描述】:

我有一个反应组件,用户可以在其中上传图片,并且他还显示了上传图片的预览。他可以通过单击图像对应的删除按钮来删除图像。我正在使用 react-dropzone 。代码如下:

class UploadImage extends React.Component {
  constructor(props) {
    super(props);
    this.onDrop = this.onDrop.bind(this);
    this.deleteImage = this.deleteImage.bind(this);
    this.state = {
      filesToBeSent: [],
      filesPreview: [],
      printCount: 10,
    };
  }

  onDrop(acceptedFiles, rejectedFiles) {
    const filesToBeSent = this.state.filesToBeSent;
    if (filesToBeSent.length < this.state.printCount) {
      this.setState(prevState => ({
        filesToBeSent: prevState.filesToBeSent.concat([{acceptedFiles}])
      }));
      console.log(filesToBeSent.length);
      for (var i in filesToBeSent) {
        console.log(filesToBeSent[i]);
        this.setState(prevState => ({
          filesPreview: prevState.filesPreview.concat([
            <div>
              <img src={filesToBeSent[i][0]}/>
              <Button variant="fab" aria-label="Delete" onClick={(e) => this.deleteImage(e,i)}>
                <DeleteIcon/>
              </Button>
            </div>
          ])
        }));
      }
    } else {
      alert("you have reached the limit of printing at a time")
    }
  }

  deleteImage(e, id) {
    console.log(id);
    e.preventDefault();
    this.setState({filesToBeSent: this.state.filesToBeSent.filter(function(fid) {
        return fid !== id
    })});
}

  render() {
    return(
      <div>
        <Dropzone onDrop={(files) => this.onDrop(files)}>
          <div>
            Upload your Property Images Here
          </div>
        </Dropzone>
        {this.state.filesToBeSent.length > 0 ? (
          <div>
            <h2>
              Uploading{this.state.filesToBeSent.length} files...
            </h2>
          </div>
        ) : null}
        <div>
          Files to be printed are: {this.state.filesPreview}
        </div>
      </div>
    )
  }
}

export default UploadImage;

我的问题是,即使在添加或删除图像后,我的组件也不会重新渲染。另外,我已经注意不直接改变状态数组。有人,请帮忙。

【问题讨论】:

  • 考虑提供一个工作演示来调试。 (files) =&gt; this.onDrop(files) 是多余的,回调已经绑定。 prevState.filesToBeSent.concat([{acceptedFiles}]) - 这看起来很可疑,会有一个具有acceptedFiles 属性的对象。看起来没有必要。不应该是[...prevState.filesToBeSent, ...acceptedFiles]吗?

标签: javascript reactjs rerender react-dropzone react-state-management


【解决方案1】:

这样试试,我用过ES6

【讨论】:

  • 非常感谢您,先生!所以你移动了在渲染中显示图像预览的功能。此外,您更新了更改状态的方式。但是你能解释一下为什么我在 onDrop() 函数中改变状态的方式是错误的吗?
  • 您必须以反应方式而不是 jQuery 方式思考和编码,例如构造 html 并将 html 附加到元素中,并且在您的情况下也不需要保持 html 状态,这会导致不必要的复杂性,如果您有大 html
  • 我还有一个疑问......你不是直接在deleteImage()函数中改变了状态数组吗?很抱歉问题太主流了,因为我对 React 完全陌生
  • this.state.filesToBeSent.filter 总是返回新数组,检查developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
猜你喜欢
  • 1970-01-01
  • 2019-08-09
  • 2019-01-24
  • 2020-02-18
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
相关资源
最近更新 更多