首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >订阅套接字时,变量的状态为空。更新状态后,更新后不使用状态

订阅套接字时,变量的状态为空。更新状态后,更新后不使用状态
EN

Stack Overflow用户
提问于 2022-03-10 09:36:54
回答 1查看 111关注 0票数 0

我试图连接到一个套接字端点,每当用户来回发送消息时,它都会发送一个JSON对象。

我正在连接到套接字并订阅一个主题。每当收到消息时,它都需要将对象添加到状态。因为我使用useEffect连接套接字,所以首先调用它,然后使用空状态订阅套接字。因此,每当收到消息时,就会将其添加到空数组中,从而只产生一个对象。

这是我的密码

套接字代码

代码语言:javascript
复制
const [chatData,setChatData] = useState([]);

  function connect() {
    var socket = new SockJS(""); //I've connected to my backend socket
    console.log(chatData);
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
      isConnected = true;
      console.log("Connected: " + frame);
      stompClient.subscribe(
        "/topic/oneToOneChat/" + user.id,
        function (message) {
          const m = JSON.stringify(message.body);
          const socketMessage = JSON.parse(JSON.parse(m));
          chatData.unshift(socketMessage); //Adding the object to the top of the array
          setChatData([...chatData]); //This is adding the object to the empty array
        }
      );
      stompClient.subscribe("/topic/oneToOneChat/" + id, function (message) {
        const m = JSON.stringify(message.body);
        const socketMessage = JSON.parse(JSON.parse(m));
        chatData.unshift(socketMessage);
        setChatData([...chatData]);
      });
      stompClient.subscribe(
        "/topic/deleteOneToOneChat/" + id,
        function (message) {
          const m = JSON.stringify(message.body);
          const socketMessage = JSON.parse(JSON.parse(m));
          deleteMessageFromChatData(socketMessage.id);
        }
      );
      stompClient.subscribe(
        "/topic/deleteOneToOneChat/" + user.id,
        function (message) {
          const m = JSON.stringify(message.body);
          const socketMessage = JSON.parse(JSON.parse(m));
          deleteMessageFromChatData(socketMessage.id);
        }
      );
    });
  }

 useEffect(() => {
     connect();
 }, [chatData]);

chatData是我更新对象数组的状态。更新后,所有聊天都显示在我的屏幕上。但是,当我发送或接收消息时,套接字将消息对象添加到chatData并删除所有以前的消息。因为它是附加到空的chatData。

EN

回答 1

Stack Overflow用户

发布于 2022-03-10 09:43:10

我通过在套接字订阅中添加以下行来解决这个问题

代码语言:javascript
复制
setChatData((chats) => [socketMessage,...chats])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71421862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档