设置 React 组件以监听 socket.io

Posted

技术标签:

【中文标题】设置 React 组件以监听 socket.io【英文标题】:Set up React component to listen to socket.io 【发布时间】:2017-01-04 08:25:58 【问题描述】:

我希望我的 React 组件能够监听来自 socket.io 的事件。如果我的 html 文件包括:

<script src="socket.io/socket.io.js"></script>

然后组件的constructor()有:

this.socket = io(); // eslint-disable-line no-undef

HTML 文件从我的 Express 服务器中检索到正确的 socket.io 客户端代码,一切正常。

但这感觉太俗气了。我讨厌依赖全局窗口名称空间来查找 io() 函数。让 React 组件通过 socket.io 连接到服务器的最佳实践是什么?谢谢。

【问题讨论】:

不能在props中传递io函数吗?然后在componentDidMount 期间连接 这将有助于测试,因为您可以传入您控制的模拟 io 函数。 【参考方案1】:

我会在所需的事件回调上创建componentWillMountsetState 上的套接字。

【讨论】:

【参考方案2】:

如果您使用的是 Webpack 或 Browserify 之类的打包工具,则可以使用 socket.io-client

例如:

const io = require('socket.io-client');

class MyComponent extends React.Component 
  constructor(...args) 
    super(...args);
    this.socket = io();
  
  ...

【讨论】:

是的,这很好用! @martriay 建议使用生命周期方法 (componentWillMount) 可以更精细地控制套接字何时连接/断开连接。谢谢!【参考方案3】:

感谢分享。我使用了 componentWillMount 方法。我还添加了连接检测:

componentWillMount() 
  const socket = io(uri)

  socket.on('update', (data) => 
    this.setState( data, connected: true )
  );

  socket.on('disconnect', () => 
    this.setState( connected: false )
  );

  socket.on('reconnect', () => 
    this.setState( connected: true )
  );

【讨论】:

以上是关于设置 React 组件以监听 socket.io的主要内容,如果未能解决你的问题,请参考以下文章

react native 怎么嵌套循环生成组件

react native 怎么实现一个时间下拉框

react native 怎么将点击事件传到另一个组件

react-ace无法滚动

另一个组件如何在 react/redux 中监听另一个组件的动作?

在 React 功能组件中使用 ref 添加测试鼠标事件监听器