总结下 bindActionCreators(actionCreators, dispatch) 的用法:


ActionCreator

为什么需要 actionCreator:

如果我们的 action 直接可以拿到的,当然就不需要 actionCreator,我们可以直接 store.dispatch({'INCREMENT'})

但是如果我们的 action 信息是异步获取的,或者其它方法获取的话,就需要 actionCreator,感觉是废话。

actionCreator 是什么

我们直接复制文档中的概念:

一个 action creator 就是一个创建 action 的函数。action 是信息的载体,action creator 是用来创建 action 的工厂。

调用 action creator 只会产生一个 action,但是不会分发(dispatch)它。需要调用 store 的  dispatch 方法去完成分发。平时我们所说的 bound action creator(绑定行为创建器) 其实是说 调用 action   creator 并立即将结果分发给特定的 store 实例 的方法。

下面就是一个最简单的例子:

action:

{	
 type: ADD_TODO,
 text
}

action creator:

let addTodo = (text='default text') => {
    return {
        type: ADD_TODO,
        text
    }
}

分发(dispatch) action

正常的,我们分发 action 是这样的,

store.dispatch(addTodo(data));

或者,可以创建一个自动调度的 bound action creator

const boundAddTodo = text => dispatch(addTodo(text))
const boundCompleteTodo = index => dispatch(completeTodo(index))

现在,我们就可以直接调用了:

boundAddTodo(text)
boundCompleteTodo(index)

使用 bindActionCreators 创建可直接调用的 ActionCreator

通常,你应该直接在 Store 实例上调用 dispatch。如果你将 Redux 与 React 一起使用,react-redux 将为你提供调度功能,你也可以直接调用它。

bindActionCreators 的唯一用例是当你想将一些动作创建者传递给一个不知道 Redux 的组件时,你不想将 dispatch 或 Redux store 传递给它。

比如上面的两个 actionCreator,我们想在组件外直接调用它,我们可以先定义:

export const actions = bindActionCreators({
                           addTodo: boundAddTodo,
                           completeTodo: boundCompleteTodo
                       }, store.dispatch)

然后我们就可以直接在其它地方调用:

actions.addTodo('N个BUG待处理')
actions.completeTodo('已处理1个,剩余N-1个')