将 socket.io 与 redux 结合使用

2024-02-11

这是我第一次使用socket.io在生产中。我在用React + Redux。我最近集成了socket.io使用 redux 及其工作正常,但我不确定这是否是实现我所做的事情的最佳方法。因为我还没有找到带有 redux 的 socket.io 的任何正确实现,所以如果我可以改进它,我需要一些帮助/建议。

因此,对于初学者来说,我设置了一项用于管理整个应用程序中的套接字的服务:

Socket.js

import isEmpty from 'lodash/isEmpty';
import io from 'socket.io-client';
import storage from '../storage';

/* eslint-disable no-use-before-define */

const Socket = {
  connect,
  emit,
  on,
  removeListener,
  socket: null
};

/* eslint-enable no-use-before-define */

function connect() {
  const hasAuthenticated = !isEmpty(storage.get('user'));
  if (hasAuthenticated) {
    // Setup a server for testing.
    Socket.socket = io.connect('http://localhost:3000', { reconnect: true });
  }
}

connect();

function on(eventName, callback) {
  if (Socket.socket) {
    Socket.socket.on(eventName, data => {
      callback(data);
    });
  }
}

function emit(eventName, data) {
  if (Socket.socket) {
    Socket.socket.emit(eventName, data);
  }
}

function removeListener(eventName) {
  if (Socket.socket) {
    Socket.socket.removeListener(eventName);
  }
}

export default Socket;

我只用过一个页面,当然还会有更多页面。我对该页面的 redux 组成是:

仪表板.jsx

componentWillMount() {
    this.props.alertViolations(); // Action
  }

  componentWillUnmount() {
    this.props.unsubscribeViolations(); // Action
  }

Actions.js

export function alertViolations() {
  return dispatch => {
    Socket.on('violations', violation => {
      dispatch(actions.updateViolations(violation));
    });
  };
}

export function unsubscribeViolations() {
  Socket.removeListener('violations');
  return dispatch => {
    dispatch(actions.removeViolationsListener());
  };
}

它工作正常。卸载后,它会停止监听我在服务器上的发射功能。如果我能得到一些关于以下方面的建议,我将非常感激:

  • 我是否需要设置一个中间件来更好地管理套接字 和抽象的方式?
  • 有没有更好的方法来使用 redux 管理套接字?
  • 我怎样才能使用内置的connect and disconnect功能?
  • 我处理的方式是仅在用户进行身份验证时才建立连接,这样可以吗?或者还有更好的方法来处理这个问题吗?
  • 哦,还有,如果我想在注销时删除连接?我是否只需从所有方法中删除侦听器,或者我可以在注销操作中使用断开连接功能吗?

多谢。如果我在解释中遗漏了任何内容,请告诉我。


中间件是持久连接最常见的地方,例如 Redux 应用程序中的 websocket。已经有大量现有的 Redux+websocket 集成库 - 请参阅我的列表:https://github.com/markerikson/redux-ecosystem-links/blob/master/middleware.md#sockets-and-adapters https://github.com/markerikson/redux-ecosystem-links/blob/master/middleware.md#sockets-and-adapters。您也许可以按原样使用其中一些,或者将它们用作您自己的实现的示例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 socket.io 与 redux 结合使用 的相关文章

  • 无法从 Twin.macro 中的 Prop 获取值

    您可以在这里查看我正在尝试执行的操作的示例 https codesandbox io s vibrant leaf qj8vz https codesandbox io s vibrant leaf qj8vz 注意 这个特定的例子使用双宏
  • React TypeError:x 不是函数

    我在子组件中从父组件调用函数 booksRefresh 但出现错误 类型错误 booksRefresh 不是函数 我不知道为什么 因为 booksRefresh 是一个函数 有人可以帮我解释为什么会出现这个错误吗 这是我的代码 import
  • Enzyme - 测试嵌套组件是否正确呈现

    我正在尝试测试当通过简单的布尔值更新状态时 在父组件中其子组件是否正确呈现 在父组件下面 class Parent extends Component render const isReady this state const props
  • 在 React JSX 中返回配对元素

    问题 在 React 中 您希望通过映射数组来创建 DOM 结构 但数组中的每个项目应返回 2 个元素 例如 import React from react import from lodash let Component React ex
  • Redux如何处理reducer中的错误

    我不确定如何处理 redux 减速器中的错误 当我的 API 获取返回数据时 我需要转换其结构并检查结果数据上设置的各种属性 但是 我不能在减速器中抛出错误 因为 redux 至少需要返回之前的状态 我该如何处理这个问题 注意 我正在使用反
  • 我可以关闭 create-react-app 分块机制吗?

    我正在使用以下命令设置我的 React 应用程序项目create react app 我想知道是否有一种方法可以关闭内置于反应脚本中的分块机制 问题是我需要修复在构建中创建的包的名称 可以通过扩展您的 CRA 来完成react app re
  • 将实时流音频从 NodeJS 服务器获取到客户端

    我需要从 1 个客户端到服务器到多个侦听器客户端的实时实时音频流 目前 我正在从客户端进行录音 并通过 socket io 将音频流式传输到服务器 服务器接收此数据 并且必须将音频流式传输 也通过 socket io 到想要收听此流的客户端
  • 如何判断网站是否使用 next.js?

    很容易判断一个网站是否使用 ReactJS 通过使用反应开发者工具 https chrome google com webstore detail react developer tools fmkadmapgofadopljbjfkapd
  • Permissions-Policy 标头错误:无法识别的功能:“interest-cohort”

    我才刚刚开始反应 我的页面在本地主机上运行良好 现在我正尝试在 github 上托管我的页面 我使用了 npm run deploy 并托管 这是我的 package json 现在 当我尝试访问我的页面时 我遇到了错误 第一个警告最让我担
  • React Hooks 常量组件与功能组件

    我理解函数组件和类组件之间的区别 但是 const 组件和函数组件之间有什么区别 e g const Home gt return div Home div To function Home return div Home div 两者都可
  • Socket.io、集群、快速和同步事件

    1周以来我遇到了一个大问题 我尝试将实际在单核上运行的 node JS 项目转换为具有集群的多核 对于 websockets 目前 我对事件没有任何问题 但是 对于 xhr polling 或 jsonp polling 我在集群模式下使用
  • 使用 Redux React Native:状态更改未显示在控制台中

    当我把console log test 我的减速器中的语句 当调用操作时我可以在控制台中看到它们 但我没有在控制台中看到 redux NEXT STATE PREV STATE 内容 有什么基本的东西我可能会错过吗 在下面的代码中 我并没有
  • Facebook 登录无法在移动浏览器中使用

    我使用 react facebook login 在我的网站中实现了 facebook 登录module https github com keppelen react facebook login 我在 ComponentDidMount
  • React JS“this”没有按预期工作

    我有下面的代码 save function var this this console log this refs itemText this setState isEditing false function console log In
  • 类型错误:未定义不是对象(评估“store.getState”)

    我正在关注让我们构建 使用 React Native Redux 的加密货币原生移动应用程序 https medium com react native training bitcoin ripple ethereum price chec
  • 如何将react-alert与定义为ES6类的React组件一起使用

    我正在尝试使用https www npmjs com package react alert https www npmjs com package react alert在我的项目中 但是为声明为函数的 React 组件提供了示例 但我的
  • 在 React 中过滤数据的最佳方法是什么?

    我正在建立该国餐馆的目录 该 API 返回一组对象 每个对象都包含诸如restaurantName restaurantLocation restaurantPriceRange 等字段 我想创建一个过滤组件 它将餐厅数组减少到仅包含那些符
  • Typescript:如何在 Redux 中输入 Dispatch

    例如我想删除dispatch any here export const fetchAllAssets gt dispatch any gt dispatch actionGetAllAssets return fetchAll getPr
  • 我想在使用 Jest Snapshots 时获得图像文件名/路径

    我已经开始使用Jest https facebook github io jest 在一个新项目中有很多 我现在正在使用Snapshot https facebook github io jest docs tutorial react h
  • 有条件地使用 Node.js 提供两个 React 构建

    我有两个基于设备向客户端提供服务的 React 应用程序 我使用 Node js 和 Express 来实现这一点 我借了static资产处理部分来自这个问题在这里 https stackoverflow com questions 644

随机推荐