【问题标题】:Use same instance of socket across React application在 React 应用程序中使用相同的套接字实例
【发布时间】:2019-03-06 03:45:55
【问题描述】:

目标是在应用启动时在 App.js 中启动一个套接字连接,然后使这个确切的套接字实例可用于其他加载了 Router 的组件。在线研究建议将套接字传递给嵌套组件,如下所示:

const socket = io();
...
render() {
return(<div className="App"><NestedComponent socket={socket} /></div>)
}

如果套接字是通过路由器传递的,这不起作用

<Route path='/somepath' socket={socket} component={SomeComponent}/>

如果我尝试在 SomeComponent 中使用套接字(例如:this.props.socket.emit('hi', {})),这会破坏应用程序,因为在 SomeComponent 中未定义套接字。

我无法找到一个可行的解决方案来通过路由器传递相同的套接字实例,或者使用 Redux 使套接字成为应用程序状态的一部分并将其提供给较低级别​​的组件。

非常感谢您对此的任何意见。

【问题讨论】:

  • 如果这个socket是单例的,不能直接导入吗?如果你真的必须对它进行单元测试,你可以模拟它。否则,为什么不使用上下文 API?

标签: javascript reactjs sockets socket.io


【解决方案1】:

您可以使用渲染方法并像这样传递套接字:

<Route path='/somepath' 
  render={(props) => (<SomeComponent socket={socket} {...props} />)} />

注意:{...props} 被传递以访问位置、历史、匹配等路由器属性。

在某些组件中:

// to access socket props
this.props.socket

所以,现在应该可以正常工作了:

this.props.socket.emit('hi', {})

【讨论】:

  • 你太棒了!非常感谢!
  • 我正在做同样的事情,但是当我尝试访问 props.socket(使用钩子)时,它说 props.socket 未定义
猜你喜欢
  • 2012-01-24
  • 2017-02-22
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 2022-01-22
相关资源
最近更新 更多