React 高级课程之高阶组件

2020-02-17  本文已影响0人  北疆小兵

高阶函数基本概念

例如下面例子,setTimeout方法有2个参数,第一个参数是一个函数

setTimeout(() => {
            console.log('helo');
  }, 100);

下面foo函数的返回值是一个函数,就可以认为foo是以函数作为返回值的高阶函数

function  foo(x) {
        return function() {
            return x;
        }
    }

高阶组件基本概念

A.js

function A(WappedComponent){
    return class A extends Component {
        render() {
            return (
                <View>
                    <Text style={{color:'red'}}>提示</Text>
                    <WappedComponent />
                </View>
            )
        }
    }    
}
export default A;


B.js
class B extends Component {
    render() {
        return (
            <Text style={{color:'red'}}>这是 B 组件</Text>
         )
    }
}
export default A(B);

C.js
class C extends Component {
    render() {
        return (
            <Text style={{color:'red'}}>这是 C 组件</Text>
         )
    }
}
export default A(C);

A组件是一个函数,通过接收一个参数(这个参数是一个组件),返回一个新的组件

高阶组件实现

编写高阶组件

function d(WrapComponent){
    return class D extends Component {
        render() {
            return (
                <View>
                    <Text> textInComponent </Text>
                    <WrapComponent />
                </View>
            )
        }
    }    
}

export default d;

使用高阶组件

1.higherOrderComponent(WrappedComponent) 普通函数模式
2.@ higherOrderComponent 装饰器模式

如果是使用第2种 装饰器方式,需要做一些配置

在组件B上面用一个@ d 符号就可以将B作为参数传递给高级组件d了


@d
class B extends Component {
    render() {
        return (
            <Text style={{color:'red'}}>这是 B 组件</Text>
         )
    }
}

export default B;

高阶组件应用

返回的新组件直接集成自React.Component类,新组件扮演的角色传入参数组件的一个代理,在新组件的render函数中,将被包裹的组件渲染出来,除了高阶组件自己要做的工作,其余功能全部转手给了被包裹的组件。

1.操作props
删除age属性(此时otherProps中是没有age属性的)

image.png

2.抽取状态
3.访问ref

高阶组件调用包裹组件的方法

image.png

4.包装组件

采用继承关联作为参数的组件和返回的组件,加入传入的组件是WrappedComponent,那么返回的组件直接继承自WrappedComponent

image.png

例如

image.png

继承方式高阶组件应用

继承方式高阶组件一般用在需要根据 wrappedcomponent的渲染结果来修改props,用起来还是比较复杂,一般用的少,用代理方式高阶组件更加清晰

image.png

高阶组件显示名

image.png
上一篇 下一篇

猜你喜欢

热点阅读