bindActionCreators 我们很少很少用到,一般只有在 react-redux 的 connect 实现中用到。

    他是做什么的?他通过闭包,把 dispatch 和 actionCreator 隐藏起来,让其他地方感知不到 redux 的存在。

    我们通过普通的方式来 隐藏 dispatch 和 actionCreator 试试,注意最后两行代码

    1. const reducer = combineReducers({
    2. counter: counterReducer,
    3. info: infoReducer
    4. });
    5. const store = createStore(reducer);
    6. /*返回 action 的函数就叫 actionCreator*/
    7. function increment() {
    8. return {
    9. type: 'INCREMENT'
    10. }
    11. }
    12. function setName(name) {
    13. return {
    14. type: 'SET_NAME',
    15. name: name
    16. }
    17. }
    18. const actions = {
    19. increment: function () {
    20. return store.dispatch(increment.apply(this, arguments))
    21. },
    22. setName: function () {
    23. return store.dispatch(setName.apply(this, arguments))
    24. }
    25. }
    26. /*注意:我们可以把 actions 传到任何地方去*/
    27. /*其他地方在实现自增的时候,根本不知道 dispatch,actionCreator等细节*/
    28. actions.increment(); /*自增*/
    29. actions.setName('九部威武'); /*修改 info.name*/

    我眼睛一看,这个 actions 生成的时候,好多公共代码,提取一下

    1. const actions = bindActionCreators({ increment, setName }, store.dispatch);

    来看一下 bindActionCreators 的源码,超级简单(就是生成了刚才的 actions)

    1. /*核心的代码在这里,通过闭包隐藏了 actionCreator 和 dispatch*/
    2. function bindActionCreator(actionCreator, dispatch) {
    3. return function () {
    4. return dispatch(actionCreator.apply(this, arguments))
    5. }
    6. }
    7. /* actionCreators 必须是 function 或者 object */
    8. export default function bindActionCreators(actionCreators, dispatch) {
    9. if (typeof actionCreators === 'function') {
    10. return bindActionCreator(actionCreators, dispatch)
    11. }
    12. if (typeof actionCreators !== 'object' || actionCreators === null) {
    13. throw new Error()
    14. }
    15. const keys = Object.keys(actionCreators)
    16. const boundActionCreators = {}
    17. for (let i = 0; i < keys.length; i++) {
    18. const key = keys[i]
    19. const actionCreator = actionCreators[key]
    20. if (typeof actionCreator === 'function') {
    21. boundActionCreators[key] = bindActionCreator(actionCreator, dispatch)
    22. }
    23. }
    24. return boundActionCreators
    25. }

    bindActionCreators 示例源码见 demo-8