реагировать не может использовать fileinput дважды без обновления страницы - PullRequest
1 голос
/ 13 марта 2019

Я использую html fileinput для загрузки файла сactjs, но как только я загрузил файл, я не могу вызвать функцию для загрузки другого файла, если я, конечно, не обновлю страницу.

Упрощенная версиямоего кода будет:

class Matrice extends React.Component {
  constructor(props) {
    super(props);
    this.fileInput = null;
  }

  uploadQuestion = async e => {
    console.log("uploading question");
    if (e.target.files[0]) {
      const form = new FormData();
      let type;
      if (e.target.files[0].type == "image/jpeg") type = ".jpg";
      if (e.target.files[0].type == "image/png") type = ".png";
      if (e.target.files[0].type == "image/gif") type = ".gif";
      // const fileName = this.props.current + type;
      form.append("files", e.target.files[0]); //filename
      form.append("ref", "exam"); // model
      form.append("refId", this.props.match.params.id); // id
      form.append("field", "media"); // name of field (image field)
      this.setState({ questionUploadLoading: true });
      const files = await strapi.upload(form);
      this.saveMontage(files, undefined, "question");
    }
  };

  render() {
    return (
      <>
        <input
          style={{ display: "none" }}
          ref={fileInput => (this.fileInput = fileInput)}
          onChange={this.uploadQuestion}
          className="file"
          type="file"
          id="imgAdd"
        />
        <button
          onClick={() => this.fileInput.click()}
          type="button"
          className="btn btn-secondary"
        >
          <i className="fas fa-image" />
        </button>
      </>
    );
  }
}

Но моя функция uploadQuestion не может быть вызвана снова, как только я закончу загрузку файла.А именно, console.log («загрузка вопроса») не отображается (второй раз).

Я не знаю, в чем может быть причина, но я предполагаю, что что-то мешает обработчику onChangeкак будто загрузка файла во второй раз не «изменяет» триггер.

У кого-нибудь есть идеи, что может вызвать это?

Спасибо

Ответы [ 2 ]

3 голосов
/ 13 марта 2019

Вам необходимо установить состояние для изображения, которое должно быть загружено на шаг

  1. Установить состояние для загрузки файла в вашем конструкторе (uploadFile: null)

  2. Добавить функцию для файла дескриптора. Изменить

  3. Использовать загрузку состояния (uploadFile) в uploadQuestion () вместо e.target.value [0]

  4. После выгрузки setState вернуться к uploadFile: null

  5. установить файл ввода onChange = {this.fileHandle}

class Matrice extends React.Component {
    constructor(props) {
        super(props);
        this.state:{
            uploadFile:null
        }
        this.fileInput = null;
        this.fileHandle = this.fileHandle.bind(this)
    }

fileHandle (e, a) {
    e.preventDefault()
    this.setState({ upload: e.target.files[0] })
  };

uploadQuestion = async (e) => {
    console.log('uploading question')
    if (e.target.files[0]) {
        const form = new FormData();
        let type;
        if (e.target.files[0].type == 'image/jpeg') type = '.jpg'
        if (e.target.files[0].type == 'image/png') type = '.png';
        if (e.target.files[0].type == 'image/gif') type = '.gif';
        // const fileName = this.props.current + type;
        //Use state upload(uploadFile) into uploadQuestion() instead of e.target.value[0]
        file.append('images', this.state.uploadFile, this.state.uploadFile.name) //filename
        form.append('ref', 'exam'); // model
        form.append('refId', this.props.match.params.id) // id
        form.append('field', 'media') // name of field (image field)
        this.setState({questionUploadLoading: true})
        const files = await strapi.upload(form);
        this.saveMontage(files, undefined, 'question')
        //After Upload setState back to uploadFile:null
        this.setState({uploadFile:null})
    }

}

если вы хотите подтвердить в onChange, вы можете изменить функцию ниже


fileHandle (e) {
    e.preventDefault()
    if (!e.target.files[0].name.match(/.(jpg|jpeg|png|gif)$/i)) {
      this.setState({ errorMsg: 'Please upload valid file. Allowed format jpg, jpeg, png, gif' })
      return false
    } else {
      this.setState({ upload: e.target.files[0], errorMsg: '' })
    }
  };

2 голосов
/ 13 марта 2019

Вы можете сбросить файл input, установив для него value пустую строку, и вы сможете использовать его снова.

uploadQuestion = async (e) => {
    console.log('uploading question')
    if (e.target.files[0]) {
        // ...
        this.fileInput.value = "";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...