Как отобразить массив ImageURLs и отобразить каждый?

#javascript #reactjs

#javascript #reactjs

Вопрос:

Я реализую загрузку нескольких изображений. Пользователь должен иметь возможность выбирать изображения и просматривать небольшой предварительный просмотр выбранных изображений. Я сохраняю URL-адрес изображения в массиве и повторяю URL-адрес для отображения изображений. Проблема в том, что изображение не обновляется при предварительном просмотре. Т.Е. первое, второе и т.д. Изображение то же самое (см. Прикрепленное изображение). Когда я смотрю на URL-адрес изображения в виде текста, становится ясно, что ссылки разные и ведут к разным изображениям (см. Рисунок). Поэтому я не понимаю, почему одно и то же изображение отображается на всех итерациях, хотя URL-адрес отличается.

 export class ImageUploadView extends Component {

constructor(props) {
    super(props);
    this.onChangeImage = this.onChangeImage.bind(this);
    this.fileObj = [];
    this.fileArray = [];
}

onChangeImage (e) {
  this.fileObj.push(e.target.files)
        for (let i = 0; i < this.fileObj[0].length; i  ) {
            this.fileArray.push(URL.createObjectURL(this.fileObj[0][i]))
        }
}

  render() {


    return (
      <React.Fragment>
      <div className="card card-body mt-4 mb-4">


        <h1>Add Image</h1>

        <div>
        <input type="file" onChange={this.onChangeImage} multiple ref={this.inputRef} /> 

        {(this.fileArray || []).map((url) => (

            <MDBRow key={url} style={{ margin: '10px', display: 'inline-block' }}>
              <MDBCol>
                <MDBCard style={{ width: '5rem' }}>
                  <MDBCardImage className="img-fluid" src={url} waves />
                  <MDBCardBody>
                    <p> {url} </p>
                  </MDBCardBody>
                </MDBCard>
              </MDBCol>
            </MDBRow>
          
                    ))}
                
          </div> 


      </div>
      </React.Fragment>
    );
  }
}
  

То же изображение, другой URL

Комментарии:

1. проблема может быть скрыта. MBDCardImage можете ли вы опубликовать свой код для этого компонента здесь? В конце концов, вы могли бы настроить react stackblitz. было бы проще понять проблему

2. С помощью React вы должны использовать state для хранения данных компонента, например, выбранных файлов. И ваш onChangeImage код выглядит довольно подозрительно; this.fileObj это пустой массив, и когда вызывается функция, вы выталкиваете FileList из ввода, что означает, что в массиве теперь есть один элемент, который представляет собой список файлов.

3. Вот исправленная версия: codesandbox.io/s/serene-jackson-h6c4p?file=/src/App.js

4. @ChrisG спасибо за ваш ответ! Похоже, что код предназначен для предварительного просмотра одного изображения, но не для нескольких изображений. Например, когда пользователь выбирает два изображения, в качестве предварительного просмотра предоставляются два изображения. Я буду продолжать на основе вашего кода. Спасибо!

5. Да, я изменил свой код, поэтому при выборе новых файлов они будут добавлены вместо них.