SuperAPI AI 工具集

data-client-manager

数据与分析

查看项目

更新于 10-16 03:31

技能介绍

用途

@data-client Managers 是处理全局副作用的单例组件,可以理解为中央数据存储的 useEffect()。它们通过 Controller 与存储交互,redux 中间件在响应 action 时运行。

主要能力

每个 Manager 应遵循单一职责原则,只处理一个关注点。建议组合多个小型 Manager(如传输、订阅、日志、认证),而不是使用一个大型 Manager。

Manager 支持多种用例:

  • 记录 action/状态日志:在 await next(action) 前后进行日志记录
  • 错误报告/监控(如 Sentry):通过 SET_RESPONSE 结合 action.error
  • 分析/指标(fetch 计时):通过 FETCH action 的 action.meta.promise
  • 变更时的 Toast 通知:通过 SET_RESPONSE 结合 action.endpoint.sideEffect
  • 窗口聚焦/网络重连时重新拉取:在 init()/cleanup() 中通过事件监听器调用 controller.expireAll()
  • 跨标签页同步:使用 BroadcastChannel + controller.expireAll()
  • 离线持久化(IndexedDB):对 controller.getState() 进行防抖 IndexedDB 写入(丢弃乐观更新,因其不可克隆);通过 DataProvider initialState 恢复。切勿使用 localStorage(会阻塞)
  • WebSocket/SSE 推送流:收到消息时调用 controller.set();在 init() 中连接,在 cleanup() 中关闭
  • 轮询/间隔更新(ticker):setInterval + controller.set()
  • 自定义传输订阅:消费 SUBSCRIBE/UNSUBSCRIBE 而不调用 next
  • 认证:401 时登出,取消认证时重置存储:handleLogout(controller) + controller.resetEntireStore()

使用方式

Manager 接口包含 middleware 和 cleanup 方法。Controller 提供派发器:fetch()、fetchIfStale()、expireAll()、invalidate()、invalidateAll()、setResponse()、set()、setError()、resetEntireStore()、subscribe()、unsubscribe()。同时提供数据访问器:getResponse()、getState()、get()、getError()、snapshot()。

比较 action.type 时始终使用 actionTypes 成员。actionTypes 包含:FETCH、SET、SET_RESPONSE、RESET、SUBSCRIBE、UNSUBSCRIBE、INVALIDATE、INVALIDATEALL、EXPIREALL。

使用示例:

import { DataProvider, getDefaultManagers } from '@data-client/react';
import ReactDOM from 'react-dom';

const managers = [...getDefaultManagers(), new MyManager()];

ReactDOM.createRoot(document.body).render(
  <DataProvider managers={managers}>
    <App />
  </DataProvider>,
);

适用场景

适用于需要全局副作用管理的 React 应用,包括实时数据推送、离线持久化、跨标签页同步、认证处理、日志监控等。

限制

离线持久化时不能使用 localStorage(会阻塞),应使用 IndexedDB。乐观更新不可克隆,持久化时需丢弃。具体 API 细节和更多示例需参考官方文档中的 references 目录(Manager、Actions、Controller、LogoutManager、getDefaultManagers、managers)。