关于高阶组件

2022-08-20  本文已影响0人  无敌未央様

高阶组件

高阶组件就是一个没有副作用的纯函数,并且可以接收另一个函数组件作为参数,返回值也为一个函数组件。

高阶组件其实就是装饰器模式在 React 中的实现:通过给函数传入一个组件(函数或类)后在函数内部对该组件(函数或类)进行功能的增强(不修改传入参数的前提下),最后返回这个组件(函数或类),即允许向一个现有的组件添加新的功能,同时又不去修改该组件,属于 包装模式(Wrapper Pattern) 的一种。

React 中的高阶组件主要有两种形式:属性代理 和 反向继承

属性代理

// 无状态(函数式组件)
function HigherOrderComponent(WrappedComponent) {
    return props => <WrappedComponent {...props} />;
}
// 有状态
function HigherOrderComponent(WrappedComponent) {
    return class extends React.Component {
        render() {
            return <WrappedComponent {...this.props} />;
 
        }
    };
}

就是 一个函数接受另一个组件作为参数传入,并返回一个继承了 React.Component 组件的类,且在该类的 render() 方法中返回被传入的 另一个组件。

因为属性代理类型的高阶组件返回的是一个标准的 React.Component 组件,所以在 React 标准组件中可以做什么,那在属性代理类型的高阶组件中就也可以做什么,比如:

反向继承

function HigherOrderComponent(WrappedComponent) {
    return class extends WrappedComponent {
        render() {
            return super.render();
        }
    };
}

反向继承其实就是 一个函数接受另一个组件作为参数传入,并返回一个继承了该传入组件的类,且在该类的 render() 方法中返回 super.render() 方法。

反向继承可以用来做什么:

其实属性代理和反向继承的实现有些类似的地方,都是返回一个继承了某个父类的子类,只不过属性代理中继承的是 React.Component,反向继承中继承的是传入的组件。

高阶组件存在的问题

应用场景

权限控制

利用高阶组件的 条件渲染 特性可以对页面进行权限控制

组件渲染性能追踪

借助父组件子组件生命周期规则捕获子组件的生命周期,可以方便的对某个组件的渲染时间进行记录

页面复用

高阶组件的约定

上一篇 下一篇

猜你喜欢

热点阅读