Нежелательные дополнительные данные поступают с 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.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>
        );
      }
    }
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что это потому, что ваш 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));
});

В вашем конструкторе или вне класса.

Хахаха, это именно то, что происходило. Отличный ответ, мой друг.

Snoopy 10.08.2018 06:10

Другие вопросы по теме