Turns an object whose values are action creators, into an object with the same keys, but with every action creator wrapped into a dispatch call so they may be invoked directly.
接口
bindActionCreators(actionCreators, dispatch)
- actionCreators (Function | Object):
action creator
函数,或者键值是action creators
的对象。 - dispatch (Function):
dispatch action
的函数。 - return (Function | Object): 返回一个
dispatcher
函数或者对象,对象的每个属性值都是一个dispatcher
, 即可以dispatch action 的函数
理解
bindActionCreators
文档里是这么说的:把 action creators
转换成有相同 keys
的对象,并把每个 action creator
使用 dispatch
包围起来,这样可以直接调用它们。
这种说法听起来很绕口,先看个例子:
var addTodo = todo => ({ |
这是一个很常见的 redux 的例子,我们触发 ADD_TODO
通过 store.dispatch(addTodo("To read."))
,bindActionCreators
实际上就是对这个过程做了处理:
// 单独为每个action创建: |
这个时候可以通过 addTodoDispatcher("To read.")
或者 todoDispatchers.addTodo("To read.")
触发这个 action。
看起来这个只是省略了一个dispatch调用的代码,官方文档是这么说明的:
The only use case for
bindActionCreators
is when you want to pass someaction creators
down to a component that isn’t aware of Redux, and you don’t want to passdispatch
or theRedux store
to it.
(惟一使用bindActionCreators
的场景是当你需要把action creator
往下传到一个组件上,却不想让这个组件觉察到Redux
的存在,而且不希望把Redux store
或dispatch
传给它。)
也就是说它的主要应用场景是对某个组件隐藏 redux 的存在:
// 不使用 bindActionCreators |
源码注释
去除参数类型检查相关的一些代码后源代码如下:
export default function bindActionCreators(actionCreators, dispatch) { |
代码很简单,如果传递的 actionCreators
的类型是函数,则返回内容是一个 dispatcher
,即: (...args) => dispatch(actionCreator(...args))
,如果传递 actionCreators 的类型是一个对象,则返回一个相似结构的对象,只不过对象的每个属性值都是 dispatcher
。
简单来说,如果 actionCreators
是 addTodo 返回值为 todo => dispatch(addTodo(todo)), 如果:
// actionCreators 类型是函数 |
相关
Redux
源码阅读笔记:
- createStore.js 源码阅读笔记
- combineReducers.js 源码阅读笔记
- bindActionCreators.js 源码阅读笔记
- applyMiddleware.js 源码阅读笔记
- compose.js 源码阅读笔记
参考
本文阅读代码版本 3.5.2