#javascript #reactjs #react-native #websocket
#javascript #reactjs #react-native #websocket
Вопрос:
Я использую верхнюю часть root:
return (
<Provider store={store}>
<StatusBar key="AppStatusBar" barStyle="light-content" backgroundColor={colors.blackAlertHeader} />
<Socket />
<AppContainer />
</Provider>
);
У меня проблема, когда я отправляю статус из redux в этот компонент:
const Socket: React.FC<ISocketHandler> = (props: ISocketHandler) => {
let socket: WebSocket;
useEffect(() => {
checkAppState(props.wsStatus.wsStatus);
return () => AppState.removeEventListener('change', () => controlSocketConnection());
}, [props.wsStatus.wsStatus]);
const checkAppState = (status) => {
if (!status) {
AppState.addEventListener('change', () => controlSocketConnection());
} else if (status == 'wsSignin' || status == 'wsSignout') {
controlSocketConnection(status);
}
};
const controlSocketConnection = async (status = '') => {
if (AppState.currentState == 'active' amp;amp; status !== 'wsSignout') {
socket = await connectToWS();
getNewState(socket);
} else if (AppState.currentState == 'background' || status == 'wsSignout') {
socket.close();
}
};
Я использую этот компонент поверх всех остальных, поэтому, когда я отправляю props.wsStatus.wsStatus= 'wsSignout'
сюда, он не может получить доступ к сокету, сокет не определен. как я могу ее решить?
ОБНОВЛЕНИЕ: наконец-то я решаю ее с помощью const socket= useRef<WebSocket>(null)
. Переменная сокета сохраняет свое значение до тех пор, пока компонент не будет размонтирован, и важно, чтобы это изменение не приводило к повторному отображению компонента.
Комментарии:
1. Вы никогда
socket
ничему не присваиваете. Это попытка присвоить его?let socket: WebSocket;
Похоже, что это должно бытьlet socket = WebSocket;
2. да, когда приложение активно или ‘wsSignin’, я вызываю
socket = await connectToWS();
для создания сокета. когда приложение активно или работает в фоновом режиме, сокет правильный, но когда я пытаюсь wsSignout ,socket
insocket.close()
не определен.