目前版本的 connect
是达不到这个效果的,我们需要改进它。
想一下,既然可以通过给 connect
函数传入 mapStateToProps
来告诉它如何获取、整合状态,我们也可以想到,可以给它传入另外一个参数来告诉它我们的组件需要如何触发 dispatch
。我们把这个参数叫 mapDispatchToProps
:
调整 connect
让它能接受这样的 mapDispatchToProps
:
在 _updateProps
内部,我们把store.dispatch
作为参数传给 mapDispatchToProps
,它会返回一个对象 dispatchProps
。接着把 stateProps
、、this.props
三者合并到 this.state.allProps
里面去,这三者的内容都会在 render
函数内全部传给被包装的组件。
这时候我们就可以重构 ThemeSwitch
,让它摆脱 store.dispatch
:
光看 ThemeSwitch
内部,是非常清爽干净的,只依赖外界传进来的 themeColor
和 onSwitchColor
。但是 ThemeSwitch
内部并不知道这两个参数其实都是我们去 里面取的,它是 Dumb 的。这时候这三个组件的重构都已经完成了,代码大大减少、不依赖 context,并且功能和原来一样。