Массив состояний ReactJS / NextJS не отображается после setState

#javascript #reactjs #firebase #firebase-storage #next.js

#javascript #reactjs #firebase #firebase-хранилище #next.js

Вопрос:

У меня возникли проблемы с визуализацией моих объектов с помощью .map () в React / NextJS.

У меня есть функция, с помощью которой я получаю изображения из облачного хранилища Firebase, код приведен ниже:

     getImages = () => {
        let firebase = loadFirebase()
        var storageRef = firebase.storage().ref('chest')

        let { state } = this

        storageRef.listAll().then((result) => {
            let data = []

            result.items.forEach((imageRef) => {
                imageRef.getDownloadURL().then((url) => {
                    data.push(url)
                }).catch((error) => {
                    // Handle any errors
                })
            })

            state.images = data
            this.setState({ images: data })
        }).catch((error) => {
            // Handle any errors
        })
    }
  

Эта часть, похоже, работает, поскольку я возвращаю данные, и состояние обновляется, результаты как на скриншоте:
Результаты после setState

Затем я сопоставляю изображения с приведенным ниже кодом:

 { this.state.images.map((image, index) => {
 return (
    <img
      key={ index }
      src={ image }
      alt=""
    />
  )
})}
  

На той же странице, что и эта, у меня есть другие места, где я получаю данные из Firebase, соответствующим образом устанавливаю свои состояния и визуализирую объекты с помощью .map(). В этих случаях это работает отлично. Разница в том, что в этих случаях я использую getInitialProps () для получения моих данных из Firebase, тогда как для данных из облачного хранилища у меня есть функция, описанная выше, функция getImages(), которая вызывается в componentDidMount()

Но в обоих случаях состояние задается в componentDidMount(), и конечный результат, возвращаемый this.state, выглядит как на прилагаемом скриншоте.

Любая помощь и / или улучшения в этом будут высоко оценены.

Ответ №1:

Вы никогда не должны устанавливать значения состояния вручную. Вам следует просто удалить строку, которая переводит изображения в состояние перед вызовом setState . Эта строка предотвращает отображение, поскольку после этого react не может обнаружить никаких изменений при установке состояния с помощью setState :

 getImages = () => {
    let firebase = loadFirebase()
    var storageRef = firebase.storage().ref('chest')

    storageRef.listAll().then((result) => {
        let data = []

        result.items.forEach((imageRef) => {
            imageRef.getDownloadURL().then((url) => {
                data.push(url);
                this.setState({ images: data });
            }).catch((error) => {
                // Handle any errors
            })
        });
    }).catch((error) => {
        // Handle any errors
    })
}
  

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

1. Спасибо за ответ, единственное, что пришлось изменить, это переместить this.setState({ images: data }) ниже data.push(url) , и тогда это сработало.

2. Если предоставленный ответ сработал для вас, продолжайте и примите его. Это позволяет другим людям знать, что это было полезно для вас.