【发布时间】: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(它正在被回显的地方)。嗬!所以它按预期工作。道歉!
-
如果您解决了您的问题,请将其发布为答案 :)
标签: javascript reactjs websocket ratchet