记录一下 高阶组件 的建立(也希望能帮助看的这篇文章的人),这篇文章主要是 教你构建一个hoc的事例,更详细深入的还是需要继续看其他文章

高阶组件通过包裹被传入的React组件,经过处理,最终返回(return)一个相对增强的React组件,供其他组件调用。

  • 高阶组件

    • 属性代理 (属性代理顾名思义,就是替代的意思。高阶组件替传入组件管理控制props里面一切属性,管理控制包括增,删,改,查。同时他自身还有自身的状态,即state,来强化传入组件。)

    • 反向继承 (属性代理方式在高阶组件中返回的组件继承的是Component,而反向继承则是继承的传入组件,根据继承的特性,继承可获取父类的所有静态资源,非私有属性和方法,且根据情况可对原方法进行重写。所以反向继承的方式也可以操作传入组件的props以及state。还有一个更重的就是反向继承可以进行渲染劫持。)

1.用create-react-app快速构建 一个项目

<!--如果构建 失败 请 阅读上面create-react-app的文章,估计是你node版本低了-->npx create-react-app my-app

属性代理 事例

  1. 建立下列目录

    • page 文件夹

      • page1.jsx
      • page2.jsx
      • hocBox.jsx
  2. page1.jsx

    import React, { Component } from 'react'import HocBox from './hocBox'class Page1 extends Component{render() {console.log(this.props)return <React.Fragment><h2>{this.props.data}</h2><div>这是组件Page1自己的内容</div>{this.props._renderContent()}<div><button onClick={()=>{this.props._alert('1')}}>点击事件</button></div></React.Fragment>}}export default HocBox(Page1) //这是把组件传入高阶组件
  1. page2.jsx
    import React, { Component } from 'react'import HocBox from './hocBox'class Page2 extends Component{render() {return <React.Fragment><h2>{this.props.data}</h2><div>这是组件Page2自己的内容</div>{this.props._renderContent()}<div><button onClick={()=>{this.props._alert('1')}}>点击事件</button></div></React.Fragment>}}export default HocBox(Page2) //这是把组件传入高阶组件
  1. hocBox.jsx
    import React, { Component } from 'react'const withStorage = WrappedComponent => {return class extends Component{componentWillMount() {let data = "这是hoc的data"this.setState({ data })}_renderContent = () =>{return <div>这是 hoc 的content 内容</div>}_alert = () =>{alert('alert')}render() {return <WrappedComponent _alert={this._alert}  _renderContent={this._renderContent} data={this.state.data} {...this.props}/> }}}export default withStorage
  1. App.js 改写一下
    import React from 'react';import Page1 from './page/page1'; //也可以引入page2import './App.css';function App() {return (<div className="App"><Page1/></div>);}export default App;

理解

  1. page1,page2 文件因为都公用 data数据,_renderContent组件,_alert方法。
    所以此时就可以 提取一个hoc了
  2. hocBox 把1的公用东西 统一封装 然后返回给 page1,page2
  3. 个人感觉 当把 page1,page2 传入 hocBox高阶组件之后,hocBox就相当于是父组件,page1,page2相当于是子组件,平时的 父传子 的 传参,调用方法 都可以相同方法 进行操作

反向继承 事例

  1. 建立下列目录

    • prototype 文件夹

      • hocReverseIn.jsx
      • reverseInput.jsx
  2. reverseInput.jsx

    import React, { Component } from 'react';import HocReverseIn from './hocReverseIn';class ReverseInput extends Component{constructor(props){super(props);this.state = {value:''}}// 这个 地方可写可不写 toSubmit = () => {}// 处理输入值变化动作。定义了方法没有方法实体valueChange = (e) => {}render(){const { value } = this.state;return (<div><input onChange={this.valueChange} value={value}/><button onClick={this.toSubmit}>提交</button></div>)}}export default HocReverseIn(ReverseInput)
  1. hocReverseIn.jsx
import React, { Component } from 'react'export default WrappedComponent => {return class Enhancer extends WrappedComponent {componentWillMount() {// 可以打印this,看一看,相当于继承了传过来的组件,可以直接操作state,事件等console.log(this)}toSubmit = () => {alert("我是hoc的 toSubmit")}valueChange = (e) => {let value = e.target.value;console.log(value)this.setState({value})}render() {return super.render();}}}
  1. App.js 改写一下
    import React from 'react';import Page1 from './page/page1'; //也可以引入page2import ReverseInput from './prototype/reverseInput';import './App.css';function App() {return (<div className="App"><!--<Page1/>--><ReverseInput/></div>);}export default App;

理解

  1. 反向继承允许高阶组件通过 this 关键词获取 WrappedComponent,意味着它可以获取到 state,props,组件生命周期(Component Lifecycle)钩子,以及渲染方法(render)

总结

  1. 属性代理 方式在高阶组件中返回的组件继承的是Component
  2. 反向继承则是继承的传入组件,根据继承的特性,继承可获取父类的所有静态资源,非私有属性和方法,且根据情况可对原方法进行重写。所以反向继承的方式也可以操作传入组件的props以及state。还有一个更重的就是反向继承可以进行渲染劫持。
  3. 不要在render方法内部使用高阶组件。简单来说react的差分算法会去比较 NowElement === OldElement, 来决定要不要替换这个elementTree。也就是如果你每次返回的结果都不是一个引用,react以为发生了变化,去更替这个组件会导致之前组件的状态丢失。

源码地址

参考下列文章:

react高阶组件 事例 源码相关推荐

  1. 「react进阶」一文吃透React高阶组件(HOC)

    一 前言 React高阶组件(HOC),对于很多react开发者来说并不陌生,它是灵活使用react组件的一种技巧,高阶组件本身不是组件,它是一个参数为组件,返回值也是一个组件的函数.高阶作用用于强化 ...

  2. react实现汉堡_利用 React 高阶组件实现一个面包屑导航

    什么是 React 高阶组件 React 高阶组件就是以高阶函数的方式包裹需要修饰的 React 组件,并返回处理完成后的 React 组件.React 高阶组件在 React 生态中使用的非常频繁, ...

  3. [react] 高阶组件(HOC)有哪些优点和缺点?

    [react] 高阶组件(HOC)有哪些优点和缺点? HOC 优点 通过传递props去影响内层组件的状态,不直接改变内层组件的状态,降低了耦合度 缺点 组件多层嵌套, 增加复杂度与理解成本 ref隔 ...

  4. THOR:MindSpore 自研高阶优化器源码分析和实践应用

    摘要:这篇文章跟大家分享下THOR的实践应用.THOR算法的部分内容当前已经在MindSpore中开源 本文分享自华为云社区<MindSpore 自研高阶优化器源码分析和实践应用>,原文作 ...

  5. React高阶组件探究

    React高阶组件探究 在使用React构建项目的过程中,经常会碰到在不同的组件中需要用到相同功能的情况.不过我们知道,去这些组件中到处编写同样的代码并不优雅. 在以往,为了解决以上的情况,我们会用到 ...

  6. react组件类型及深入理解react高阶组件

    React中常见的组件类型及分类: 1.展示组件(Presentational component) 与 容器组件(Container component) 2.类组件(Class component ...

  7. React高阶组件_阶段1

    react高阶组件_阶段1 作用: 个人总结的高阶组件设计的作用主要有两点, 这里直接使用装饰器方式 非装饰器使用请结合我的博文"react基础梳理_阶段1"中的"自定义 ...

  8. react 高阶组件hoc使用

    react 高阶组件hoc使用 1. 为什么使用高阶组件 2. 具体使用 2.1原代码: 2.2 使用hoc封装后 1. 为什么使用高阶组件 高阶组件(HOC)是 React 中用于复用组件逻辑的一种 ...

  9. 使用react 高阶组件withRouter

    使用react 高阶组件withRouter withRouter 是一个高阶组件,把 match,location,history 三个对象注入到组件的 props 中.这是一个非常实用的函数 re ...

最新文章

  1. SD-WAN加速推动企业分支上云—Vecloud
  2. 用自己的数据集在R-FCN框架下进行检测
  3. 第三章 深入分析Java Web中的中文编码问题
  4. 区分两种题目类型中的数学期望
  5. Helm 3 完整教程(六):在模板中使用 Helm 函数
  6. 一个求整系数多项式的全部有理根的方法
  7. 3DMAX的渲染后期丨怎么在PS里P出真实感的灯光?
  8. Exception in thread “main“ java.lang.ArithmeticException: / by zero
  9. 360开源的插件化框架Replugin深度剖析
  10. 蓝牙5.3 Core Spec演进与功能变化
  11. python阿拉伯数字转换为英文_python实现将英文单词表示的数字转换成阿拉伯数字的方法...
  12. python: too many indices for array
  13. 2022年3月15日黑马第三天
  14. WebView调用微信H5支付
  15. 六度空间 (bfs,广度优先)
  16. 计算机教室网络平面示意图,计算机机房平面布置图.doc
  17. 官宣:传智播客品牌全新升级为「传智教育」
  18. 【IT干货】当上技术大神,迎娶白富美,走上人生巅峰的机会了解一下?
  19. MaxViT实战:使用MaxViT实现图像分类任务(一)
  20. 安卓系统与内置Chrome浏览器

热门文章

  1. 全球及中国工业结晶器行业运营动态及投资潜力预测报告2022~2027年
  2. 泰克DPO2024B示波器,加快设计调试阶段的速度
  3. js中双感叹号_JavaScript中双叹号!!作用示例介绍
  4. 全球及中国高端功率MOSFET行业市场调查及投资价值预测报告2022-2028年
  5. F5服务器负载均衡原理
  6. 教你如何在Linux下查找大文件
  7. Git系列:常用操作一指禅
  8. the jre was not found in directory 安装weblogic踩过的坑
  9. 100个IT技术英文单词
  10. 计算机的过去和现在作文英语怎么说,过去和现在的作文英语_六年级真题英语作文2篇-五维英语...