@One_null

В чём проблема обращения к конкретному элементу массива?

В общем проблема в следующем, есть база данных на firebase, есть компонент React. Я получаю данные из базы данных и формирую из них массив объектов вида:
5cd16b7761864305480657.png,
после этого я пытаюсь передавать в состояние компонента данные из этого массива, но данных в массиве нет.
class CalendarDay extends Component{
    constructor(props){
        // console.log(db);
        super(props);
        this.state = {
            production: db.map( x => (x.data === this.props.date && localStorage.user === x.user_id) ? x.production : 0),
        }
    }

Моя идея проста, если совпадает дата и пользователь текущий и из базы данных, вывести значение в состояние. Однако, если выполнить console.log(db) - массив будет выведен, в нём будут значения, но если выводить например первый объект массива console.log(db[0]) - будет undefined. Если я правильно понимаю, то в момент отрисовки компонента массив ещё не заполнен, как это можно пофиксить?
  • Вопрос задан
  • 193 просмотра
Решения вопроса 1
rockon404
@rockon404 Куратор тега React
Frontend Developer
Можно использовать метод жизненного цикла componentDidMount:
class CalendarDay extends Component {
  state = { data: [] };

  comonentDidMount() {
    // тут делаем запрос к БД и передаем данные в состояние
  }
  // ...
}


Консоль отображает массив по состоянию на текущий момент. Во время вызова конструктора данных там еще нет. Чтобы в этом убедиться достаточно изменить вызов на:
console.log(JSON.stringify(db));
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@kova1ev
Как я понял, получение данных из базы идет асинхронно. Я бы сделал так:
в конструкторе
this.state = {prodaction: []}

добавил бы componentDidMount() где вызывал функцию получения данных из базы, передавая ей в качестве коллбэка this.setState

то есть, компонент монтируется, вызывается загрузка данных, когда данные загружены вызывается setState, компонент перерисовывается. Пока данные не получены, можно крутить какой-нить прелоадер.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы