Нужно поймать действие в нескольких редукторах.Анти-шаблон? - PullRequest
0 голосов
/ 24 июня 2018

Я работаю над переписыванием / переносом моего огромного проекта слайд-шоу на React и Redux, который раньше был большим проектом jQuery с бизнес-логикой, хранящейся в больших классах.

Я собираюсь погрузитьсяпрямо в мою проблему.

У меня есть три редуктора Redux, действия и промежуточное ПО:

  • Feeds
  • Модерация
  • Слайд-шоу

Промежуточное программное обеспечение feeds заботится о получении новых сообщений и их сохранении в feed.posts

Редуктор слайд-шоу поддерживает много информации о самом слайд-шоу и бизнес-логике, например, , какая публикация в настоящее время отображается, чтосообщение должно быть следующим и т. д. В нем также должен быть список сообщений, которые были отфильтрованы, например, не должно быть сообщений, которые были заблокированы.

Проблема, с которой я сталкиваюсь, заключается в следующем: :

Промежуточное программное обеспечение каналов отправляет действие с новыми сообщениями, а затем редуктор каналов сохраняет сообщения в feed.posts.Это все хорошо.Но теперь я хочу, чтобы средство уменьшения слайд-шоу обрабатывало сообщения, удаляло сообщения, которые были заблокированы и т. Д., И затем сохраняло их в slideshow.posts, тогда как feeds.posts всегда будет содержать необработанный список сообщений для других целей.

Мое текущее решение в основном состоит в том, чтобы поймать действие новых сообщений в промежуточном программном обеспечении для слайд-шоу, и оттуда я отправляю новое действие с новыми сообщениями, которое затем можно обработать в редукторе слайд-шоу.Это чувствует анти-образец;использование промежуточного программного обеспечения для отправки действия, чтобы его можно было обработать в другом редукторе.

Другое решение состояло бы в отправке двух действий в промежуточном программном обеспечении каналов при появлении новых сообщений:

  • dispatch(feedNewPosts(posts))
  • dispatch(slideshowNewPosts(posts))

Таким образом, я могу избавиться от взлома промежуточного программного обеспечения, но он также чувствует анти-паттерн.

Тогда я подумалЧто касается использования селекторов, контейнер слайд-шоу будет выбирать посты и фильтровать их по заблокированному списку и т. д. Но проблема, с которой я сталкиваюсь при таком решении, заключается в том, что мне нужно знать, какие посты были заблокированы в редукторе слайд-шоу, потому что большинствотам происходит бизнес-логика для слайд-шоу.

Вот пример: промежуточное ПО для слайд-шоу отправляет действие, чтобы показать следующий слайд, dispatch(slideshowNextSlide()).Редуктор слайд-шоу обрабатывает действие и проверяет, какой слайд должен отображаться следующим, и сохраняет этот слайд в состоянии как slideshow.nextSlide, добавляет флаги к сообщению для анимации и т. Д. Поэтому, исходя из этого, мне нужен доступ к фильтрованным сообщениямв редукторе слайд-шоу.

Так что, если все это было обработано сложными селекторами, то у меня не будет всей информации, которая мне нужна в состоянии, например, какой слайд должен быть следующим, чтобы я могдобавить правильные классы анимации и т. д.

Есть ли что-то очевидное, что мне не хватает?Возможно, я пытаюсь хранить слишком много информации в состоянии, но мне нравится идея иметь полное состояние слайд-шоу в состоянии, , например, если я хочу сохранить состояние слайд-шоу и загрузить его позже, и т. Д..

Контейнер и компонент слайд-шоу будут очень глупыми, просто отобразите все, что находится в состоянии, добавьте определенные классы анимации, если сообщение соответствует slideshow.nextSlide и так далее.Нет сложных селекторов.

Любая помощь в правильном направлении будет принята с благодарностью.

Спасибо.

1 Ответ

0 голосов
/ 24 июня 2018

Для двух редукторов совершенно нормально слушать одно и то же действие. Это одно из преимуществ redux: определенное событие, происходящее в вашем приложении, может быть интересным для нескольких компонентов, и вы не хотите, чтобы они знали о других.

Таким образом, запуск второго действия будет антипаттерном. Я бы хотел поднять одно действие:

dispatch(newPosts(posts))

и тогда вы можете одновременно использовать редуктор feed и slideshow, слушая одно и то же действие и соответствующим образом изменяя свою часть своего состояния.

Я думаю, что в этом случае важно отделить абстрактное действие, которое происходит в вашей системе (новые сообщения доступны на основе результата вызова API или чего-то еще), от редукторов, которые будут его слушать. Если вы сделаете это, иметь одно действие, которое изменяет два разных среза состояния, будет намного естественнее.

...