Я думаю, через несколько сценариев, окружающих Redux, и я не смог найти чистое решение этого примера:Redux действия отправки в ответ на действия
Допустим, у вас есть компонент, который представляет собой список рецептов , Когда вы выберете рецепт из этого списка, вы получите dispatch(RECIPE_SELECTED)
. Этот асинхронный action-creator может делать дополнительные, связанные с рецептом - возможно, перейдите в async, чтобы получить ингредиенты для рецептов, сохраните выделение на сервере, что угодно.
В совершенно отдельном компоненте у вас есть список профессиональных поваров. Желаемое поведение заключается в том, что, когда пользователь выбирает рецепт, вы заполняете список профессиональных поваров любым шеф-поваром, у которого есть выбор выбранного рецепта.
Как вы слушаете RECIPE_SELECTED
, а затем отправляете абсолютно несвязанное действие, имеющее зависимость от рецепта? Что-то вроде ...
when RECIPE_SELECTED:recipe
loadChefs(recipe).then(res => dispatch(CHEFS_LOADED, res.chefs))
Вы могли смешивать этот loadChefs/dispatch
в остросюжетном создатель RECIPE_SELECTED
, но это действительно полное смешение проблем и быстро плести запутанную паутину.
Вы также мог бы сделать некоторые очень важно (то есть против зерна для Redux) вещей, как так (с помощью React):
componentWillReceiveProps(nextProps) {
if (nextProps.recipe !== this.props.recipe) {
const { dispatch, recipe } = nextProps
dispatch(loadChefs(recipe))
}
}
Я действительно не нравится ни один из этих решений. Мысли?
Я думаю, что вы слишком быстро просмотрели мой вопрос: «Вы можете смешать эту загрузку/отправку в action-creator RECIPE_SELECTED, но это очень грубое смешивание проблем и быстрое переплетение запутанной сети». Одна из основных целей заключалась в том, чтобы избежать смешивания проблем между модулями. Почему создатель 'selectRecipe' должен знать, что он также должен делать' loadChefs'? Это не должно. Это смешивает полностью отдельные домены в один и тот же создатель действия ... что означает дальнейшее продвижение по пути, в котором у вас будет создатель действия в одном модуле, который содержит знания домена о десятках других модулей. – Clev3r
Я не согласен. Если выбор нового рецепта приводит к загрузке в списке поваров, то они не являются отдельными проблемами. В редуксе нет такой вещи, как прослушиватель действий. Любая сложная логика (особенно async) принадлежит вашему создателю действия. Что вы можете сделать, так это разделить их на простых и сложных создателей действий, как показано выше. –