使用ReactJS ES6实现Socket.io

时间:2015-12-27 13:10:05

标签: node.js reactjs socket.io

我无法将SocketIO客户端整合到我的项目中,因为我的项目设置是同构的。在我的基本html中包含套接字文件之后,我尝试在我的一个组件的componentdidmount中调用let socket = io();但是最初在我的控制台中记录它之后它是未定义的。当我路由到另一个组件并使用该套接字变量返回该组件时,它会填充一些数据。我想我的观点是,在我的组件中没有初始化什么套接字,似乎必须等待我如何解决这个问题?

Component.jsx

componentDidMount() {
    let socket = io();
    console.log(socket);
  }

base.html文件

<!doctype html>
<html lang="">

<head>
    <title>TITLE</title>

    META

    LINK

</head>

<div class="app">CONTENT</div>

<!-- Google Analytics: change UA-XXXXX-X to be your site's ID -->
<script>
    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
            m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
    ga('create', 'UA-XXXXX-X', 'auto');
    ga('send', 'pageview');
</script>
<script type="text/javascript" charset="utf-8" src="/assets/app.js"></script>

<script src="/socket.io/socket.io.js"></script>
<script>
        var socket = io();
</script>

</body>
</html>

这对于从服务器连接的东西来说很好用,它会发出用户正在连接并断开服务器的连接,只是客户端操作让我感到困惑。

3 个答案:

答案 0 :(得分:61)

可能还有其他解决方案,但以下内容适用于我:

1)npm安装socket client side package

2)将套接字导入到需要套接字功能的所有组件的最根组件

3)其中一个生命周期事件(constructor / componentWillMountcomponentDidMount)中的连接服务器端套接字事件侦听器

4)如果处理子组件中的某些服务器事件是有意义的,则通过props传递套接字对象

示例:

import io from 'socket.io-client'
let socket = io(`http://localhost:8000`)

class App extends Component {
  state = { data: {} }

  componentDidMount() {    
    socket.on(`server:event`, data => {
      this.setState({ data })
    })
  }

  sendMessage = message => {
    socket.emit(`client:sendMessage`, message)
  }

  render () {
    return (
      <Child 
        socket = { socket } 
        sendMessage = { this.sendMessage }
      />
    )
  }
}

答案 1 :(得分:0)

我对socket.io和React有同样的奇怪问题。我想从main.jsx文件中确定一个清晰的依赖注入行,其中包含其他组件的props。原来我只需要像这样初始化io ......

const socket = window.io();

就是这样。有效。

答案 2 :(得分:0)

您可以在组件外部实例化套接字并在组件内部使用它。像这样:

import React, { Component } from 'react'  
import io from 'socket.io-client'

var socket = io()

class MyComponent extends Component {
    componentDidMount() {
        // You can use the socket inside the componet
        socket.on('message', msg => console.log(msg))
    }
}