Для чего добавляют useContext, когда в проекте уже есть Redux?

Когда в проекте уже используется Redux, добавление useContext может позволить более гибко работать с состоянием приложения и упростить логику компонентов.

Redux является библиотекой управления состоянием, которая работает на основе глобального хранилища (store), в котором хранятся все данные приложения. Компоненты могут получать доступ к этому хранилищу через HOCы (High Order Components) или хук useSelector, и подписываться на изменения состояния через хук useDispatch.

Однако, в некоторых случаях, использование useContext совместно с Redux может быть более удобным и эффективным.
Во-первых, useContext позволяет получать доступ к контексту более прямым и интуитивным способом, без необходимости использования HOCов или хуков.

Во-вторых, использование useContext может быть полезным при разделении ответственности компонентов. Представим ситуацию, когда в проекте есть компоненты, которым требуется доступ к некоторым данным из Redux Store, но они сами по себе не выполняют никаких действий, связанных с изменением состояния. В этом случае, использование useContext позволит изолировать необходимую логику в отдельном компоненте (например, в контейнере), а "глупые" компоненты будут получать доступ к этим данным через контекст, без необходимости "подключать" Redux к ним напрямую.

Третье преимущество использования useContext совместно с Redux заключается в возможности создавать локальное состояние компонентов. В Redux все состояния хранятся в централизованном хранилище, и обновление состояния происходит через действия (actions) и редюсеры (reducers). Однако, иногда бывает удобно иметь локальное переключаемое состояние только для одного компонента, не связанного с общим состоянием приложения. В этом случае, использование useContext позволяет создавать локальное состояние, которое может быть определено и управляемо только в пределах этого компонента.

В заключении, добавление useContext в проект с Redux позволяет более гибко работать с состоянием приложения, упростить логику компонентов, разделить ответственность и создавать локальное состояние для отдельных компонентов.