React, как это работает?

Как это работает ? И почему вообще этот код работает ? Конкретно про стейт компонента.
class News extends React.Component {
    state = {
        filteredNews: this.props.data,
    }
    componentWillReceiveProps(nextProps) {
        console.log({ nextProps })
        console.log({ oldProps: this.props })
    }
    renderNews = () => {
        const { filteredNews } = this.state // используем состояние
        let newsTemplate = null
        if (filteredNews.length) { // везде data заменена на filteredNews
            newsTemplate = filteredNews.map(function(item) {
                return <Article key={item.id} data={item} />
            })
        } else {
            newsTemplate = <p>К сожалению новостей нет</p>
        }
        return newsTemplate
    }
    render() {
        const { filteredNews } = this.state // аналогично, используем состояние
        return (
            <div className="news">
               {this.renderNews()}
               {filteredNews.length ? (
                   <strong className={'news__count'}>
                       Всего новостей: {filteredNews.length}
                   </strong>
               ) : null}
           </div>
       )
    }
}

И у меня этот код не работает, взял из руководства react-course-v2
  • Вопрос задан
  • 165 просмотров
Решения вопроса 1
rockon404
@rockon404 Куратор тега React
Frontend Developer
Запись:
state = {
  filteredNews: this.props.data,
};

аналогична:
constructor(props) {
    super(props);
    this.state =  {
      filteredNews: this.props.data,
    };
  }

this.props.data записывается в state единожды в конструкторе. В последствии, при получении нового значения this.props.data, state не изменяется.

Нет никакой необходимости определять renderNews как стрелочную функцию, ее следует переделать в метод класса.

Было:
renderNews = () => {};
стало:
renderNews() {}

Я бы внес в renderNews следующие изменения, помимо переделывания в метод класса:
1. ранний return вместо переменной и блока else,
2. замена обычной функции на стрелочную в колбеке map.

Результат:
renderNews() {
  const { filteredNews } = this.state;

  if (filteredNews.length) {
    return filteredNews.map(item => (
      <Article key={item.id} data={item} />
    ));
  }

  return <p>К сожалению новостей нет</p>;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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