Существуют ли случаи, когда глобальные переменные, не вызывающие рендеринга, могут понадобиться в ответ? - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть глобальное состояние, работающее через Context / AppState / AppStateDispatch. У меня также есть состояние компонента, работающее через useState.

Но бывают случаи, когда может оказаться полезным избегать использования этих:

  • Нам нужен немедленный доступ к значению в текущей функции и мы не можем дождаться следующего рендера, чтобы получить его. Сохранение его с помощью useState / AppStateDispatch будет препятствовать доступу значения до следующего рендеринга

  • ... и эти же значения необходимы глобально во всем приложении

  • ... и useRef будет уничтожен при размонтировании компонента

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

Это довольно легко реализовать ... но, похоже, не React-y. Я что-то упустил?

1 Ответ

0 голосов
/ 16 апреля 2019

Я довольно подробно изучал это в последние несколько дней.Вот несколько наблюдений.

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

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

Используя глобальную переменную приложения, котораякроме React и не запускает обновление, это, конечно, глупо.

Вот подход, который я использую в данный момент.Пока что это кажется полезным.

  • Создайте объект состояния приложения для хранения всех переменных, связанных с использованием моим компонентом webRTC.
  • Инициализировать его с помощью вызова функции, getWebRTCDefaults().
  • При монтировании компонента скопируйте его из состояния приложения в переменную уровня компонента.Примечание. Он не находится в состоянии компонента - это переменная уровня компонента, доступная в любом месте компонента.
  • Как таковая, она может быть обновлена ​​в любое время внутри компонента, и ее значения немедленно доступны во всем компоненте.
  • Когда вызов начинается и заканчивается - и только потом - я использую React context dispatch для обновления объекта состояния приложения.Т.е. я не обновляю этот объект с помощью useEffect, поскольку это может привести к ненужным визуализациям.

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

...