@lacront

Почему при изменении route долго отрисовывается компонент?

Суть проблемы в следующем. При первом открытии приложения создается компонент List, который посылает запрос к серверу на загрузку данных. В этот момент отображается прелоадер. Как только данные загрузились отрисовывается таблица. Все происходит плавно, но до тех пор пока не начинаем изменять route. Если перейти по другому маршруту, а затем вернуться на главную страницу, на которой расположен компонент List, мы заметим задержку перед изменением маршрута примерно в секунду, что не очень приятно. Получается что данные есть, прелоадер показывать незачем, но actual dom из 100 строк рендерится секунду. Меня бы это ничуть не смутило, но я делал такое же приложение на vue и там точно такой же список рендерится в разы быстрее, абсолютно незаметно для пользователя. В чем может быть проблема?
class ListOfCoins extends React.Component {

  componentDidMount(){
    if (this.props.isLoading){
        this.props.fetchCoinData();
    }
  }

  renderTable = () => {
    const { currency, coins } = this.props;
    return (
      coins.map((coin) => (
        <Link key={coin.id} to={'/coins/' + coin.symbol}>
          <CoinItem
            coin={coin}
            currency={currency}
          />
        </Link>
      ))
    )
  }

  render(){
    const { isLoading } = this.props;
    if (isLoading) return <Preloader height='75vh'/>
    return (
      <Segment.Group stacked>
        {this.renderTable()}
      </Segment.Group>
    )
  }
}

const mapStateToProps = state => {
  const firstItem = state.pagination.page * state.pagination.perPage - state.pagination.perPage;
  const secondItem = state.pagination.page * state.pagination.perPage;

  return {
    coins: state.coins.slice(firstItem, secondItem),
    isLoading: state.isLoading.coins,
    pagination: state.pagination,
    currency: state.currency,
  }
}

const mapDispatchToProps = (dispatch) => ({
    fetchCoinData: () => dispatch(fetchCoinData()),
    nextPage: () => dispatch(nextPage()),
    prevPage: () => dispatch(prevPage()),
    viewAll: () => dispatch(viewAll()),
    backTo100: () => dispatch(backTo100()),
    dispatch: dispatch,
})

ListOfCoins.propTypes = {
  coins: PropTypes.array.isRequired,
  isLoading: PropTypes.bool.isRequired,
  pagination: PropTypes.object.isRequired,
  currency: PropTypes.string.isRequired,
}

export default connect(mapStateToProps, mapDispatchToProps)(ListOfCoins);
  • Вопрос задан
  • 110 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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