【问题标题】:Accessing my socket variable outside of useEffect在 useEffect 之外访问我的套接字变量
【发布时间】:2020-01-09 18:47:18
【问题描述】:

我将 socket.io 用于多个聊天室,并且希望我的套接字连接仅在聊天室打开时存在,并在聊天室卸载时关闭。目前,我在我的 useEffect 挂钩中连接到我的套接字。问题是,我不能在我的任何函数中执行 socket.emit(),因为我的套接字是在 useEffect 中定义的,如下所示:

import io from 'socket.io-client'

export default function Chat() {
  useEffect(() => {
    const socket = io(endpoint + '/chat')
    return () => { socket.disconnect() }
  }

  const sendMessage = (msg) => {
    // Cant access this because socket is defined in useEffect!
    socket.emit('message', msg)
  }
}

我尝试在我的导入下声明我的套接字,如下所示:

import io from 'socket.io-client'
const socket = io(endpoint + '/chat')

export default function Chat() {
...
}

但是,这种方式的问题在于 socket.disconnect() useEffect 钩子内部不再起作用,并且套接字连接保持活动状态。

我也尝试将我的套接字声明为我的函数的变量,如下所示:

export default function Chat() {
  const socket = io (endpoint + '/chat')
   ...
}

但这会导致多个套接字连接触发,我最终会在我的服务器上出现内存泄漏和许多套接字连接,这些连接不能全部用 socket.disconnect() 关闭

任何帮助将不胜感激,谢谢

【问题讨论】:

    标签: reactjs sockets socket.io react-hooks


    【解决方案1】:

    只需为您的套接字实例添加状态并将其设置在您的 useEffect 挂钩中

    import io from 'socket.io-client'
    
    export default function Chat() {
    
       const [currentSocket, setCurrentSocket] = useState(null)
    
      useEffect(() => {
        const socket = io(endpoint + '/chat')
        setCurrentSocket(socket)
        return () => { socket.disconnect() }
      }
    
      const sendMessage = (msg) => {
        // Access the socket
        currentSocket.emit('message', msg)
      }
    }
    

    现在您可以从 currentSocket 状态变量访问套接字

    【讨论】:

      猜你喜欢
      • 2021-10-22
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多