通过道具 React 将 WS 连接传递给孩子

Posted

技术标签:

【中文标题】通过道具 React 将 WS 连接传递给孩子【英文标题】:Passing WS connection down to children via props React 【发布时间】:2019-03-11 19:11:46 【问题描述】:

我在后端 php 服务器上使用 Ratchet 来运行我的 websocket,并且我使用 React 作为前端。

我的套接字打开了,我可以毫无问题地通过 JS 连接。

我遇到的问题是我似乎无法将 websocket 连接传递给任何子组件。

例如,我有一个包含 3 个子组件的聊天组件:

Main(整个事物的包装)、Closed(弹出聊天框的关闭状态)、Open(显示所有消息等)和Input(处理新消息的表单输入部分)消息)。

初始化 websocket 最合乎逻辑的位置是在 Main 组件中,所以我这样做,然后将连接传递给 Open 子组件:

componentDidMount() 
  this._isMounted = true;
  this.openWebsocket();


openWebsocket = () => 
  this.conn = new WebSocket('ws://localhost:8080');
  this.conn.onopen = () => 
    console.log('Connected!');
  ;

  this.conn.onmessage = e => 
    console.log(e.data);
  ;
;

......

<Open
   conn=this.conn
/>

然后在Open 中,我将它传递给Input 组件(它是Open 的子组件):

<Input conn=this.props.conn />

......

Open.propTypes = 
  conn: PropTypes.func.isRequired

终于在Input我尝试使用它了:

this.props.conn.send(this.state.msg);

......

Input.propTypes = 
  conn: PropTypes.func.isRequired

而且它会引发错误...

如果我尝试要求 conn 作为 func PropType,(如上),它表示提供了一个对象。如果我需要 conn 作为 object 什么都不会发生。没有错误,但 conn.send 函数显然没有被调用。

接下来我尝试将.send 函数作为道具传递:

<Open
   conn=this.conn.send
/>

但是会抛出 Illegal invocation 错误!

那么如何将 websocket 连接传递给 React 中的子组件?

【问题讨论】:

哇!证明在 SO 上提出问题有时会导致您看到自己犯的错误!当然,我没有从 Input .send 看到控制台中的任何内容,因为我没有在任何地方回显它!仅在 Main 组件中的 ComponentDidMount 上调用 OpenSocket(它正在被回显的地方)。嗬!所以它按预期工作。道歉! 如果您解决了您的问题,请将其发布为答案 :) 【参考方案1】:

答案很简单,当我重新阅读我的问题时,当答案突然出现时,我觉得有点傻。

基本上一切都按预期工作,只是为了记录,Proptype 最肯定是object。我只是没有在前端代码的任何地方阅读我发送回客户端的响应。 onmessage 是缺失的链接。在我的情况下,我试图检测客户端是否在输入框中输入,这将更新组件的状态并将其传递给相关的子组件。我也在此处使用setTimeout 在 3 秒后清除状态。 也不要忘记JSON.parse websocket 的回复。

this.conn.onmessage = e => 
  if (e.data) 
    let data = JSON.parse(e.data);
    if (data.action === 'typing') 
      this.setState(
        isTyping: data.msg
      );
      setTimeout(this.clearIsTyping, 3000);
    
  
;

clearIsTyping = () => 
  this.setState(
    isTyping: ''
  );
;

【讨论】:

我收到此错误:“DataCloneError:无法在‘历史’上执行‘pushState’:无法克隆 WebSocket 对象。”你能帮忙吗?

以上是关于通过道具 React 将 WS 连接传递给孩子的主要内容,如果未能解决你的问题,请参考以下文章

使用 React 钩子,我如何更新通过道具传递给孩子的对象?

如何通过道具异步传递道具给孩子?

在 React TS 中将道具传递给孩子时出错

页面未呈现;在 react-router-dom 中使用受保护的路由将道具传递给孩子时

Vue - 将方法作为道具传递给孩子

将回调函数作为道具传递给孩子