【问题标题】:ReactJS and Socket.io : state is reseted to initial value after receiving a new message from websocket serverReactJS 和 Socket.io:从 websocket 服务器接收到新消息后,状态被重置为初始值
【发布时间】:2020-07-11 13:08:19
【问题描述】:

我使用 reactJS 和 socket.io 为 webSocket 创建了一个简单的聊天应用程序,但是当我从服务器收到一条新消息以将其添加到消息数组状态时,被重置为初始值,它是一个空数组:

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

let socket;

export default () => {
  const [messages,setMessages]=useState([]);

  useEffect(() => {
    socket = socketIOClient("https://localhost:5000");;
    
    socket.on("resp-chat-user",  data => {
        setMessages([{
            message:data.message,
          }]);;
    })
    return () => socket.close();  
  }, []);


  const SendMessage=(msg)=>{
    if(msg && msg!="")
    {
      socket.emit("req-chat-user", {
        message:msg,
        to: SOCKET_ID
      });
      setMessages([...messages,{
        message:msg
      }])
    }
  }

  return (
      <>
    <ul>
        {messages.map(msg=>(
            <li>{msg}</li>
        ))}
    </ul>
    <button type="submit" onClick={()=>SendMessage("HOLA")}>send</button>
    </>
  );
};

【问题讨论】:

    标签: javascript reactjs web socket.io state


    【解决方案1】:

    我在套接字监听器中更新状态的方式是错误的,我应该使用:

       setMessages(messages => [ ...messages, {
          type:"other",
          message:data.message,
        } ]);
    

      setMessages([ ...messages, {
          type:"other",
          message:data.message,
        } ]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 2013-11-12
      • 2019-09-22
      • 2017-04-22
      • 1970-01-01
      • 2019-08-08
      相关资源
      最近更新 更多