В Redux есть ли концепция провайдера данных? - PullRequest
1 голос
/ 11 апреля 2020

В основном я хочу реализовать архитектуру типа

UserManager.getUser(22)

getUser () -> ReduxStore -> (не содержит пользователя с идентификатором 22) -> Переходит к провайдеру пользователя -> провайдеру пользователя идет в API и возвращает объект User. Затем Redux Store сохраняет для последующих запросов и возвращает объект User.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Redux имеет однонаправленный поток данных , поэтому запись и чтение данных не связаны.

Компоненты считывают данные Redux, подписываясь на хранилище через connect или useSelector, и они записывают данные через disptach действия в магазине.

Селектор принимает состояние и возвращает подмножество состояния, но он не меняет состояние. Отправленное действие может изменить состояние, но оно не возвращает никакого состояния.

CQRS (Разделение ответственности при выполнении команд) является одной из мотивов , стоящих за Redux . Идея CQRS заключается в следующем:

использовать другую модель для обновления информации, чем модель, которую вы используете для чтения информации

В Redux модель обновления - это действия и модель чтения это селекторы. Объединить их в одного «провайдера» - значит победить цель дизайна Redux.

Но если вам абсолютно необходимо объединить эти две проблемы, возможно, можно каким-то образом объединить селектор и действие-диспетчеризацию с гром. Опять же, однако, это не будет идиоматизм c Redux.

1 голос
/ 11 апреля 2020

Да, мы называем их создателями действий. Допустим, вы используете избыточный поток для побочных эффектов, поэтому getUser будет создателем действий, который сначала запросит хранилище избыточных данных, чтобы узнать, есть ли доступные данные, если нет, то получит их с сервера и сохранит в хранилище избыточных данных, например. this:

function getUser(id) {
  // getState is a function that gives us access to entire redux store
  return (dispatch, getState) => {
    try {
      let user = getState().users.find(x => x.id === id) || null;
      if (user) {
        dispatch({ type: 'GET_USER', payload: user })
        return;
      }

      user = fetchUserFromServer(id);
      dispatch({ type: 'GET_USER', payload: user })
    } catch(error) {
      // handle error here
    }
  }
}

Теперь, когда в следующий раз будет вызван getUser, в этом хранилище будут данные для этого пользователя и будет исключен вызов на сервер.

Надеюсь, это поможет: )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...