Я читал статью, опубликованную Полом Кристофом о том, как не извлекать данные в методах рендеринга для повышения производительности. Вы можете проверить это здесь:



Этот подход отлично подходит для предотвращения бесполезных пересчетов и обеспечения того, чтобы ваш код был разделен на небольшие, полезные, поддерживаемые и читаемые части.

Давайте рассмотрим. Первоначально функция компонента render() преобразовывала входящую опору в новый массив, а затем отображала этот массив:

render() {
  const { posts } = this.props
  const topTen = posts.sort((a, b) => b.likes - a.likes).slice(0, 9)
  return //...
}

Затем автор предложил регенерировать только topTen, проверив, отличается ли новое свойство posts от предыдущего:

componentWillMount() {
  this.setTopTenPosts(this.props.posts)
}
componentWillReceiveProps(nextProps) {
  if (this.props.posts !== nextProps.posts) {
    this.setTopTenPosts(nextProps)
  }
}
setTopTenPosts(posts) {
  this.setState({
    topTen: posts.sort((a, b) => b.likes - a.likes).slice(0, 9)
  })
}

Мы можем перейти к следующему шагу с помощью команды перекомпоновать! Просто используя функцию withPropsOnChange:

import { withPropsOnChange } from ‘recompose’;
const topTen = withPropsOnChange(
  ['posts'],
  ({ posts }) => ({
    topTen: posts.sort((a, b) => b.likes - a.likes).slice(0, 9),
  })
);

… И используйте topTen из свойств компонента вместо состояния:

render() {
  const { topTen } = this.props;
  return //...
}

Функция withPropsOnChange запускает функции преобразования только при изменении любого из ключей prop, переданных в массиве первого параметра. Это поверхностное сравнение за вас. Подробнее об этом.

Спасибо, paul christophe за отличный пример.