当前位置: 首页 > 知识库问答 >
问题:

react和socket.io中的无限循环

许俊贤
2023-03-14

我正在尝试构建实时聊天消息。在客户端(React),每当有新用户进入聊天时,套接字的事件usuarios-conectados都会被触发(此套接字事件为我提供了当时连接的所有用户的数组)。

然后,我尝试在useState中设置该用户数组,但正因为如此,组件进入循环并不断重新渲染自己。

这似乎是问题所在,因为每当我调用useSocket,控制台时。日志(用户)不断打印连接的用户


import { useEffect, useState } from 'react'
import { io } from "socket.io-client";

export const useSockets = () => {

    const [socket, setSocket] = useState(
        io('http://localhost:8080', {
            'extraHeaders': {
                'x-token': localStorage.getItem('x-token')
            }
        })
    )

    const [users, setUsers] = useState([])

    useEffect(() => {

        socket.on('connect', () => {
            console.log('Sockets online')
        })

        socket.on('usuarios-conectados', (newUsers) => {

            setUsers(newUsers);
            console.log(users);
        })

        return () => {

            socket.on('disconnect', () => {
                console.log('Sockets offline')
            })
            socket.disconnect()
        }
    }, [])


    return [users]
}

共有2个答案

咸弘雅
2023-03-14

您不应该将IO存储在状态中,而是在上下文中调用它,例如,让我在代码中显示。

  1. 创建上下文
import React from 'react';
import io from 'socket.io-client';
        
const SOCKET_ADDR = process.env.REACT_APP_SOCKET_ADDR || '<your server>';
        
export const socket = io(SOCKET_ADDR, { withCredentials: false, transports: ['websocket'] });
        
export const SocketContext = React.createContext();
欧阳狐若
2023-03-14

您不应该将io存储在状态中,而是在您的组件中创建一个文件并导入,然后在您初始化套接字本身之后将侦听您定义的事件。让我用代码显示。

//src/utils/socket.js
import io from "socket.io-client"
export const socket = io(process.env.BACKURL);

// component.jsx
import {socket} from './utils/socket'
 const [commentData , setCommentData] = useState([]);

useEffect(() => {
   socket.on("connect_error", () => {
    console.error("socket error!");
    socket.close();
  });

  // websokcet to comments
  socket.on("load_comment", (payload) => {
    setCommentData(payload);
  });
 return () => {
 socket.close();
}
}, [])
// second useEffect to see if statesChanged
useEffect(() => {
 console.log('Changed' , commentData)
} , [commentData])
 类似资料:
  • 在连接上创建infinte循环!很奇怪,直到现在才发生。我不知道出了什么问题。我试图重建包,我复制一些代码从旧的源代码和相同的结果...

  • 我在使用useEffect时搜索了很多关于无限循环的帖子,但仍然没有找到答案 在useEffect中,我试图调用get accounts api,当然,我放置了一个空数组,因为我只希望它在渲染后运行一次。但目前我喜欢添加“addAccount”功能。因此,如果我按下add按钮,它就会发送一个post请求。这里是一个问题,我想检查值是否已更改,因此我将值放入第二个参数,即空数组,它会导致无限循环。但

  • 问题内容: 请看下面的Java 无限循环。它导致其下面的语句的编译时错误。 以下相同的无限循环可正常工作,并且不会发出任何错误,其中我只是用布尔变量替换了条件。 同样在第二种情况下,循环之后的语句显然不可访问,因为布尔变量为true,但编译器根本没有抱怨。为什么? 编辑:显然,以下版本的卡在无限循环中,但是即使循环中的条件始终存在,因此循环下面的语句也不会对该语句下的语句发出任何编译器错误,因此循

  • 问题内容: 我一直在使用React 16.7-alpha中的新钩子系统,并且当我正在处理的状态是对象或数组时陷入useEffect的无限循环中。 首先,我使用useState并使用一个空对象启动它,如下所示: 然后,在useEffect中,我再次使用setObj将其设置为空对象。作为第二个参数,我传递了[obj],希望如果对象的 内容 没有更改,它也不会更新。但是它一直在更新。我猜是因为不管内容如

  • 问题内容: 我正在使用第三方库来处理大量数据集。该过程偶尔会陷入无限循环(或被阻塞- 不知道为什么并且无法进入代码)。我想在设定的时间后消除这个问题,然后继续处理下一个案件。一个简单的例子是: processData通常最多需要1秒。我想设置一个计时器,该计时器在10秒后杀死processData() 编辑我将不胜感激代码片段(我没有在使用Thread的过程中练习过)。执行器方法看起来很有用,但我

  • 正如使用boto3完全扫描dynamoDb中所解释的,我构建了一个解决方案,使用某些条件完全扫描dynamoDb表。这是我的代码: 但是当代码被执行时,它会进入一个无限循环。这是LastEvaluatedKey每次迭代的输出: 它一直在这两对之间循环。 编辑: 我添加了do_scan方法。