Мне кажется, что тенденция состоит в том, чтобы заменить Redux на React Context API и useReducer.
Лично мне не нравится огромный магазин в root с состояниями из пользовательских данных, если диалоговое окно открыто все смешано вместе.
Переход на React Context API позволил мне вывести sh состояние вниз и приблизиться к тому месту, где они будут использоваться. Однако я могу только до sh до уровня, когда дочерние компоненты либо отображают, либо изменяют это значение. Например:
<Parent>
<CounterDisplay/>
<CounterIncreaseButton/>
</Parent>
Я должен рассчитывать на Родителя и создать Контекст. В контексте я добавлю значение счетчика и метод увеличенияCount (или состояние и функцию диспетчеризации при использовании шаблона редуктора). Затем я предоставляю контекст этим двум дочерним компонентам. Теперь его можно отобразить, а можно изменить.
А что, если мне понадобится еще одна кнопка, расположенная далеко от этой части дерева компонентов, которая также должна изменить значение счетчика? Я должен поднять состояние и, возможно, полностью до root. Это кажется мне странным.
2-ая проблема - когда состояния разбросаны по нескольким уровням вдоль пути в дереве, когда что-то происходит, скажем, пользователь нажимает кнопку, вам может потребоваться вызвать несколько функций из нескольких контекстов (или отправить несколько действий, по одному для каждого состояния, которое может изменяться или не изменяться). В отличие от использования Redux, поскольку все находится на root, вам просто нужно отправить одно действие.
Так что, если вместо этого у меня есть событие pub / sub на уровне root? Я могу сделать так, чтобы состояние счетчика и код манипулировали им еще больше в CounterDisplay. CounterDisplay необходимо подписаться на систему pub / sub, прослушать событие и обновить счетчик соответственно. И какой бы компонент не захотел изменить счетчик, он может просто вызвать событие.
Чего мне не хватает в этом шаблоне? Циркулярное событие л oop? Поднять условия? Чувствует себя хорошим пабом / саб библиотека может предотвратить это Я огляделся и не нашел чего-то существующего. Я посмотрел на Rx JS, но не чувствую, что он подходит.
Заранее благодарен за то, что поделился своими мыслями.