проблема в области видимости переменной в react native

#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 in socket.close() не определен.