如何在页面刷新时保持套接字实例?

How to hold the socket instance on page refresh?

在我的根组件上,我正在像这样设置套接字,

const [socket, setSocket] = useState(null);
const setupSocket = () => {
    const token = localStorage.getItem('CC_Token');
    if (token && token.length > 0 && !socket) {
      const newSocket = io('http://localhost:8000', {
        query: {
          token: localStorage.getItem('CC_Token'),
        },
      });

      newSocket.on('disconnect', () => {
        setSocket(null);
        setTimeout(setupSocket, 3000);
        makeToast('error', 'Socket disconnected!');
      });

      newSocket.on('connect', () => {
        makeToast('success', 'Socket Connected');
      });

      setSocket(newSocket);
    }
  };

  useEffect(() => {
    setupSocket();
  }, []);

并使用 react-router 我将套接字实例作为道具传递。

<Route
  exact
  path="/chatroom/:id"
  render={() => <ChatroomPage socket={socket} />}
/>;

它工作正常,直到我刷新页面。当我刷新页面套接字时,它会返回到其初始状态(null),因此我无法发送任何消息。

此代码段来自 CharoomPage 组件。

  React.useEffect(() => {
    if (socket) {
      socket.emit("joinRoom", {
        chatroomId,
      });
    }

    return () => {
      //Component Unmount
      if (socket) {
        socket.emit("leaveRoom", {
          chatroomId,
        });
      }
    };
    //eslint-disable-next-line
  }, []);

页面刷新套接字为空,因此无法发出 joinRoom 事件。

我该如何实现才能在页面刷新时发出 joinRoom 事件?

如果您刷新页面,套接字将回到初始状态 null 并且 useEffect 应该 运行.

但是您的 ChatRoomPage useEffect 没有将 socket 带入第二个参数。

试试

const ChatRoom = ({socket}) => {
  useEffect(() => {
    if( !socket) return;

    socket.emit("joinRoom", {chatroomId});
    return () => {
      if (!socket) return;
      socket.emit("leaveRoom", {chatroomId});
    };
  }, [socket]); //<== here
};

您的错误的奇怪之处在于它有时会在刷新之前起作用。