react 的高阶组件再理解

栏目: IOS · Android · 发布时间: 6年前

内容简介:想要理解高阶组件,我们先来看看高阶函数的含义。上面这两个就是标准的高阶函数-(原来以前的 HOC 就是高阶组件)
  • 开始学习 react 的时候,有一个难点,高阶组件。
  • 以前写过一篇不太成熟的文章,这里忙里偷闲再来详细的理解一下。
  • 最出名的高阶组件就是 redux 状态管理的 connect 组件。大家可以取看一看实现的源码。

高阶函数的基本概念

想要理解高阶组件,我们先来看看高阶函数的含义。

  • 函数可以作为参数被传递
setTimeout(() => {
    console.log(1)
},1000)
复制代码
  • 函数可以作为返回值输出
function foo(x){
    return function(){
        return x;
    }
}
复制代码
  • 类似于 setTimeout() , setInterval() 就是普通的高阶函数。
setTimeout()
setInterval()

// ajax
$.get('/api/v1',function(){
    console.log('data')
})
复制代码

上面这两个就是标准的高阶函数

高阶组件 high order component ,简写 HOC

-(原来以前的 HOC 就是高阶组件)

高阶组件理解和使用

  • 和高阶函数一样,需要函数去包裹一个组件,返回的是一个组件而已
// A.js
import React, { Component } from 'react';
function A(WrapperedComponent){
    return class test extends Component{
        return <div>
            <WrapperedComponent />
        </div>
    }
}

export default A;

// 其他组件使用的时候
// B.js
import A from './A';

class B extends Component{
    return <div>
        hello world!!
    </div>
}
export default A(B)
复制代码

高阶组件的使用

  • 直接包裹 HOC(WrapperedComponent)
  • 使用装饰器 @HOC
    • 要 nom run eject(这里就不详细写了)
    • 安装 babel 适配文件等

编写高阶组件

  • 实现一个普通组件
  • 函数包裹这个组件

一个简单的高阶组件 demo

HOCprogress.tsx(1)
import React, { Component } from "react";

// 然后包裹一个 function,用WrapperedComponent传入 class 的 render()中。

function HOCprogress(WrapperedComponent, value: number) {

//先写 class 
  return class hocForm extends Component {
    render() {
      return (
        <div>
          <WrapperedComponent />
        </div>
      );
    }
  };
}

export default HOCprogress;

复制代码
  • 优化一下,添加简单的进度条
// HOCprogress.tsx
import React, { Component } from "react";

function HOCprogress(WrapperedComponent, value: number) {
  return class hocForm extends Component {
    render() {
    
    // 添加样式 
      const innerStyle = {
        width: "100%"
      };
      const percentStyle = {
        width: `${value}%`,
        height: "20px",
        background:
          "url(https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2440333743,1684406640&fm=26&gp=0.jpg)"
      };

      return (
        <div>
          <div style={innerStyle}>
            <div style={percentStyle}> {value} %</div>
          </div>
          <WrapperedComponent />
        </div>
      );
    }
  };
}

export default HOCprogress;
复制代码
  • 添加 A,B,C三个文件

A.tsx

import React, { Component } from "react";
// 引入高阶函数
import HOCprogress from "./HOCprogress.tsx";

class A extends Component {
  render() {
    return <div>这是 A 组件!</div>;
  }
}
// 使用高阶组件包裹 A 组件
export default HOCprogress(A, 56);

复制代码

B.tsx

import React, { Component } from "react";
import HOCprogress from "./HOCprogress.tsx";


class B extends Component {
  render() {
    return <div>这是 B 组件!</div>;
  }
}

// 我们可以使用 @HOCprogress 装饰器这样的方式来替代函数包裹这种方式具体的见我的装饰器的那篇文章。
export default HOCprogress(B, 98);

// C.tsx 同上
复制代码

index.ts

import React from "react";
import C from "./C.tsx";
import B from "./B.tsx";
import A from "./A.tsx";

class App extends React.Component {
    render(){
        <div>
            <A />
            <B />
            <C />
        </div>
    }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
复制代码

最后来看看效果

react 的高阶组件再理解

写在最后

  • 当然高阶组件有非常多的用法还可以去了解和学习,这里只是粗浅的入门了解。
  • 可以在代理模式中,去
    • 操作 props
    • 抽取组件状态
    • 访问 ref
    • 包装组件

参考


以上所述就是小编给大家介绍的《react 的高阶组件再理解》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

十亿美金的教训

十亿美金的教训

林军 唐宏梅 / 浙江大学出版社 / 2011-5 / 39.00元

《十亿美金的教训》内容简介:创业者个人能力欠缺、团队涣散、经营方向把握不当、资金动用失措以及时局不利……这其中有哪一个细节被忽视,都可能是失败的导火索! 国内二十年互联网风云,有人成功,有人失败。两种结果,不同方向,却往往只是一线之隔。他们留给我们怎样的教训与启示?后来者要怎样才能跳出失败之殇? 《十亿美金的教训》选取了互联网十个经典的失败案例,并深层解读这些互联网企业与创业者们从成功......一起来看看 《十亿美金的教训》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码