react-redux 暴露出Connect 组件,和 Provider 组件,
react中数据流 都是父子传值 跨级传值 用到 React Context
自定义组件 中@connect(mapStateToProps、mapDispatchToProps)就是在自己组件外部包了一成Connect 然后Connect(通过React Content)接受到 Provider 组件的store值 的到对应的state和dispatch 然后传递给 自定义组件
mapStateToProps:调用了store.subscribe 方法,将同步数据方法(store.getSate)添加到store的Listeners方法数组中 dispatch调用改变store中currentState的值的时候 会循环调用Listeners中的方法store.getSate 重新获取store中的state值
const connect = (mapStateToProps) => (People) => {
class Connect extends Component {
static contextTypes = {
store: PropTypes.object
}
constructor () {
super()
this.state = { allProps: {} }
}
componentWillMount () {
const { store } = this.context
this.setProps();
store.subscribe(() => this.setProps());
}
setProps () {
const { store } = this.context
let stateProps = mapStateToProps(store.getState(), this.props) // 额外传入 props
this.setState({
allProps: { // 整合普通的 props 和从 state 生成的 props
...stateProps,
...this.props
}
})
}
render () {
return <People {...this.state.allProps} />
}
}
return Connect
}
React Context: 类似js 上下文 不过 是带权限的 得通过一定的规则来实现
弊端:增加了组件的耦合性 子组件必须依赖 父组件传递的 context