Flux архитектура web-приложения
Архитектура flux позволяет организовывать строго однонаправленный поток данных, основанный на четырех главных компонентах:
Хранилище данных store
Хранит в себе данные, при изменении которых вызывает изменение представления, то есть перерисовку пользовательского интерфейса.
Представление view
Отображает данные в понятном для пользователя виде, отвечает за пользовательский интерфейс.
Действие action
Объект-команда, которая которая сообщает о произошедшем событии, например, когда пользователь совершают действия в интерфейсе (нажатие кнопок, ввода текста)
Диспетчер dispatcher
Центральный узел приложения, отвечает за бизнес-логику (аналог контроллера из MVC).
Когда action
попадает в диспатчер, он распространяет action
между всем модулями, которые подписаны на него.
В Redux
такие модули называются редьюсеры reducers
. Эти модули преобразовывают данные в хранилище.
Обновление данных влечёт перерисовку представления, и цикл замыкается
Самая популярная реализация flux-архитектуры — библиотека Redux
Redux
Особенности реализации flux
в контексте redux
:
store
- Позволяет указать начальное состояние
- Подписаться на состояние
store.subscribe(callback)
- Получить текущее состояние
store.getState()
- Отправить событие
store.dispatch(someAction())
Редюсер reducer
Чистая функция принимает на вход два аргумента: предыдущее состояние и объект-событие которое возвращает новое состояние:
const counterReduser = (state = initialState, action) => { switch(action.type) { case 'INCREMENT': return { count: state.count + 1 } case 'DECREMENT': return { count: state.count - 1 } default: return state } }
Действие action
Объект состоящий из actionType
и payload
.
const incrementAction = { type: "INCREMENT", paload: {} }
Представление view
Redux является агностиком и не привязывается к конкретному фреймворку или библиотеке для отображения представления.
Для работы с фреймворками существуют специальные библиотеки, например react-redux
.
Мiddleware
Встраивается между action
и reducer
, например, для обработки асинхронных событий.
Позволяет вместо объекта-команда использовать функции
Логирование изменения состояний