Сценарий:
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.info("1" + JSON.stringify(this.state));
$("#messages").append($("<li>").text(msg));
});
console.info("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>
);
}
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я предполагаю, что это потому, что ваш socket.on("chat message", function()) объявлен внутри вашей функции onSubmit. Я предполагаю, что при этом добавляется какой-то прослушиватель сокета каждый раз, когда вы отправляете форму, которая объясняет, почему во второй раз вы получаете сообщение дважды и в третий раз вы получаете сообщение три раза.
Решение
Попробуйте переместить оператор socket.on за пределы функции onSubmit().
Другими словами, поставьте:
socket.on("chat message", msg => {
console.info("1" + JSON.stringify(this.state));
$("#messages").append($("<li>").text(msg));
});
В вашем конструкторе или вне класса.
Хахаха, это именно то, что происходило. Отличный ответ, мой друг.