reactjs - socket.on 听太多
问题描述
socket.store.ts
我在 store ( )中创建了一个套接字
constructor() {
this.socket = io.connect(process.env.REACT_APP_SOCKET_URI || '3131');
}
在我的组件中使用该套接字。当用户单击查找按钮时,套接字向后端发出一次(选中),后端发出一次(选中)回事件“查找”。但是called
当我重新单击查找按钮时,打印到控制台 12 次甚至迅速增加
const socketStore = useContext(SocketStoreContext);
const socket = socketStore.socket;
// THOUGHT: maybe i will try to create socket inside this component
// const socket = io.connect(process.env.REACT_APP_SOCKET_URI);
socket.on('finding', () => {
console.log('called');
});
const handleFindPartner = () => {
socket.emit('find', {
token: user.token,
});
};
但是当我在我的组件中创建套接字时,called
只打印了一次。不知道这里发生了什么,真的需要一些帮助。非常感谢你们!
解决方案
就像@Mike 在评论部分所说的那样。我需要socket.on
通过将其放入 useEffect 来防止重新渲染
const socketStore = useContext(SocketStoreContext);
const socket = socketStore.socket;
// THOUGHT: maybe i will try to create socket inside this component
// const socket = io.connect(process.env.REACT_APP_SOCKET_URI);
React.useEffect(()=>{
socket.on('finding', () => {
console.log('called');
});
},[socket])
const handleFindPartner = () => {
socket.emit('find', {
token: user.token,
});
};
推荐阅读
- c++ - C++17:如何解决“未定义的委托人 vtable 引用”
- bash - 引号之间的单引号
- asp.net - DataTables - 请求的未知参数(ASP.NET Core MVC)
- python - 使用枕头时的图像粘贴问题 - python
- c++ - 当您将内存地址传递给具有指针传递参数的函数时会发生什么?
- javascript - 选择/取消选择单选按钮时显示/隐藏表单
- reactjs - 如何使用 React 更改数据集?
- javascript - Chrome扩展程序:防止点击内容脚本
- python - 数组中相同列表的出现次数
- docker - How to use Docker Host Service Connection in Azure Pipelines