Реализовать эквивалент использования useSelector для контекста React? - PullRequest
0 голосов
/ 14 января 2020

Существует множество статей, в которых показано, как Redux можно заменить контекстом и хуками (см., Например, из Кент Доддс ). Основная идея c - сделать ваше глобальное состояние доступным через контекст, а не помещать его в хранилище Redux. Но есть одна большая проблема с этим подходом: компоненты, которые подписываются на контекст, будут перерисовываться всякий раз, когда с контекстом происходит какое-либо изменение, независимо от того, заботится ли ваш компонент о части состояния, которая только что изменилась. Для функциональных компонентов React-redux решает эту проблему с помощью useSelector hook . Поэтому мой вопрос: можно ли создать хук типа useSelector, который бы захватил часть контекста вместо хранилища Redux, имел бы ту же сигнатуру, что и useSelector, и, так же как и useSelector, вызывал бы рендеринг компонента только тогда, когда " выделенная часть контекста изменилась?

(примечание: это обсуждение на странице React Github предполагает, что это невозможно)

Ответы [ 2 ]

5 голосов
/ 15 января 2020

Нет, это невозможно. Каждый раз, когда вы добавляете новое значение контекста в провайдера, все потребители будут перерисовывать, даже если им нужна только часть этого значения контекста.

Это определенно один из причины, по которым мы отказались от использования контекста для распространения обновлений состояния в React-Redux v6 и вернулись к использованию прямых подписок на хранилища в v7 .

Там есть написанная сообществом React RF C чтобы добавить селекторы в контекст , но никаких указаний на то, что команда React вообще не будет реализовывать этот RF C.

0 голосов
/ 02 мая 2020

Я создал инструментарий для управления состоянием с использованием ContextAPI. Он обеспечивает useSelector (с автозаполнением), а также useDispatch.

Библиотека доступна здесь:

Используется:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...