@dikyzz

Next.js + Redux не обновляется state. В чем ошибка?

Суть такая:
1. На странице в getInitialProps вызываю асинхронную функцию, получающую статистику пользователя.
class Statistics extends React.Component<StatisticsProps> {
  static async getInitialProps({ req, res }: NextPageContext) {
    const token = getCookie('authtoken', req);
    if (!token) {
      redirect('/auth', res);
      return false;
    }

store.dispatch(requestUserStatistics());
    StatisticsService.getUserStatistics();
  }
// Остальной код страницы

2. Ответ не жду, так как внутри функции есть вызов экшена, который по задумке должен обновлять глобальный стейт, данные которого по появлению отобразятся в нужных компонентах
export default class StatisticsService {
  static async getUserStatistics(params?: Readonly<{ [key: string]: any }>) {
    const res = await post<StatisticsResponse>(`/api/economics/lk/stat/`, params);

    if(!res.data.error) {
      // console.log("disp disp disp", res.data)
      store.dispatch(receiveUserStatistics({result: res.data.result, result_total: res.data.result_total, chartFields: ["users", "visits"]}));
    }

    return res.data;
  }
}

3. Внутри редьюсера, что в общем-то является последним шагом перед обновлением стейта, вижу, что данные приходят и готовы к записи
case RECEIVE_USER_STATISTICS:
      console.log("received", action.statistics)
      return {
        ...state,
        statistics: action.statistics,
        isLoadingStatistics: false
      };

4. По какой-то причине не происходит апдейт стейта. И если проверять сам стейт, то никакой информации там нет. При этом, если мы перейдем на эту же страницу с другой(т.е. рендер будет не на сервере, а на клиенте), то данные подгружаются и все работает.

Если вынести вызов всей этой хурмы из getInitialProps в componentDidMount, то данные через секунду(столько идет запрос) так же появляются на странице.
componentDidMount() {
    store.dispatch(requestUserStatistics());
    StatisticsService.getUserStatistics();
  }

Т.е. в первом случае не работает, а во втором работает. Почему так?
Есть мысль, что это из-за серверного рендеринга. Может быть так, что он делает запрос на сервере, но не дожидается ответа и возвращает страницу клиенту, в связи с чем теряется запись объекта в стейт?
  • Вопрос задан
  • 179 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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