javascript - Socket.io 和 Jquery 带来了不需要的额外数据
问题描述
设想 :
- 当我打印出聊天消息时,它会在
msg
. - 当我控制台记录他们时,我得到了这个。为什么它在状态中存储一个额外的对象值?
控制台日志:
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>
);
}
}
解决方案
我认为那是因为您在函数socket.on("chat message", function())
内部声明了您的声明onSubmit
。我想这样做会在您每次提交表单时添加某种套接字侦听器,这将解释为什么第二次收到两次消息而第三次收到三次消息。
解决方案
尝试将socket.on
语句移到onSubmit()
函数之外。
换句话说,把:
socket.on("chat message", msg => {
console.log("1" + JSON.stringify(this.state));
$("#messages").append($("<li>").text(msg));
});
在您的构造函数中或类之外。
推荐阅读
- node.js - 在非空 MongoDB 集合中找不到任何条目
- javascript - Expressjs:按下按钮时的运行方法
- android - 在同一个布局文件中包含选项卡和 viewpager 的逻辑?
- java - 当测试预期异常时,assertEquals 不显示错误
- php - 如何在 macOS 10.14.1 Mojave 中安装带有对 php 的 freetype 支持的 GD
- python - Add one column dor each value in a list
- javascript - 将变量绑定到对象属性
- php - 如何对文本框进行分组,以便同时提交它们。使用 PHP、CodeIgniter 和 HTML
- c++ - CV_LOAD_IMAGE_GRAYSCALE 和 cvtCOLOR(..., BGR2GRAY) 之间的区别
- ruby-on-rails - 在 Rails 路由中使用 lambda 在“get”下嵌套“get”请求