访问" getState"来自使用redux-thunk的动作创建者?

时间:2016-04-06 19:56:31

标签: javascript reactjs redux

我有一个mapDispatchToProps函数,如下所示。

export function mapDispatchToProps(dispatch, ownProps) {
  return {
    handleChangeLang: changeLocaleDispatcher(dispatch),
    handleChange: handleChangeDispatcher(dispatch),
    handleSubmit: handleSubmitDispatcher(dispatch)
  }
}

我刚刚将redux-thunk添加到了我的项目中,因此我可以从我的动作创建者处访问state(认为这是正确的术语)。

redux-thunk中的任何文档都没有概述如何从getState访问mapDispatchToProps。文档dispatch使用store.dispatch方法。

3 个答案:

答案 0 :(得分:1)

你的初始语法是错误的," hacky"例子也不是你应该怎么做。

示例如下:

import {thunkAction1, thunkAction2} from "myActions";
import {bindActionCreators} from "redux";

const mapDispatchToProps(dispatch) => {
    return {
        manuallyBoundAction : (...args) => dispatch(thunkAction1(...args)),
        autoBoundAction : bindActionCreators(thunkAction2, dispatch),
        multipleActionsTogether : bindActionCreators({thunkAction1, thunkAction2}, dispatch)
    }
};

不,getState本身无法在mapDispatchToProps内访问。它可以在thunk中使用,但不是mapDispatch

您可能需要阅读this answer on why thunks exist以及async actions上的Redux文档。

答案 1 :(得分:0)

因此,虽然我在您的问题中没有看到您当前的动作创建者,但我会假设它是ES6 / ES2015 javascript。

以下应该可以让你自由地抓住任何一个州。由于你有redux-thunk,你应该很高兴。

export function setActivity(activityName) {
  return function (dispatch, getState) {
    dispatch({
      type: SET_ACTIVITY,
      description: 'Set the name of the activity being done now',
      currentActivityName: activityName,
      currentActivityData: getState().activityStore.activities[activityName]
    });
  };
}

activityStore 与您为该特定缩减器定义的内容相同,请参见下文。

export const reducers = {
  activityStore: ActivityStore.reducer,
  someOtherStore: SomeOtherStore.reducer
};

答案 2 :(得分:-1)

Hacky修正:/

let ProvidedApp = (serverProps) => {

  let store = getStore(serverProps)

  let ConnectedApp = connect(
    mapStateToProps,
    mapDispatchToProps(store)
  )(App)

  return (
    <Provider store={store}>
      <ConnectedApp/>
    </Provider>
  )
}

export function mapDispatchToProps(store) {
  return (dispatch, ownProps) => {
    return {
      handleChangeLang: store.dispatch(changeLocaleDispatcher),
      handleChange:  store.dispatch(handleChangeDispatcher),
      handleSubmit: store.dispatch(handleSubmitDispatcher)
    }
  }
}