У меня есть приложение реагирования с опросом билетов (билет является частью ссылки для подключения через веб-сокет). Затем я передаю объект websocket другому компоненту, потому что только этот (другой) компонент должен получить .send()
. После входа или выхода пользователя мне нужно получить новый билет для нового соединения, потому что на сервере есть специальные данные для зарегистрированных пользователей. Как мне организовать свой код для этой задачи?
Я попытался переназначить объект ws после входа в систему / выхода из системы, но получил «Назначения переменной 'ws” изнутри React Hook. UseEffect будет потеряно после каждого рендеринга ». Я не могу сохранить назначение ws внутри хука useEffect, посколькутогда я не смогу передать его как опору, хотя я использую Redux, как вы можете видеть
const App = () => {
const { ticket, isLoggedIn } = useSelector(state => state);
const dispatch = useDispatch();
useEffect(() => {
const requestTicket = () => {
fetch('http://some/api/websocket', {
method: 'POST'
})
.then(response => response.json())
.then(ticket => {
dispatch(setTicket(ticket));
});
};
requestTicket();
}, [dispatch]);
let ws = new WebSocket('ws://socket/' + ticket);
useEffect(() => {
fetch('http://some/api/websocket', {
method: 'POST'
})
.then(response => response.json())
.then(ticket => {
ws = new WebSocket('ws://socket/' + ticket);
});
}, [isLoggedIn, ws]);
ws.onmessage = e => {
dispatch(setData(JSON.parse(e.data)));
};
return <Child ws={ws} />;
};