#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>
);
}
}
Комментарии:
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. Да, я изменил свой код, поэтому при выборе новых файлов они будут добавлены вместо них.