我在 React 应用程序中使用 websockets。应用程序应该仅由功能组件组成。
想象一下,该应用程序由两个“选项卡”组成:一个不相关,另一个是使用 websockets 的聊天。鉴于此,我们希望在用户进入聊天选项卡后建立一个 websocket 连接。
组件应该如何处理 websocket 对象?由于我们希望在用户切换回另一个选项卡 ( WebSocket.close()
)后进行清理,因此听起来我们应该在这里使用效果挂钩。
const Chat = () => {
const [messages, setMessages] = useState([]);
useEffect(() => {
const webSocket = new WebSocket("ws://url");
webSocket.onmessage = (message) => {
setMessages(prev => [...prev, message.data]);
};
return () => webSocket.close();
}, []);
return <p>{messages.join(" ")}</p>;
};
作品!但是现在,想象一下我们想要webSocket
在useEffect
范围之外的某个地方引用变量——比如说,我们想要在用户点击一个按钮后向服务器发送一些东西。
现在,应该如何实施?我目前的想法(虽然我觉得有缺陷)是:
const Chat = () => {
const [messages, setMessages] = useState([]);
const [webSocket] = useState(new WebSocket("ws://url"));
useEffect(() => {
webSocket.onmessage = (message) => {
setMessages(prev => [...prev, message.data]);
};
return () => webSocket.close();
}, []);
return <p>{messages.join(" ")}</p>;
};
有点工作,不过我觉得有一个更好的解决方案。