我已经概述了几种可能从 Web 服务访问状态的方法,但我不知道在 react-redux 应用程序中哪一种是正确的,或者下面是否列出了正确的一种。
语境:
最初,我有一个API.js
文件作为 Web 服务的基础。然后我会将它导入到我的操作文件中。这进展顺利,直到我需要从 API.js
. 我试图导入我的商店,但它返回了undefined
. 然后我意识到我有一个循环依赖:
api -> store -> reducers -> components -> actions
自定义中间件
我想知道这是否可以接受。我放弃了我的API.js
. 我使用它来自动修改具有特定操作类型的传出网络调用。这是我的中间件堆栈的样子:
const middleware = applyMiddleware(
myCustomModifyRequestMiddleware,
thunk,
. . .
myCustomModifyRequestMiddleware
基本上看起来像:
const myCustomModifyRequestMiddleware = store => next => action {
if(action.type === 'MODIFY_ME') {
//Dispatch an FSA
store.dispatch({
type: action.payload.actual_type,
payload: axios.create({ . . .
meta: action.meta
})
}
return next(action)
}
现在我的中间件中有业务逻辑!
然后我可以有一个名为API_ActionCreator
. 但是,嘿,如果我只是要使用动作创建器,为什么不...
敲它
使用 thunk 我可能只是有类似的东西API_ActionCreator.js
:
const apiActionCreator = (actual_type, url, data . . .) {
return (dispatch, store) {
//Now I can get the state...
store.getState()
//Return an FSA
return {
type: actual_type,
payload: axios.create...
现在我可以将 my 导入API_ActionCreator
到我的操作中,而无需任何循环依赖。
订阅商店?
另一种方法是让 Web 服务有状态;订阅store
或中的商店web service
,如果我在我的操作中调用我的 Web 服务时能以某种方式避免遇到循环依赖。
TLDR; 当然,这都是实验性的,尽管我能够让中间件工作。
我不知道哪一种是最可行的方法,是否有一种更 redux-ish 的方法来做到这一点?