import { createStore } from 'redux' import todoApp from './reducers' let store = createStore(todoApp) // --------- store.dispatch(toggleTodo(1)) Вы вызываете store.dispatch(action). Хранилище Redux вызывает функцию-редюсер, который вы ему передали.+ Главный редюсер может комбинировать результат работы нескольких редюсеров в единственное дерево состояния приложения. Хранилище Redux сохраняет полное дерево состояния, которое возвращает главный редюсер. Технически, вы можете написать контейнеры вручную, используя store.subscribe(). Мы не советуем вам это делать, потому что React Redux производит много оптимизаций производительности, которые было бы трудно написать руками. По этой причине, вместо того чтобы писать контейнеры, мы генерируем их, воспользовавшись функцией connect(), предоставленной React Redux, об этом ниже. Redux-мидлвэры, в отличие от мидлвэров Express или Koa, решают немного другие проблемы, но концептуально схожим способом. Они предоставляют стороннюю точку расширения между отправкой действия и моментом, когда это действие достигает редюсера. Люди используют Redux-мидлвэры для логирования, сообщения об ошибках, общения с асинхронным API, роутинга и т.д. // containers import { connect } from 'react-redux' AddTodo = connect()(AddTodo) // middlewares /** * Отправляет отчеты об ошибках когда обновляется состояние и уведомляются слушатели. */ const crashReporter = store => next => action => { try { return next(action) } catch (err) { console.error('Caught an exception!', err) Raven.captureException(err, { extra: { action, state: store.getState() } }) throw err } } export const logger = store => next => action => { console.log('dispatching', action) let result = next(action) console.log('next state', store.getState()) return result } // generate function makeActionCreator(type, ...argNames) { return function(...args) { let action = { type } argNames.forEach((arg, index) => { action[argNames[index]] = args[index] }) return action } } const ADD_TODO = 'ADD_TODO' const EDIT_TODO = 'EDIT_TODO' const REMOVE_TODO = 'REMOVE_TODO' export const addTodo = makeActionCreator(ADD_TODO, 'todo') export const editTodo = makeActionCreator(EDIT_TODO, 'id', 'todo') export const removeTodo = makeActionCreator(REMOVE_TODO, 'id') Миддлвэр позволяет нам писать более выразительные, потенциально асинхронные генераторые действий. Это позволяет нам отправлять в качестве действий что-то помимо простых объектов и интерпретировать значения. Например, миддлвэр может “отлавливать” отправленные промисы (Promises) и обращать их в пару из запроса и успешных/провальных действий.