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