Nikulio
@Nikulio
NaN !== NaN

Почему при попытке вывести элементы из Firebase ничего не выходит?

Привет всем
Не могу вывести элементы из фаербазы. В AC - выводит, в reducer - выводит, а вот уже в компоненте нет.
Код :
componentDidMount() {
    const ideas = firebase.database().ref("items");
    let arr = [];
    ideas.on("value", snapshot => {
      let items = snapshot.val();
      for (let item in items) {
        arr.push({
          id: item,
          text: items[item].text
        });
      }
    });
    this.props.renderIdeas(arr);
  }


AC :
export function renderIdeas(ideas) {
  return {
    type: RENDER_IDEAS,
    payload: ideas
  };
}


Reducer :
export default function(state = [], action) {
  switch (action.type) {
    case RENDER_IDEAS:
      return action.payload;
    default:
      return state;
  }
}


UPD:
Оказывается, все в порядке, но я не могу вывести данные console.log'ом даже.

Вот мой код:

render() {
    var Items = this.props.ideas;
    console.log(Items); //это выводит в порядке
    for (var key in Items) {
      console.log(key); //это уже не работает
    }
}


Вывод выглядит так: 5a2e42d63d792569224622.jpeg
  • Вопрос задан
  • 488 просмотров
Решения вопроса 1
rockon404
@rockon404 Куратор тега React
Frontend Developer
Код в componentDidUpdate не верный, исправить можно так:
componentDidMount() {
    const ideas = firebase.database().ref("items");
    let arr = [];
    ideas.on("value", snapshot => {
      let items = snapshot.val();
      for (let item in items) {
        arr.push({
          id: item,
          text: items[item].text
        });
      }
      this.props.renderIdeas(arr);
    });
  
  }

Причина - ассинхронность. Он у вас рендерил компонент до завершения колбека on value. Так как ссылку на массив вы передали, то в консоли он отобразился и обновился, но render прошел с пустым.

Перебирать массивы for in не рекомендуется, может быть нарушен порядок элементов. Для объектов так же лучше использовать Object.keys(obj).map
Object.keys(obj).map(key => ({ id: key, text: obj[key].text }));


reducer для render использовать не надо.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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