React 之 connect 组件
一、connect 用法
作用:连接 React
组件与 Redux store
connect([mapStateToProps], [mapDispatchToProps], [mergeProps],[options])
// 这个函数允许我们将 store 中的数据作为 props 绑定到组件上 const mapStateToProps = (state) => { return { count: state.count } }
- 这个函数的第一个参数就是
Redux
的store
,我们从中摘取了count
属性。你不必将state
中的数据原封不动地传入组件,可以根据state
中的数据,动态地输出组件需要的(最小)属性 - 函数的第二个参数
ownProps
,是组件自己的props
当 state
变化,或者 ownProps
变化的时候, mapStateToProps
都会被调用,计算出一个新的 stateProps
,(在与 ownProps merge
后)更新给组件
mapDispatchToProps(dispatch, ownProps): dispatchProps
connect
的第二个参数是 mapDispatchToProps
,它的功能是,将 action
作为 props
绑定到组件上,也会成为 MyComp
的 props
二、原理解析
首先 connect
之所以会成功,是因为 Provider
组件
- 在原应用组件上包裹一层,使原来整个应用成为
Provider
的子组件 - 接收
Redux
的store
作为props
,通过context
对象传递给子孙组件上的connect
connect 做了些什么
它真正连接 Redux
和 React
,它包在我们的容器组件的外一层,它接收上面 Provider
提供的 store
里面的 state
和 dispatch
,传给一个构造函数,返回一个对象,以属性形式传给我们的容器组件
三、源码
connect
是一个高阶函数,首先传入 mapStateToProps
、 mapDispatchToProps
,然后返回一个生产 Component
的函数( wrapWithConnect
),然后再将真正的 Component
作为参数传入 wrapWithConnect
,这样就生产出一个经过包裹的 Connect
组件,该组件具有如下特点
- 通过
props.store
获取祖先Component
的store props
包括stateProps
、dispatchProps
、parentProps
,合并在一起得到nextState
,作为props
传给真正的Component
componentDidMount
时,添加事件this.store.subscribe(this.handleChange)
,实现页面交互shouldComponentUpdate
时判断是否有避免进行渲染,提升页面性能,并得到nextState
componentWillUnmount
时移除注册的事件this.handleChange
// 主要逻辑 export default function connect(mapStateToProps, mapDispatchToProps, mergeProps, options = {}) { return function wrapWithConnect(WrappedComponent) { class Connect extends Component { constructor(props, context) { // 从祖先 Component 处获得 store this.store = props.store || context.store this.stateProps = computeStateProps(this.store, props) this.dispatchProps = computeDispatchProps(this.store, props) this.state = { storeState: null } // 对 stateProps、dispatchProps、parentProps 进行合并 this.updateState() } shouldComponentUpdate(nextProps, nextState) { // 进行判断,当数据发生改变时,Component 重新渲染 if (propsChanged || mapStateProducedChange || dispatchPropsChanged) { this.updateState(nextProps) return true } } componentDidMount() { // 改变 Component 的 state this.store.subscribe(() = { this.setState({ storeState: this.store.getState() }) }) } render() { // 生成包裹组件 Connect return ( <WrappedComponent {...this.nextState} /> ) } } Connect.contextTypes = { store: storeShape } return Connect; } }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论