Как динамически добавлять компоненты React из веб-сокетов

Я проработал пару руководств по интеграции Django и React и внес некоторые изменения, чтобы лучше изучить платформу. Пока что, когда страница загружается, React запрашивает Django REST API и на основе этого ввода загружает ряд компонентов City. Код выглядит следующим образом:

class CityList extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      cities: [],
      newCities: []
    };
  }

  componentDidMount() {
    axios.get("http://127.0.0.1:8000/api/").then(res => {
      this.setState({
        cities: res.data
      });
      document.body.style.background = "#131C2F";
    });
  }

  render() {
    console.info(this.state.articles);
    return (
      <div className = "row" id = "mainRow" style = {{ backgroud: "#304877" }}>
        <div className = "col-lg-9 col-sm-10" style = {{ backgroud: "#304877" }}>
          <ul className = "mainList">
            {this.state.cities.map(city => {
              return <Cities city = {city} />;
            })}
          </ul>
        </div>
        <div className = "col-lg-3 col-sm-2" style = {{ backgroud: "#304877" }}>
          <div className = "form-signin search-box" style = {{ position: "fixed" }}>
            <h1
              className = "h3 mb-3 font-weight-normal"
              style = {{ textAlign: "center", fontSize: "22px", color: "white" }}
            >
              Add location
            </h1>
            <br />

            <input
              type = "text"
              name = "location"
              id = "myLocation"
              className = "form-control"
              placeholder = "City"
            />
            <br />
            <div
              className = "btn btn-primary btn-block"
              onClick = {this.handleClick}
            >
              Add
            </div>
          </div>
        </div>
      </div>
    );
  }
}

Я попытался добавить веб-сокет, который будет выталкивать новые компоненты City из бэкэнда Django. Сокет создается:

var mySocket = new WebSocket('url to backend');

Это также работает нормально и получает объекты в формате, необходимом для заполнения компонентов City. Однако я не могу понять, как написать функцию, которая использует данные из веб-сокета, создает компонент и загружает его на страницу.

Я предполагаю, что одним из способов было бы обновить состояние компонента CityList, поэтому я добавил в состояние «newCities», но, похоже, не могу пойти дальше этого.

Любые указатели будут очень признательны :)

Пожалуйста, включите код с веб-сокетом, который не работает, чтобы кому-то было проще помочь вам с вашим вопросом. Вы можете добавить данные из ответа веб-сокета в состояние вашего компонента и использовать их в методе рендеринга компонента. Когда вы обновляете состояние, компонент автоматически перерисовывается.

Tholle 18.03.2019 00:12
Поведение ключевого слова "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) для оценки ваших знаний,...
0
1
257
1

Ответы 1

Если вы просто хотите добавлять города в текущий список, когда получаете их из сокета, то, возможно, вам не нужен отдельный массив newCities в вашем штате. Просто добавьте push или concat новые города в существующий массив cities.

Например, если ваш сокет генерирует событие newCity с одним городом в качестве данных, вы можете сделать что-то вроде этого:

mySocket.addEventListener('newCity', (event) => {
  this.setState(prevState => ({ cities: prevState.cities.push(event.data) }));
});

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