javascript - Socket.io 和 Jquery 附带不需要的附加数据

标签 javascript jquery reactjs socket.io

场景:

  • 当我打印出聊天消息时,它会向 msg 添加一个额外的信息。
  • 当我用控制台记录他们时,我得到了这个。 为什么它存储在状态 额外的对象值(value)?


控制台日志:

2{"message":"e"}
1{"message":"e"}
2{"message":"e"}
(2) 1{"message":"e"}
2{"message":"e"} 
(3)1{"message":"e"}

代码片段

import React, { Component } from "react";
import io from "socket.io-client";
import "../../../Chat.css";
import $ from "jquery";
var socket = io();
export default class ChatLayout extends Component {
      constructor() {
        super();
        this.state = {
          message: ""
        };
        this.onSubmit = this.onSubmit.bind(this);
        this.onChange = this.onChange.bind(this);
      }

      componentDidMount() {}

      onSubmit(e) {
        e.preventDefault();
        socket.emit("chat message", this.state.message);
        socket.on("chat message", msg => {
          console.log("1" + JSON.stringify(this.state));
          $("#messages").append($("<li>").text(msg));
        });
        console.log("2" + JSON.stringify(this.state));
      }

      onChange(e) {
        this.setState({ [e.target.name]: e.target.value });
      }

      render() {
        return (
          <div className="chat">
            <ul id="messages">
              <div />
            </ul>
            <form action="" onSubmit={this.onSubmit}>
              <textarea
                name="message"
                placeholder="Enter your message here"
                autoComplete="off"
                type="submit"
                value={this.state.message}
                onChange={this.onChange}
              />
              <input type="submit" className="btn btn-info btn-block mt-4" />
            </form>
          </div>
        );
      }
    }

最佳答案

我认为这是因为您在 onSubmit 函数中声明了 socket.on("chat message", function()) 。我想这样做会在您每次提交表单时添加某种套接字监听器,这可以解释为什么第二次收到两次消息而第三次收到三次消息。

解决方案

尝试将 socket.on 语句移到 onSubmit() 函数之外。

换句话说,把:

socket.on("chat message", msg => {
  console.log("1" + JSON.stringify(this.state));
  $("#messages").append($("<li>").text(msg));
});

在您的构造函数中或类之外。

关于javascript - Socket.io 和 Jquery 附带不需要的附加数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51778686/

相关文章:

javascript - KrakenJS 和 Adaro 或 Engine-Munger 或 Dust...(grunt build,然后 npm start)

javascript - 在按钮列表中单击的按钮下滑动 div

jquery - 将元素的字符串存储到变量中,通过 Toggle() 传递它

css - reactjs 背景图像未全屏显示

javascript - 如何在 React 中将 prop 以及 (event) 传递给 onClick 回调?

javascript - 使应用程序中加载的 iframe 显示移动网站?

javascript - 闭包有什么好处,它们通常在什么时候使用?

javascript - 单击按钮时如何启用或禁用 Highcharts 工具提示?

javascript - 如何有效地将数据存储在数组中?

javascript - Toastr 多个 div