node.js - 使用 React 和 Socket.io 的聊天应用程序在发送过多消息后挂起

标签 node.js reactjs sockets socket.io frontend

我的基本聊天应用程序在发送大约 7 条消息后变得非常慢,尽管它在只发送几条消息时确实有效。

我在返回的组件中放置了一条打印语句。我注意到每次提交聊天消息时,打印语句的调用次数都是以前的两倍。我假设我的应用程序变慢了,因为随着我发送更多消息,不得不以指数方式多次重新渲染 DOM。

有人知道为什么会这样吗?

这是我的 React 应用

import React from 'react';
import io from "socket.io-client";
let socket = io.connect("localhost:8080");

function App() {
  const [curMessage, setMessage] = React.useState({name: "", message: ""});
  const [messageList, setList] = React.useState([]);

  socket.on("receiveMsg", message => {
    setList([...messageList, message]);
  });

  function handleTyping(e) {
    let target = e.target;
    if (target.id === "name") {
      setMessage({...curMessage, name: target.value});
    } else {
      setMessage({...curMessage, message: target.value});
    }
  }

  function handleSubmit(e) {
    e.preventDefault();
    setList([...messageList, curMessage]);
    setMessage({name: "", message: ""});
    socket.emit("message", curMessage);
  }



  return (
    <div>
      <form onSubmit={handleSubmit}>
        <input id="name" onChange={handleTyping} value={curMessage.name}></input>
        <input id="message" onChange={handleTyping} value={curMessage.message}></input>
        <button>Send Message</button>
      </form>
      <ul>
        {messageList.map(msg => {
          return <li> {msg.name} {msg.message} </li>
        })}
        {console.log("test")}
      </ul>
    </div>
  );
}

export default App;

这是我的服务器端代码(虽然我认为这段代码没问题)

const express = require("express");
const app = express();
const http = require("http").createServer(app);
const io = require("socket.io")(http);

http.listen(8080, () => console.log("Connected to Server"));

io.on("connection", socket => {
  console.log("User has connected " + socket.id);
  socket.on("message", data => {
    socket.broadcast.emit("receiveMsg", data);
  });
});

最佳答案

尝试将您的 socket.on(..) 放在 useEffect 中。也许在渲染中执行 setState 是速度变慢的原因。

useEffect(() => {
  socket.on("receiveMsg", (message) => {
    setList([...messageList, message]);
  });

  return () => {
    socket.off("receiveMsg");
  };
}, [messageList]);

关于node.js - 使用 React 和 Socket.io 的聊天应用程序在发送过多消息后挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64086890/

相关文章:

node.js - 在Cloud9 IDE中获取用户的真实IP地址

reactjs - import React 和 import { Component } 语法之间的区别

javascript - ES6+/React Native 类属性 : The first one is undefined

javascript对象数组没有改变

javascript - MongoDB javascript 摄取 JSON 字符串

node.js - 如何在 Node.js 中使用 Socket.io 从客户端发送到路由文件

php - 大约一分钟后,PHP fsockopen或Microsoft关闭连接

javascript - 如何解决TypeError : environment. teardown is not a function

c++ - 取消或只是适本地阻止套接字上的任何 future 异步操作

c++ - 如何在 C++ 中的一个应用程序中同时使用 TCP 和 UDP