如何在 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
的更新值的事件处理程序。
我正在用 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
的更新值的事件处理程序。