React 高阶组件

198 阅读1分钟

定义

高阶组件(High Order Component, HOC) 输入:React 组件 => 输出:React 组件

使用场景

高阶组件的作用主要是用来加强组件,通过把基础组件拆分成很小的粒度,通过高阶组件进行增强并返回,以此提高复用性。 比如需要开发一个消息框,一开始只需要一个模态框能够显示消息就可以。后来需要多增加『确定』『取消』按钮组,这时候只要用高阶组件进行一次对基础模态框的增强就可以。避免了对原有组件进行修改,不影响原有组件的调用方。

实现思路

  • Props Proxy 属性代理
  • Inheritance Inversion 反向继承

Props Proxy 属性代理

核心思想是返回一个全新的组件,并在新组件中使用基础组件,方法是:

  • 增删改 props
  • 组合其他组件
const BasicComponent = require('BasicComponent');
const Button = require('Button');
const React = require('react');

const buttonWrapperHOC = (params) => {
    return class HOCBasicComponent extend React.Component {
        render() {
            return (
                <div>
                    <BasicComponent/>
                    <div className='button-wrapper'>
                        <Button value='确定'/>
                        <Button value='取消'/>
                    </div>
                </div>      
            );
        }
    }
}

Inheritance Inversion 反向继承

核心思想是返回一个继承了基础组件的组件

之所以被称为 Inheritance Inversion 是因为 WrappedComponent 被 Enhancer 继承了,而不是 WrappedComponent 继承了 Enhancer。在这种方式中,它们的关系看上去被反转(inverse)了。

可以进新的操作

  • 增删改 props
  • 修改render输出的DOM树(改起来不是很方便)
const BasicComponent = require('BasicComponent');
const Button = require('Button');
const React = require('react');

const HOC = (params) => {
    return class HOCBasicComponent extend BasicComponent {
        render() {
            return super.render();
        }
    }
}