说说Connect组件的原理是什么?

简介: 说说Connect组件的原理是什么?

说说Connect组件的原理是什么?

connect

作用:连接 React 组件与 Redux store

connect([mapStateToProps], [mapDispatchToProps], [mergeProps],[options])
// 这个函数允许我们将 store 中的数据作为 props 绑定到组件上
const mapStateToProps = (state) => {
  return {
    count: state.count
  }
}
  • 这个函数的第一个参数就是 Reduxstore ,我们从中摘取了 count 属性。你不必将 state 中的数据原封不动地传入组件,可以根据 state 中的数据,动态地输出组件需要的(最小)属性
  • 函数的第二个参数 ownProps ,是组件自己的 props

state 变化,或者 ownProps 变化的时候, mapStateToProps 都会被调用,计算出一个新的 stateProps ,(在与 ownProps merge 后)更新给组件

mapDispatchToProps(dispatch, ownProps): dispatchProps

connect 的第二个参数是 mapDispatchToProps ,它的功能是,将 action 作为 props 绑定到组件上,也会成为 MyCompprops

connect 的第三个参数就是用来做这件事。通常情况下,你可以不传这个参数,connect 就会使用 Object.assign 替代该方法。

[options] (Object) 如果指定这个参数,可以定制 connector 的行为。一般不用。

二、原理解析

首先 connect 之所以会成功,是因为 Provider 组件

  • 在原应用组件上包裹一层,使原来整个应用成为 Provider 的子组件
  • 接收 Reduxstore 作为 props ,通过 context 对象传递给子孙组件上的 connect

connect做了些什么

它真正连接 ReduxReact ,它包在我们的容器组件的外一层,它接收上面 Provider 提供的 store 里面的 statedispatch ,传给一个构造函数,返回一个对象,以属性形式传给我们的容器组件

三、源码

connect 是一个高阶函数,首先传入 mapStateToPropsmapDispatchToProps ,然后返回一个生产 Component 的函数( wrapWithConnect ),然后再将真正的 Component 作为参数传入

wrapWithConnect ,这样就生产出一个经过包裹的 Connect 组件,该组件具有如下特点

  • 通过 props.store 获取祖先 Componentstore props 包括 statePropsdispatchPropsparentProps ,合并在一起得到 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;
    }
}


相关文章
|
5月前
|
数据安全/隐私保护 开发者 UED
CodeBuddy 开发者福音!在线简历0元搞定,再也不怕面试翻车!
本文介绍如何用CodeBuddy和Edgeone Page MCP制作高质量在线简历,告别传统简历的局限。通过CodeBuddy生成简历工具,支持高亮亮点、添加链接与代码仓库;借助Edgeone Page MCP一键发布,实现访问控制与实时更新。该方案不依赖Word/PDF,支持技术项目展示,响应式布局适配多设备,为开发者打造专业“技术名片”。立即尝试,让HR第一眼记住你!
|
6月前
|
Web App开发 前端开发 JavaScript
如何模拟浏览器行为获取网页中的隐藏表单数据?
如何模拟浏览器行为获取网页中的隐藏表单数据?
|
7月前
|
云安全 存储 安全
阿里云安全体检功能深度评测报告
本次体检通过深度扫描发现了4类安全隐患:高危端口暴露、未修复的Log4j2漏洞、OSS存储桶权限错误。针对这些问题,我们采取了具体修复措施,如限制源IP、热更新参数等。体检项目在安全组可视化、漏洞修复指引等方面表现出色,但也存在容器安全检测不足等问题。建议增加一键阻断功能和OpenAPI接口,优化误报反馈机制,并添加合规检测模块。总体而言,阿里云安全体检在风险发现效率上表现优异,建议与云防火墙等产品联动,形成动态防御体系。
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的新生报道管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的新生报道管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
156 0
|
11月前
|
数据采集 IDE 测试技术
Python实现自动化办公:从基础到实践###
【10月更文挑战第21天】 本文将探讨如何利用Python编程语言实现自动化办公,从基础概念到实际操作,涵盖常用库、脚本编写技巧及实战案例。通过本文,读者将掌握使用Python提升工作效率的方法,减少重复性劳动,提高工作质量。 ###
302 1
|
12月前
|
缓存 Java 数据处理
java查询大量数据优化
通过结合的高性能云服务,如其提供的弹性计算资源与全球加速网络,可以进一步增强这些优化策略的效果,确保数据处理环节更加迅速、可靠。蓝易云不仅提供稳定的基础架构,还拥有强大的安全防护和灵活的服务选项,是优化大型数据处理项目不可或缺的合作伙伴。
263 0
|
测试技术
蓝桥杯真题讲解——积木画
蓝桥杯真题讲解——积木画
217 0
|
Windows
故障排除:Windows DVD Maker 无法刻录 DVD
Windows DVD Maker刻录失败可能由系统不兼容、软件版本过旧、驱动问题或磁盘格式引起。检查系统要求,确保至少有1.6 GHz处理器、512 MB RAM和4.7 GB硬盘空间。更新软件和驱动,尤其是DVD驱动及显卡驱动。调整刻录速度,确保使用兼容的DVD-R格式,并清洁刻录机。格式化磁盘至DVD-R格式也可解决问题。通过这些步骤可优化软件性能并解决刻录问题。
476 0
|
自然语言处理
HTTP协议中 URI、URL、URN
HTTP协议中 URI、URL、URN
353 0
|
JavaScript 调度 开发者
Vue3中如何使用自定义指令?
Vue3中如何使用自定义指令?v
219 1