3

我正在使用 redux-loop 从我的减速器中调用动作创建者。这通常工作得很好。

但是,我也在为我的一些动作创建者使用 thunk。如果我采用常规动作创建器并将其转换为 thunk,则它不再可用于 redux-loop。

有没有办法从 reducer 中的 redux-loop 调用 thunk?

4

2 回答 2

0

我建议您在增强器applyMiddleware之前通过。install

createStore(reducer, initialState, compose(
  applyMiddleware(thunk),
  install()
));

applyMiddelwarestore.dispatch()将在 redux-loop 尝试分发它们之前捕获传递给它们的动作。现在对于 redux-loop 的下一个版本,我计划install()在应用它自己的修改之前接受商店的其他增强器,这样这最终不会成为问题。

于 2016-06-27T01:24:01.110 回答
0

我没有按原样结合 redux-loop 和 redux-thunk。问题是,如果您applyMiddleware(thunk)先调用 redux-loop install(),然后调用 redux-loop,则 thunk 调度的操作将不会评估其效果(因为dispatch中间件传递给 thunk 还没有被 redux-loop 增强);而如果你交换两者,效果将无法调度 thunk(因为dispatchredux-loop 用于效果的版本没有通过 thunk 中间件增强)。

为了解决这个问题,我需要编写以下非常 hacky 的商店增强器:

import { applyMiddleware, compose } from 'redux'
import { install } from 'redux-loop'

export default function loopWithThunk(createStore) {
  let enhancedStore

  const storeSaver = (createStore) => (reducer, initialState) => {
    enhancedStore = createStore(reducer, initialState)
    return enhancedStore
  }

  const thunkMiddleware = () => next => action => {
    return (typeof action === 'function')
      ? action(enhancedStore.dispatch, enhancedStore.getState)
      : next(action)
  }

  return compose(
    storeSaver,
    install(),
    applyMiddleware(thunkMiddleware)
  )(createStore)
}

你可以像这样使用它:

const store = createStore(reducer, loopWithThunk)
于 2016-12-09T17:22:38.923 回答