Типа такого:
class WS extends React.Component {
constructor(props) {
super(props);
this.state = { messages: [] };
this.ws = new WebSocket("ws://api...");
}
componentDidMount() {
this.ws.onmessage = responce => this.setState({ ...this.state, messages: [ ...this.state.messages, responce.data ] });
}
componentWillUnmount() {
this.ws.close();
}
}
или на хуках
import React, { useEffect, useState } from 'react';
function ws() {
const [message, setMessages] = useState([]);
useEffect(() => {
const ws = new WebSocket("ws://api...");
ws.onmessage = responce => this.setState({ ...this.state, messages: [ ...this.state.messages, responce.data ] });
return () => ws.close();
}, []);
}
Как можно заметить, на хуках логика не размазана по всему компоненту, а находится в одном месте.
А еще лучше обернуть все это в React Context и подписываться на него в нужных компонентах через useContext (или Consumers). Тогда и очередь сообщений модно копить со всеми нужными мета-данными (например, временем получения).