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
bindActionCreatorsis when you want to pass someaction creatorsdown to a component that isn’t aware of Redux, and you don’t want to passdispatchor theRedux storeto 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