Redux:如何将动作创建者编译成一个动作创建者表?

时间:2017-02-01 02:51:19

标签: javascript reactjs redux react-jsx

对于每个组件,我都有一个名为actions.js的动作创建者文件。在ComponentOne中,我有:

let actions = {
  logSaying() {
    console.log("Hi there");
  }
}

export default actions

然后我有一个主要的动作创建者文件,并尝试将所有动作放在一起,如下所示:

import componentOneActions from './ComponentOne/actions'

let actions = {
  componentOneActions,
  //componentTwoActions,
  //etc.
}

export default actions

并将动作传递给主动作创建者表单中的所有组件:

import actions from './actions'

...

function mapDispatchToProps(dispatch) {
  return {
    actions: bindActionCreators(actions, dispatch)
  }
}

但是当我尝试console.log()时,没有任何行动被传下来。为什么不传递它,我如何形成一个动作创作者表?实际上有更好的方法吗?

提前感谢您,并将提出/接受答复。

3 个答案:

答案 0 :(得分:0)

<强>更新

以前的答案是错误的。

也许您以错误的方式使用actions

document开始,bindActionCreators(actionCreators, dispatch)接受第一个参数actionCreators

actionCreators是一个像以下的对象:

function addTodo(text) {
  return {
    type: ADD_TODO,
    text
  }
}

http://redux.js.org/docs/basics/Actions.html#action-creators

因此,actions并非actionCreators

您应该将console.log()放在reducer中,并将actions简单对象作为文档显示。

function todoApp(state = initialState, action) {
  switch (action.type) {
    case ADD_TODO:
      console.log();
      return {}    
    default:
      return state
  }
}

http://redux.js.org/docs/basics/Reducers.html#handling-more-actions

答案 1 :(得分:0)

不是componentOneActions功能列表?所以你想使用spread syntax

来展平它们

let actions = { ...componentOneActions, //...componentTwoActions, //etc. }

注意,在One和Two中使用相同的函数名称只会给出该名称的最后一个给定函数

答案 2 :(得分:0)

bindActionCreators()期望绑定一系列动作函数。您传递的对象不是数组。尝试在对象上的每个操作数组上运行bindActionCreators

function mapDispatchToProps(dispatch) {
  const keys = Object.keys(actions);
  const mappedActions = {}
  for (let i = 0; i < keys.length; i++) {
      const key = keys[i];
      mappedActions[key] = bindActionCreators(actions[key], dispatch)
  }
  return {
    actions: mappedActions
  }
}
相关问题