После того, как ранее я использовал Redux-Thunk, я играл с Redux-Saga в последнее время. До сих пор я люблю его для обработки асинхронных задач, таких как сетевые запросы. Таким образом, при использовании саг я обязательно добавлю код с асинхронной логикой в саги. Тем не менее, я немного не уверен, куда поместить остальную часть синхронной логики. Я спорю, стоит ли мне оставлять их в редукторах или действиях или создавать саги для них.
Давайте воспользуемся простым компонентом счетчика, в котором пользователь увеличивает состояние счетного числа. Этот пример является базовым и не имеет асинхронной логики, а просто использую его для демонстрации моей проблемы. В реальном приложении у меня была бы как асинхронная, так и синхронизирующая логика.
Использование Sagas для синхронной логики:
- Счетчик компонентов отправляет
START_INCREMENT
действие.
START_INCREMENT
регистр редуктора выполняется и просто возвращает старое состояние.
- Сага, которая наблюдала
START_INCREMENT
бега и put
действие INCREMENT
с полезной нагрузкой incrementNumber
.
INCREMENT
регистр редуктора выполняется и принимает текущий счетчик состояний, добавляет incrementNumber
и возвращает новое состояние.
Использование редукторов для обработки синхронной логики:
- Счетчик компонентов отправляет
INCREMENT
действие с incrementNumber
полезной нагрузкой.
INCREMENT
регистр редуктора выполняется и принимает текущий счетчик состояний, добавляет incrementNumber
и возвращает новое состояние.
Использование действий для обработки синхронной логики:
- Компонент счетчика отправляет
INCREMENT
создателю действия с incrementNumber
в качестве параметра.
- Создатель действия возвращает действие
INCREMENT
действие с count
полезной нагрузкой. Это обновленный счетчик.
INCREMENT
регистр редуктора выполняется и принимает новый счет, заменяет счет в старом состоянии и возвращает новое состояние.
Для меня есть преимущества и недостатки каждого из этих подходов. Перечислим несколько:
Сага
За
- Логика в сагах и не разбросана по сочетанию саг и действий / редукторов.
Против
- Более сложный поток с 2 действиями
Переходники
Плюсы
- Очень просто
Против
- Логика будет в 2 местах, асинхронная логика в sagas и логика синхронизации в редукторах
- Не иметь доступа к другим слоям состояния, если это было необходимо
- Редукторы должны быть чистыми, и мы не можем использовать побочные эффекты, такие как Browser или DOM API
Actions Creators
За
- Иметь доступ к другим частям состояния, если необходимо, используя redux-thunk
- Может добавлять другой код побочного эффекта в действия, например, браузер или API DOM
Против
- Логика будет в 2-х местах, асинхронная логика в сагах и логика синхронизации в действиях
- Сложнее проверить
Я склоняюсь к использованию Sagas для всех создателей асинхронной логики и действий для всей логики синхронизации, а затем поддерживаю редукторы. Имеет ли этот подход смысл или есть лучший способ обработки синхронной логики в redux-saga?
Спасибо!