Хранение WebSocket-соединения в React Native: как избежать пересоздания при ререндере
Переделываю чат на React Native. В приложении используется навигатор, и присутствует множество экранов, в том числе не связанных с чатом. Возникает вопрос: куда поместить созданное WebSocket-подключение, чтобы оно не пересоздавалось при каждом ререндере? Как правильно организовать эту логику?
Сейчас при получении сообщения обработчик изменяет поля стора в MobX. Само подключение также хранится в поле стора и оттуда же изменяет поля. Всё работает, но возникает ощущение, что хранить сокет в сторе - не лучшая практика.
Предлагаемые решения
- Создать отдельный класс или синглтон со статическим полем для хранения экземпляра WebSocket, чтобы он был доступен из любого модуля без привязки к MobX.
- Использовать контекст React (Context API) для управления жизненным циклом сокета - это позволит избежать пересоздания при ререндере.
- Вынести логику сокета в отдельный сервис, который будет вызывать методы MobX для обновления данных, но сам не храниться в сторе.
Оптимальный вариант - создать класс SocketService с синглтоном, который управляет соединением, а при получении сообщения дергает MobX-стор для обновления полей. Это разделяет ответственность и делает код чище.