高阶函数基本概念
- 函数可以作为参数传递
例如下面例子,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种 装饰器方式,需要做一些配置
-
在package.json 中配置 eject
image.png
在组件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属性的)

2.抽取状态
3.访问ref
高阶组件调用包裹组件的方法

4.包装组件
- 继承方式的高阶组件
采用继承关联作为参数的组件和返回的组件,加入传入的组件是WrappedComponent,那么返回的组件直接继承自WrappedComponent

例如

继承方式高阶组件应用
- 操作props

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

高阶组件显示名
- getDisplayName()

网友评论