我正在实现websocket客户端 - 服务器应用程序,其中websocket服务器在节点js中实现,它正在为1234端口上的客户端连接正常工作。
在客户端,我必须在react js中实现它,因为服务器正在向连接的客户端发送消息,并且基于该消息,我必须使用反应迷你图来实现简单的图形。请指导我如何使用来自websocket的输入值绘制图表?
index.html:
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<title>React App</title>
<div id="content"></div>
<script type="text/javascript">
var content = document.getElementById('content');
var socket = new WebSocket('ws://localhost:1234','security');
socket.onopen = function () {
};
socket.onmessage = function (message) {
content.innerHTML += message.data +'<br />';
};
socket.onerror = function (error) {
console.log('WebSocket error: ' + error);
};
</script>
</head>
</html>
App.jsx:
import React from 'react';
class App extends React.Component {
render() {
return (
<div>
Hello world!!!
</div>
);
}
}
export default App;
main.js:
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App.jsx';
ReactDOM.render(<App />, document.getElementById('content'))
现在只是显示目的我在onMessage()方法中打印它。实际上我如何实现这个websocket逻辑以及如何绘制简单的图形?
答案 0 :(得分:1)
以下是使反应组件与Websockets一起使用的一个很好的解释。
https://blog.pusher.com/making-reactjs-realtime-with-websockets/
你基本上做的是在你的react组件的componentDidMount方法中绑定socket.onmessage函数。然后,每次有新消息到达时,使用setState设置组件的新状态,重新呈现组件。
答案 1 :(得分:0)
让我们从演示开始:http://jsfiddle.net/69z2wepo/47364/
由于我无法找到React Sparkline lib,我可以链接到jsfiddle,我创建了一个模拟<Sparkline>
组件,它绘制了一个简单的图形。但代码的逻辑非常简单:
const Graph = React.createClass({
getInitialState(){
return { data : [0.25,1,0.5,0.75,0.25,1,0.25,0.5,0.75,1,0.25] }
},
componentDidMount(){
// this is an "echo" websocket service
this.connection = new WebSocket('wss://echo.websocket.org');
// listen to onmessage event
this.connection.onmessage = evt => {
// add the new data point to state
this.setState({
data : this.state.data.concat([ evt.data ])
})
};
// for testing purposes: sending to the echo service which will send it back back
setInterval( _ =>{
this.connection.send( Math.random() )
}, 1000 )
},
render: function() {
// slice(-10) gives us the ten most recent data points
return <Sparkline data={ this.state.data.slice(-10) } />;
}
});