reactjs - ReactJS、SocketIO 和 Redux - 什么是正确的设计
问题描述
大型多组件 ReactJS 应用程序与套接字 io 后端服务器集成的最佳模式是什么?
以下是一些要求
- React 应用程序必须在登录时连接到后端(使用基于 Flask 的 socket.io 实现的服务器)。注销时必须断开连接
- 连接应该从一个中心位置进行管理(因为我不希望每个组件都连接/断开与 socket-io 的连接)。这也应该是管理 socketio 连接(断开、重新连接等)生命周期的地方。
- 后端将发送异步更新(即各种组件的统计信息)。这些统计信息必须由通用 socketio 处理实例处理并推送到redux存储中。消息正文将有足够的信息来解复用消息。
- 组件本身应该(最好)不知道 socket-io,它们在 redux 状态下运行。
- 组件可以调度操作,这可能会导致发送一个 socketio 消息(到后端)。
- [我没有客户需要与另一个客户交谈的用例。]
几个问题:
- 设计这个的正确方法是什么?我应该在什么时候连接到 socket-io?
- 我有一个所有页面都使用的基本布局组件。这是连接 socket-io 调用的正确位置吗?但是,我看到每个页面都卸载/加载了这个组件。不知何故,这感觉不是正确的地方
- 我见过一些例子,每个页面都打开一个 socketio 连接。我不确定这是否是正确的模型?
解决方案
我认为您可能应该将套接字存储在Context上,以便您可以在index.js文件上创建套接字,就像我在这里所做的那样:
import React from "react";
import App from "./App";
import socketIOClient from "socket.io-client";
import { MainProvider } from "./context/MainContext.js";
const ENDPOINT = "http://127.0.0.1:1234"; //Your backend endpoint
ReactDOM.render(
<React.StrictMode>
<MainProvider value={{socket: socketIOClient(ENDPOINT)}}>
<App />
</MainProvider>
</React.StrictMode>,
document.getElementById("root")
);
然后在上下文中,您可以在任何组件中访问它,如下所示:
import React, { useContext } from 'react';
import PropTypes from 'prop-types';
import MainContext from "./context/MainContext"; //import your context here
const myComponent = props => {
const myContext = useContext(MainContext); //your context is stored in a prop
return (
<div></div>
);
};
myComponent.propTypes = {
};
export default myComponent;
最后,您可以通过调用访问组件中的套接字myContext.socket
推荐阅读
- python - 检查目标时出错:预期 activation_29 的形状为 (1,),但数组的形状为 (3,)
- matlab - 计算积分时出现“矩阵尺寸必须一致”错误
- python-3.x - 如何使用 Gmail API (python) 检索整个邮件正文
- jquery - 如何将 PDF 内容添加到使用 AJAX 和 WebAPI 发布的对象的属性中
- flutter - Flutter中如何实现浮动聊天头?
- amazon-web-services - Windows 10 上的 AWS CLI InvalidAccessKeyId
- html - css活动链接边界半径
- css - 如何在 Jumbotron Bootstrap 3 中更改字体粗细
- javascript - 汇总不排除排除的包
- bash - 期望中的变量插值