#javascript #django #reactjs #websocket
#javascript #django #reactjs #websocket
Вопрос:
Я работал над несколькими руководствами по интеграции 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.log(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. Однако я не могу понять, как написать функцию, которая использует данные из websocket, создает компонент и загружает его на страницу.
Я предполагаю, что одним из способов было бы обновить состояние компонента cityList, именно поэтому я добавил ‘newCities’ в состояние, но, похоже, дальше этого дело не идет.
Любые указатели были бы очень признательны 🙂
Комментарии:
1. Пожалуйста, включите в websocket код, который не работает, чтобы кому-то было проще помочь вам с вашим вопросом. Вы могли бы добавить данные из ответа websocket в состояние вашего компонента и использовать это в методе визуализации компонента. При обновлении состояния компонент будет повторно отображаться автоматически.
Ответ №1:
Если вы просто хотите добавлять города в текущий список, когда получаете их из сокета, то, возможно, вам не нужен отдельный newCities
массив в вашем штате. Просто push
или concat
новые города в существующий cities
массив.
Например, если ваш сокет выдает newCity
событие с одним городом в качестве данных, вы могли бы сделать что-то вроде этого:
mySocket.addEventListener('newCity', (event) => {
this.setState(prevState => ({ cities: prevState.cities.push(event.data) }));
});