Компонент не перерисовывается даже после вызова setState

У меня есть компонент реакции, в котором пользователь может загрузить изображение, и ему также показан предварительный просмотр загруженного изображения. Он может удалить изображение, нажав кнопку удаления, соответствующую изображению. Я использую для этого 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;

Мой вопрос заключается в том, что мой компонент не перерисовывается даже после добавления или удаления изображения. Кроме того, я позаботился о том, чтобы не изменять массивы состояний напрямую. Кто-нибудь, пожалуйста, помогите.


person uneet7    schedule 29.09.2018    source источник
comment
Рассмотрите возможность предоставления работающей демонстрации для отладки. (files) => this.onDrop(files) является избыточным, обратный вызов уже привязан. prevState.filesToBeSent.concat([{acceptedFiles}]) - это выглядит подозрительно, будет объект со свойством acceptedFiles. Не похоже, что в этом есть необходимость. Разве это не должно быть [...prevState.filesToBeSent, ...acceptedFiles]?   -  person Estus Flask    schedule 29.09.2018


Ответы (1)


Попробуйте так, я использовал ES6

Изменить  7myoo2x226 .

person Nisfan    schedule 29.09.2018
comment
Большое спасибо, сэр! Итак, вы перенесли функцию отображения превью изображений внутрь рендера. Также вы обновили способ смены состояний. Но можете ли вы объяснить мне, почему мой способ изменения состояния был неправильным в функции onDrop()? - person uneet7; 29.09.2018
comment
Вы должны думать и кодировать в ответ, а не в jQuery, например, создавать html и добавлять html в элемент, а также сохранять html в состоянии в вашем случае не нужно, что вызывает ненужную сложность, если у вас большой html - person Nisfan; 29.09.2018
comment
У меня есть еще одно сомнение... Разве вы не мутировали массив состояний непосредственно в функции deleteImage(). Извините за слишком общие вопросы, так как я совершенно новичок в React. - person uneet7; 30.09.2018
comment
this.state.filesToBeSent.filter всегда возвращает новый массив, проверьте developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ - person Nisfan; 30.09.2018