@Fierfoxik

Как задать отображение spinner до ответа от сервера reactJS?

Доброго времени!
Заранее извиняюсь за столь большую писанину.
Есть контейнер списока фильмов, который отрисовывает список только после того как в store redux изменится свойство isFetching >на ture и при false отображает мой Spinner.

Дилемма в том что во первых отображение спиннера даже не заметно т.к оно длится доли секунд (есть ли смысл вешать таймер?).
Далее я попробовал такой подход для отображения спиннера когда я переключаю страницу/изменяю фильтр
Вызываю экшн(либо в action запроса, либо только при нажатии на кнопку переключения страниц) и в reducer меняю статус isFetching на false но тогда происходит небольшой скачек т.к список отрисовывается каждый раз с нуля.
if ( this.props.AllMovies.isFetching) {
return (
     <MoviesList/>
)
} else{
<Spinner/>
}

Как тут можно сделать? Так же возникает вопрос как быть если будет ошибка от сервера, добавлять ли новый else if для проверки статуса ответа и при не успешном ответе отрисовывать кнопку повторного запроса?

Живой пример проекта здесь(на данный момент спиннер не стоит при каких либо изменениях списка)
  • Вопрос задан
  • 1508 просмотров
Решения вопроса 1
rockon404
@rockon404 Куратор тега React
Frontend Developer
Идеальный вариант, создать для этих задач компонент:
function Block({ 
  children,
  isLoading, 
  isError, 
  isEmpty, 
  emptyText, 
  fetch,
}) {
  const showPreloader = isLoading && !isError;
  const allDataIsReady = !isLoading && !isError;
  const showEmptyText = allDataIsReady && isEmpty && emptyText;

  return (
    <Wrapper>
      {showPreloader && <Preloader />}
      {isError && <TryAgain fetch={fetch} />}
      {showEmptyText && <Empty>{emptyText}</Empty>}
      {allDataIsReady && children}
    </Wrapper>
  );
}


И использовать его в коде так:
render() {
  const { isLoading, isError, orderList } = this.props;

  return (
    <Block
      isLoading={isLoading}
      isError={isError}
      isEmpty={!ordersList.length}
      fetch={this.fetchOrdersList}
      emptyText="You don't have any orders."
    >
      {ordersList.map(order => <Order key={order.id} order={order} />}
    </Block>
  )
}


Название служебных дочерних компонентов компонента Block условные, но думаю суть их задач передают.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@tsahk
Мое мнение такое:
1. То что спиннер почти не заметно - это нормально раз сервер быстро ответил и рендер тоже прошел нормально.
2. Насчет "скачков", отрисовки с нуля и вообще выборки фильмов - посмотрите на библиотеку reselect, попробуйте её (если еще не используете), очень помогает во многих подобных (и не только) случаях.
3. Насчет ошибки со стороны сервера - я бы добавил, это удобно, и делается не трудно.
Ответ написан
Ваш ответ на вопрос

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

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