总结下 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个')