如何使用react js绘制简单的迷你图?

时间:2016-06-30 13:13:32

标签: reactjs websocket

我正在实现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逻辑以及如何绘制简单的图形?

2 个答案:

答案 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) } />;
  }
});