tl; dr - я решил использовать redux-loop
, который позволяет вам описывать побочные эффекты редуктора, не делая редуктор чистым / без состояния.
Почему я не использовал redux-thunk
для этого:
Наиболее распространенный подход (основанный на моем поиске в Google), представленный в ответе @ lecstor, заключается в использовании redux-thunk
.В типичной организации кода redux-thunk
сначала нужно выяснить все, что должно произойти, а затем через некоторое количество распределить некоторое количество действий, асинхронных операций и т. Д.
Недостатком в этом случае являетсявторое действие (а) обусловлено состоянием после первого срабатывания, и (б) не может быть получено из самого состояния, но должно быть получено из того факта, что у нас это состояние после это действие.
Таким образом, с redux-thunk
вы должны либо дублировать логику редуктора (плохо), либо выполнить всю бизнес-логику перед редукторами, а затем запустить набор действий, описывающих состояниеизменения.
Это все, что нужно сказать, redux-thunk
делает свое волшебство до того, как произойдет редуктор.
Почему я думаю, redux-loop
было лучше:
С другой стороны, redux-loop
сотворяет магию после редуктора происходит, позволяя редуктору описать эти эффекты (включая запуск асинхронных действий, отправку fпоследующие действия и т. д.) без нарушения безгражданства.
Для исторической записи это означает, что в приведенном выше редукторе foo
вы можете сделать:
// ... nextState is the new fooState
if (isWeird(nextState)) {
return loop(nextState, Cmd.action(makeWeirdAction()));
} else {
return nextState;
}
, чтобы все остальные редукторы могли интерпретировать или игнорировать странные действия по своему усмотрению, вместо этогопринятия этих решений сразу в создателе действия.