Получение ошибки, что images равно null при попытке показать предварительный просмотр загруженных изображений в react js

#javascript #reactjs #react-native #foreach #rxjs

#javascript #reactjs #react-native #foreach #rxjs

Вопрос:

У меня есть эта функция для загрузки нескольких изображений, и она работает, теперь мне нужно показать предварительный просмотр всех изображений, выбранных пользователем. Я пытался использовать map и forEach пытаться перебирать и показывать изображения, но это не работает. console.log(images) показывает URL загруженных изображений, но images.map() или images.ForEach выдает ошибку null. Кто-нибудь может сказать мне, что в этом не так? Я новичок в react, поэтому мне нужна помощь.

Это код:

 const fileObj = [];
const imageArray = [];
const [images, setImages] = useState(null); 

const uploadMultipleFiles = (e) => {
    if (e.target.name === 'images') {
        fileObj.push(e.target.files)
        for (let i = 0; i < fileObj[0].length; i  ) {
            imageArray.push(URL.createObjectURL(fileObj[0][i]))
            // console.log(imageArray)
        }
        setImages({ images: imageArray })
    }
}

{console.log(images)}
<div className="form-group multi-preview">
  { {(imageArray || []).map(url => (
         <img src={url} alt="" />
      ))} 
  }
</div>
                    
 <label htmlFor="images">
      <input
         accept="image/*"
         className={classes.input}
         id="images"
         onChange={uploadMultipleFiles}
         name="images"
         type="file"
         multiple
         ref={register({required:true})}
     />
     Images
     <IconButton color="primary" component="span">
         <PhotoCamera style={{fontSize:"xx-large"}} />
     </IconButton>
  </label>
  

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

1. где setImages определено?

2. Эй, у меня это определено так const [images, setImages] = useState(null);

3. Это должно было быть также в коде. Я думаю, проблема в этом.

4. О .. Хорошо, спасибо, что дали мне знать. Я обновлю вопрос.

Ответ №1:

При вашем setImages({ images: imageArray }) вызове вы получите значение images const равным:

 images = {images: [...]} // [...] is the imageArray
  

поэтому вам нужно будет получить к нему доступ как images.images , или, скорее, установить его как setImages(imageArray) , который будет доступен, как вы ожидаете.

Кроме того, получите доступ к переменной состояния и используйте map вместо forEach , а не imageArray . Поэтому вместо imageArray.forEach(...) использования images.map(...) . Map возвращает массив со значениями, возвращенными из вызовов функций. Тогда forEach как возвращает значение undefined.

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

1. ОК. Спасибо, я проверю это и свяжусь с вами. 🙂

Ответ №2:

 {imageArray.length>0 ? 
<div>
  {imageArray.map((element)=>{
  return(
    <img src={element} alt="" />
    )
  })}
</div>
:null}
  

Надеюсь, это решит

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

1. Привет, спасибо за ответ. Но изображение все равно не отображается.

2. можете ли вы поделиться sc imageArray в местоположении, которое мы пытаемся отобразить?

3. На самом деле я пытаюсь показать изображения после выбора файлов с помощью этой функции uploadMultipleFiles , а затем в процессе добавления массива imageArray , а затем отображения изображений из этого массива. итак, я предполагаю, что imageArray является источником. Надеюсь, это то, что вы поняли.