理解React的高阶组件

一 介入javascript的高阶函数

在JS中,我们知道函数即为对象,它可以作为参数传入另一个函数中,也可以作为函数返回,那么这就很容易理解JS中的高阶函数了。比如说回调函数、参数柯里化(最主要的特征就是将函数作为参数,返回一个单参数调用的函数),ES7中的装饰器等

要了解高阶函数的应用,可以点此

高阶函数在React中的应用--高阶组件

A higher-order component is a function that takes a component and returns a new component.

高阶组件(HOC)是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。

具体而言,高阶组件是参数为组件,返回值为新组件的函数。

const EnhancedComponent = higherOrderComponent(WrappedComponent);

组件是将 props 转换为 UI,而高阶组件是将组件转换为另一个组件。

------引自React的官方文档

下面先放一个例子

declare var React;
// 高阶组件函数HOC highOrderComponent
var hoc = (Component) => {
  return class extends React.Component{
    render(){
      return (
        <div>
          <span>
            HOC
          </span>
          <Component />
        </div>
      );
    }
  }
};


// 子组件 Button.tsx
class Buttons extends React.Component {
  render(){
    const _that = this;
      function click(e) {
        e.preventDefault();
        console.log(_that.props);
      }
    return (
      <button type='button' onClick={click} >Action</button>
    );
  }

  componentDidMount() {
    console.log(this.props);
  }
}

export default hoc(Buttons);


// 父组件 page.tsx
export class Page extends React.Component {
  render(){
    return (
      <Buttons />
    );
  }

  componentDidMount() {
  }
}

上面的例子中,hoc就是一个高阶组件;高阶组件主要有两类

1,属性代理

引入里我们写的最简单的形式,就是属性代理(Props Proxy)的形式。通过hoc包装wrappedComponent,也就是例子中的Usual,本来传给Usual的props,都在hoc中接受到了,也就是props proxy。 由此我们可以做一些操作,包括操作props,refs获取组件实例或者转发实例

操作props
------最直观的就是接受到props,我们可以做任何读取,编辑,删除的很多自定义操作。

refs获取组件实例

------当我们包装子组件的时候,想获取到它的实例,可以通过引用(ref),在子组件挂载的时候,会执行ref的回调函数,在hoc中取到组件的实例。通过打印,可以看到它的props, state,都是可以取到的。同理ref转发。

import React from 'react';
// 高阶组件函数hoc
export default function hoc(Component) {
  class InjectPropsRef extends React.Component {
       // 可以将子组件的逻辑方法提取出来,放到这里
    componentDidMount() {
        console.log(this.props,this.state);
    }

    render() {
      const { forwardRef, ...rest } = this.props;
      const props = {
                name: 'hoc',
                ...rest
            };
        // 子组件ref实例的获取this.proxyRef
      //return (
      //  <Component ref={(refs) => this.proxyRef = refs } {...props} />
      //);
      // 分别实现转发ref实例和props的代理以及对props的操作。
      return (
          <Component ref={forwardRef} {...props} />
      );
    }
  }
 // React.forwardRef转发 InjectPropsRef 
  return React.forwardRef((props, ref) => <InjectPropsRef {...props} forwardRef={ref} />);
}

反向继承

反向继承(Inheritance Inversion),简称II,与属性代理的方法不同,属性代理是通过堆栈的方法去实现组件嵌套,而反向继承则是通过队列的方法进行继承。其实就是通过继承子组件原理,来产生一个新的组件,并且添加我们需要新增加的功能,并复用子组件。

我们只用对hoc做一些简单的修改就可以了

declare var React;
// 高阶组件函数HOC highOrderComponent
var iiHoc = (Component) => {
  return class extends Component{
    render(){
      // 渲染拦截,可以在后面做if处理,返回不同的render
      const ii = super.render();
      return (
        <div>
          <span>
            iiHOC
          </span>
          {ii}
        </div>
      );
    }
  }
};

结束,写的很简单,如果要详细了解还是要看下官方API

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值