在实践中,有几种策略可用于在 redux 基础架构中打开 socket.io:
首先,有中间件形式的现成决策,例如https://www.npmjs.com/package/redux-socket.io
其次,可以做的更简单更狡猾。在创建 redux store 和 saga 的同时,还可以创建必要的 socket.io 客户端实例,以及功能闭包的逻辑。
以下示例完全涵盖了您的情况。只需MESSAGES_MAP
使用应该映射到 Redux 操作的事件名称设置映射。
import React from 'react';
import { render } from 'react-dom';
import { Provider } from 'react-redux';
import { createStore, applyMiddleware, compose } from 'redux';
import socketIO from 'socket.io-client';
import YourRootContainter from './YourRootContainter';
const MESSAGES_MAP = {
'MESSAGE_1': 'REDUX_ACTION_1',
'MESSAGE_2': 'REDUX_ACTION_2'
};
Promise.resolve(createSagaMiddleware()).then(saga => ({
store: (compose(applyMiddleware(saga))(createStore))(
YOUR_REDUCER,
YOUR_INITIAL_STATE
),
socketClient: socketIO(YOUR_SOCKET_URL, {
path: YOUR_EXCHANGE_URL_PATH
}),
saga
})).then(({ saga, store, socketClient }) => (
Object.keys(MESSAGES_MAP).forEach(name => (
socketClient.on(name, event => store.dispatch({
type: MESSAGES_MAP[name],
payload: { ...event }
}))
)),
saga.run(YOUR_SAGA_ENTRY_POINT),
store
)).then(store => render(
(<Provider store={store}>
<YourRootContainter />
</Provider>),
document.getElementById('root')
));