@mironov_m
Учусь Frontend

Почему передается null вместо state?

Есть компонент.
В ComponentDidMount получаем данные (массив объектов), которые потом записывает в state.
При первом рендере состояние null и соответственно выходит ошибка "TypeError: Cannot read property 'map' of null". Что вполне логично. Что я не понимаю? Что мне сделать, чтобы полученные данные отрендерились?
export default class Main extends Component {
  service = new PostServise();
  state = {
    data: null
  };

  componentDidMount() {
    this.service
      .getAllPost()
      .then( (data) => {
        console.log(data);
        this.setState({
          data: data
        });
      });
  }

  renderPosts(arr) {
    return arr.map(({id, title, text}) => {
      return (
        <section className = 'main__post post'
                  key = { id }>
          <a className = 'post__link' href='viewpost.html'>{title}</a>
          <p className = 'post__text'>{text}</p>
      </section>
      )
    });
  }

  render() {
    const item = this.renderPosts(this.state.data);
    return(
      <div>
        {item}
      </div>
    );
  }
};
  • Вопрос задан
  • 152 просмотра
Решения вопроса 1
@McBernar
В реакте популярен прием
{ this.state.value && ( <>{this.state.value}</> ) }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@historydev Куратор тега JavaScript
Острая аллергия на анимешников
По моему вы опечатались:

service = new PostServise() => service = new PostService()
Ответ написан
@Dasslier
FrontEnd Developer
Проблема в том, что вы плохо понимаете жизненный цикл. Метод componentDidMount вызывается ПОСЛЕ первого рендера, а вы в рендере передаете null, поэтому и получаете такую ошибку.
Изучите жизненный цикл и для лучшего понимания вставьте консольлог в render, componentDidMount, ComponentDidUpdate, componentWillUnmount и посмотрите что и когда срабатывает
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы