В чём разница между глобальным состоянием и состоянием компонента?
Хранить всё в одном глобальном состоянии это одна из хороших практик при использовании Redux в разработке. Однако некоторые авторы пишут, что хранить всё вплоть до флагов для управления модальными окнами и другими элементами UI не влияющими напрямую на бизнес-логику это оверхед. Хочу понять в чём разница (плюсы, минусы, подводные камни) .
С одной стороны кажется, что для поддержки и расширения удобно инкапсулировать состояние компонента внутри него. Если понадобится изменить поведение компонента, то разработчику нужно всего лишь исправить код внутри этого компонента.
С другой стороны ничто не мешает хранить состояние в общем сторе и работу с ним описывать в экшенах и редюсерах вместе с другим кодом компонента.
В итоге создаётся впечатление, что ценой за инкапсуляцию мы превращаем компонент в чёрный ящик. Возможно я что-то я упускаю?
Максим Федоров, мне проще поддерживать и тестировать компоненты вообще без состояний. Компоненты со своими состояниями это как грязные функции — пропадает ощущение контроля над поведением приложения.
Хранить всё в одном глобальном состоянии это одна из хороших практик при использовании Redux в разработке
Кто вам такое сказал?
для поддержки и расширения удобно инкапсулировать состояние компонента внутри него.
Это правда
ничто не мешает хранить состояние в общем сторе
Чувствуете разницу между "для поддержки и расширения удобно" и "ничего не мешает"?
"Ничего не мешает" вам писать как угодно - но какая в этом будет польза?
ценой за инкапсуляцию мы превращаем компонент в чёрный ящик
Мне не понятно почему хорошо, что компонент чёрный ящик. Это ведь усложняет отладку. То бишь если что-то пойдёт не так в каком-то сценарии где участвует этот компонент всё равно понадобится отлаживать и работу с его состоянием тоже. В чём выгода?
Это упрощает отладку. Не знаю почему вы называете компонент "черным ящиком" как будто вам кто-то запрещает туда посмотреть. Компонент это белый ящик тогда уж.
Если что-то пойдет не так в логике самого компонента - то вы просто берете и отлаживаете его отдельно от всего остального приложения. Хотя бы и тесты напишите.
Если что-то пойдет не так в другом месте с участием этого компонента, то за счет того что у вас стейт компонента лежит в нем самом и компонент уже протестирован и вы уверены что с ним все ок - то это уменьшает количество вещей который вам надо проверить в глобальной логике. Относительно самого компонента - вам нужно только убедиться что он правильно выполняет свой внешний контракт - в плане взаимодействия с другими частями приложения. То что у него происходит внутри, вам уже не нужно перепроверять.