【发布时间】:2020-02-14 08:13:15
【问题描述】:
我在我的 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>;
};
有效!但是现在,假设我们想在useEffect 范围之外的某个地方引用webSocket 变量——比如说,一旦用户点击了一个按钮,我们就想向服务器发送一些东西。
现在,应该如何实施?我目前的想法(尽管我觉得这是一个有缺陷的想法)是:
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>;
};
有点效果,不过我觉得有更好的解决方案。
【问题讨论】:
-
您的问题应该在codereview.stackexchange.com
-
useRef进行救援。此外,现在您正在订阅每次渲染的新消息。我相信只做一次就足够了(useEffect( ... , [])或useEffect( ..., [webSocketRef.current] ),以防在某个时刻重新创建套接字是有意义的)
标签: javascript reactjs react-hooks