Вызов ReactJS/Redux для отправки действия в другом редукторе

Как отправить действие в другой редуктор. Например, я создаю редуктор LogsReducer с корпусом переключателя ADD_LOG и REMOVE_LOG. Код:

const addLog = (text) => ({type: 'ADD_LOG', text});
const removeLog = (id) => ({type: 'REMOVE_LOG', id});

const logsReducer = (state = {}, action) => {
  switch (action.type) {
    case 'ADD_LOG':
       // todo
    case 'REMOVE_LOG':
       // todo
    default:
      return state;
  }
};

И я добавляю logsReducer к combineReducers. Чтобы отправить действие, я вызываю это внутри mapDispatchToProps.

dispatch(addLog('sample log'));
dispatch(removeLog(2);

И тут вопрос. Как разрешить отправку сообщения из-за пределов редуктора журналов. Например, из ответа на выборку в другом редукторе, например. contactReducer?


person Random User    schedule 23.11.2017    source источник
comment
Все действия отправляются на все редукторы, поэтому, если action.type является ADD_LOG, contactReducer также может switch на нем.   -  person Davin Tryon    schedule 23.11.2017
comment
Единственный вопрос, который вы должны задать себе, заключается в том, должны ли ваши действия выполняться в определенном порядке, если нет, то @DavinTryon его ответ — тот, который вам нужен, если они должны выполняться в определенной последовательности, вам понадобится промежуточное программное обеспечение. какой-то   -  person Icepickle    schedule 23.11.2017
comment
Да, но contactReducer — это другой редуктор. И у него нет этого случая в switch. Вы знаете, я хочу регистрировать пользовательские события и передавать их в состояние на ключ logs (logsReducer)   -  person Random User    schedule 23.11.2017
comment
@icepickle О, может быть, промежуточное программное обеспечение - это ответ, я проверяю   -  person Random User    schedule 23.11.2017
comment
Но, если они не имеют ничего общего друг с другом, то не лучше ли вам вести логирование внутри вашего диспетчера? Я не понимаю, как редукторы могут помочь вам? Можете ли вы добавить, что вы хотите регистрировать, и где вы хотите регистрировать это? Может быть, было бы лучше создать функцию более высокого порядка, которая обертывает ваши диспетчеры?   -  person Icepickle    schedule 23.11.2017
comment
Старайтесь не делать слишком много работы в редукторе. Если вы хотите выполнять работу асинхронно, я бы порекомендовал изучить redux-thunk или redux-saga. Они обеспечивают лучшее место для выполнения вычислений.   -  person Shammoo    schedule 23.11.2017


Ответы (1)


Как разрешить отправку сообщения из-за пределов редуктора журналов. Например, из ответа на выборку в другом редукторе, например. контакт Редуктор?

Обычно наличие асинхронных вызовов API или очереди диспетчеризации действий означало, что логика представления/предметной области состоит из процесса, поэтому для решения этой задачи необходим диспетчер процессов.

Общее решение — redux-saga, которое сочетает в себе промежуточное программное обеспечение и диспетчер живых процессов. При использовании saga компоненты просто уведомляют о произошедшем логическом действии, а затем сага выполняет вызовы API, создает новые действия и даже выполняет Оптимистичные обновления.

Кроме того, при redux+saga подходе ваше веб-приложение автоматически становится полнофункциональным приложением Event-Source: написав внешний код, вы также получите изоморфный внутренний код (если использовать какой-либо инструмент, подобный этому https://github.com/reimagined/resolve )

См. практики использования саги бесконечного цикла с редукцией-сагой и как установить состояние после асинхронного запроса саги

person Vladislav Ihost    schedule 24.11.2017