Задать вопрос
undermuz
@undermuz
Full-Stack Developer

Как в связке Redux + React.js кешировать ответы сервера и где?

Суть такая:
Необходимо чтобы при вызове экшена проводилась проверка, присутствует ли в сторе уже нужный объект, если нет то производить загрузку с сервера.

Не очень понятно как в экшене это проверить или где это вообще нужно делать?

Подскажите, как делать правильно?
  • Вопрос задан
  • 2148 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
undermuz
@undermuz Автор вопроса
Full-Stack Developer
Нашел более подходящее решение для моего вопроса, через redux-thunk, который вторым аргументом в экшен передает текущее состояние стора

//redux-app/actions/LoadObject

export function LoadObject({ id }) {
    return async ( dispatch, getState ) => {
        let objectExist = getState().objects.some( _object => _object.id === id )

        if( objectExist )
        {
            dispatch({
                type: LOAD_OBJECT,
                payload: {
                    id,
                    object: objectExist
                }
            })
        } else {
            dispatch({ type: LOAD_OBJECT_BEGIN })

            let object = await ObjectApi.Load({ id })

             dispatch({
                type: LOAD_OBJECT,
                payload: {
                    id,
                    object
                }
            })
        }
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Aves
Middleware написать.
Но если данные в store, не проще ли из компонента проверять их наличие и запрашивать только если их нет?
Ответ написан
Комментировать
maxfarseer
@maxfarseer
https://maxpfrontend.ru, обучаю реакту и компании
Как вам уже написал Aves в компоненте перед вызовом экшена проверяйте, если данные уже есть - не делайте запрос. Выглядеть может так:

loadData() {
  if (state.data.length) {
    // ничего не делай
  } else {
    this.props.callActionAndLoadData()
  }
}
Ответ написан
Комментировать
@vsuhachev
Нормально настроить HTTP-кэширование (ETag, быстрый ответ 304, keep-alive) и браузер все сам закеширует.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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