如何在 websocket onmessage 中获取当前状态值?

How to get current state value inside websocket onmessage?

我正在用 React(Next.js) 和 websocket 构建一个网站,如下所示。

const [selectedId, setSelectedId] = useState(null)
const ws = useRef()

useEffect(() => {
  ws.current = new WebSocket(...)

  ws.current.onopen = () => {...}

  ws.current.onmessage = event => {
      console.log(selectedId)
  }

  ...

}, [selectedId])

在 onmessage 中,控制台总是 returns 相同的值,即使用户使用 setSelectedId 设置了其他值。 我知道当 websocket 初始化时,它会 return 初始值。但我需要在 onmessage 中获取当前状态。有解决办法吗?或者这是重新连接 websocket 以获取更改状态的唯一方法?

您的 useEffect 在组件首次安装后运行,并在每个消息上 returns 的闭包中保留 selectedId 的初始值。要根据 selectedId 的值更新它,您可以添加另一个效果,例如

useEffect(() => {
    if(ws.current)
        ws.current.onmessage = () => console.log(selectedId)
}, [selectedId])

将旧的事件处理程序替换为使用 selectedId 的更新值的事件处理程序。