shaks
@shaks

Как правильно загружать данные при серверном рендеринге + react router v4?

Пилю изоморфное/универсальное приложение. Не совсем пойму как правильно работать с данными.
В своем server.js, для того чтобы пропсы наполнялись данными перед рендером, я реализовал это:
routes.some(route => {
        const match = matchPath(req.url, route);
        if (match && typeof route.loadData === "function"){
            promises.push(store.dispatch(route.loadData()));
        }

        return match
    });

    Promise.all(promises).then(() => {
// после того как получил все данные - делаю рендер
}

После того, как верстка с контентом отдается браузеру, срабатывает уже клиентский рендер компонентов. И вот на этом месте у меня загвоздка.
Когда компонент маунтится, он должен выполнять подгрузку данных с бекенд сервера. Но эта подгрузка уже была реализована на сервере буквально мгновение назад (при условии что переход к этому компоненту не был реализован через реакт-роутер, а посредством ctrl+r например).
Вопрос в следующем - как избежать повторых запросов к бекенду с клиента (если был запрос с фронтенд-сервера), и стоит ли?
  • Вопрос задан
  • 211 просмотров
Пригласить эксперта
Ответы на вопрос 1
Вам нужно любым удобным способом сохранить информацию о том, что данные были загружены. Это можно сделать как на уровне загрузчика
// что-то вроде этого
promises.push(
  store
    .dispatch(route.loadData())
    .then(() => store.dispatch(dataForRouteLoaded(req.url))
)

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


Либо в каждом конкретном экшене проверять есть ли требуемые данные в state перед их загрузкой.
Ответ написан
Ваш ответ на вопрос

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

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