我正在设计一个使用 Redux 作为状态存储的 React 网站,主要是向用户显示当前项目的数量,使用实时更新来使用 SignalR 更新项目数量。
我想要这样做的方法是让 SignalR 发送项目更新消息以在您连接到服务器集线器时初始化起始人口,以及随着时间的推移通过相同的消息类型进行更新。我会有一个函数,它接受 SignalR 消息并将其转换为 Redux 操作并分派到 Redux 存储,然后使用该操作更新状态,然后更新 UI。
所以这个想法是
1) 连接到 SignalR 服务器集线器,为 ItemUpdate 消息设置客户端处理函数
2) 当服务器从客户端接收到 Connect() 时,它会为种群中的所有当前项目发送 ItemUpdate 消息
3) 客户端从 SignalR 接收这些消息,转换为动作并分派到 Redux 存储
4)Redux根据新的item信息更新store,UI显示出来
5) Server 意识到一个 item 已经添加或更新,并发送一个新的 ItemUpdate 消息给客户端进行更新
6) 重复
但是,我不确定应该将集线器单例放在何处,因为这似乎与 React/Redux 设计背道而驰。有人可以建议最好的方法吗?
我的主要应用
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import App from './App';
import './index.css';
import registerServiceWorker from './registerServiceWorker';
import 'rxjs';
import store from './store/index';
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root') as HTMLElement
);
registerServiceWorker();
我的商店创建文件
import { createStore, applyMiddleware } from 'redux';
import rootReducer from '../reducers/index';
import signalRMiddleware from '../signalr/middleware';
const store = createStore(rootReducer, applyMiddleware(signalRMiddleware));
export default store;
我的出站 SignalR 消息到服务器的中间件(注释掉,因为我无权访问集线器对象,我需要它来工作
export default function signalRMiddleware(store: any) {
return (next: any) => (action: any) => {
if (action.signalR) {
switch (action.type) {
default:
{
//const myCurrentState = store.getState().objectWithinState;
//_hub.server.methodOnTheServer2(action.type, myCurrentState);
}
}
}
return next(action);
}
}
现在对于传入的消息......这是我从在线示例中获得的signalR启动函数的外壳 - 尚未实现,因为我还没有集线器和连接并且不确定它应该去哪里
export function signalRStart(store: any, callback: Function) {
_hub = $.connection.myHubName;
_hub.client.firstClientFunction = (p1: any) => {
store.dispatch({ type: "SERVER_CALLED_ME", a: p1 });
}
_hub.client.secondClientFunction = (p1: string, p2: string) => {
store.dispatch({ type: "SERVER_CALLED_ME_2", value: p1 + p2 });
}
}
$.connection.hub.start(() => callback());
}
这是网站上给出的示例,我找到了将所有代码联系在一起的代码,但是我没有看到它如何像在我的主索引页面中那样与 React/Redux 集成,我必须将创建的商店传递给提供者组件,因此我不能将集线器创建放在此下方,因为您需要传递到商店创建中的信号器中间件组件的集线器
let _hub;
let store = createStore(
todoApp,
// applyMiddleware() tells createStore() how to handle middleware
applyMiddleware(signalRMiddleware)
)
// Make sure signalr is connected
signalRStart(store, () => {
render((...),
document.getElementById("app-container"));
});
有人可以建议将 SignalR 集成到我的 React/Redux 应用程序的最佳方式吗?