什么是高阶组件?
高阶组件(HOC)也就是组件的组件(组件工厂),具体而言,高阶组件就是一个函数而已,这个函数接受一个组件,并且返回一个组件;
再通俗易懂的讲,你有一个思域,送到改装店,然后再从改装店出来,又是一个不一样的思域;
用例:Redux中的connect 方法
为什么要用高阶组件?
高阶组件是对组件属性的扩展,提高代码的复用性;
高阶高阶组件的两种模式:属性代理 、反向继承;
属性代理:
A.js — 组件A
import React, { Component } from 'react';
import Hoc from '../HOC/Hoc' // 引入函数
class A extends Component {
constructor(props) {
super(props);
this.state = {
data:[]
}
}
render() {
return (
<div>
<button onClick={this.props.click}>A组件的按钮</button>
</div>
);
}
}
export default Hoc(A); // 抛出组件的时候呢 执行该函数,传入原来的组件,获得到一个新的组件(这个组件就有了Hoc.js赋予给他的新的属性)在组件的props上
Hoc.js – 做属性代理的组件,其实本身就是一个函数而已
import React, { Component } from 'react';
function Hoc(WrapComponent) {
return class extends Component{
constructor(props){
super(props)
this.state={
}
}
clickEvent(){
alert('来自高阶组件的问候')
}
render(){
return(
<WrapComponent name='hou'{...this.props} click={this.clickEvent.bind(this)} />
//返回时对原来的组件进行了一个扩展
)
}
}
}
export default Hoc // look,just return a function
反向继承:
B.js – 受作用的组件
import React, { Component } from 'react';
import Hoc from '../HOC/Hoc'
import goBackHoc from '../HOC/goBackHoc'
class B extends Component {
constructor(props) {
super(props);
this.state = {
data:[],
val:'B组件的按钮'
}
}
render() {
return (
<div>
<button>萨达萨达</button>
</div>
);
}
}
export default goBackHoc(B);
- goBackHoc.js — 做反向继承的组件 :拦截生命周期、state、渲染过程(还不是很清楚反向继承的作用在哪…)
function goBackHoc(WrapConponent){
return class extends WrapConponent{ //在这的时候不是去继承 React.Component 而是去继承传过来的组件
constructor(props){
super(props) // 超类继承
this.state= {
val:'呵呵'
}
}
render(){
return super.render()
}
componentDidMount() {
}
}
}
export default goBackHoc