zoukankan      html  css  js  c++  java
  • React中Connect原理

    用法

    connect([mapStateToProps], [mapDispatchToProps], [mergeProps],[options])
    作用:连接React组件与Redux Store
    mapStateToProps允许我们将 store 中的数据作为 props 绑定到组件上
    mapDispatchToProps将action作为props绑定到MyComp上。
    mergeProps不管是stateProps还是dispatchProps,都需要和ownProps merge 之后才会被赋给MyComp。connect的第三个参数就是用来做这件事。通常情况下,你可以不传这个参数,connect就会使用Object.assign替代该方法。
    
    首先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;
        }
  • 相关阅读:
    hdu 1164 Eddy's research I
    链式线性表的实现
    StreamReader和StreamWrite和FileStream区别和用法
    后台返回json数据,前台显示代码
    数字分页类
    在线编辑器总结
    C# Web开发打开下载对话框代码
    Jquery validate插件使用方法详解
    正则表达式
    漂亮的表格样式
  • 原文地址:https://www.cnblogs.com/-swz/p/14555481.html
Copyright © 2011-2022 走看看