高阶组件仅仅是一个接收组件作为输入并返回组件的函数。高阶组件实现方式:高阶组件(HOC)是 React 中用于重用组件逻辑的高级技术。 HOC 本身不是 React API 的一部分。 它们是从 React 构思本质中浮现出来的一种模式
实现高阶组件的方法
组件是 React 中代码复用的基本单元。但你会发现某些模式并不适合传统组件。
现在有两个组件都是实现获取浏览器窗口大小的功能,基本逻辑是一样的,但是Sub是通过按钮实现的,Foo是通过div来实现的,两个组件有共同逻辑,那是不是可以抽取公共部分。
//公共代码逻辑用高阶组件来实现,高阶组件关心逻辑部分,对视图不关心,import React from 'react'export default function withSize(Component){return class toSize extends React.Component{constructor(){super()this.state={xPos:document.documentElement.clientWidth,yPos:document.documentElement.clientHeight}}getPos = () => {this.setState({xPos:document.documentElement.clientWidth,yPos:document.documentElement.clientHeight})}componentDidMount(){window.addEventListener('resize',this.getPos)}componentWillUnmount(){window.removeEventListener('resize',this.getPos)}render(){return <Component {...this.state}/>}}}
Foo组件只关心视图部分,公用逻辑交给高阶组件处理即可
import React from 'react'import withSize from './CommonComponent'class Foo extends React.Component{render(){return(<div><p>x:{this.props.xPos},y:{this.props.yPos}</p></div>)}}const FooWithSize = withSize(Foo)export default FooWithSize
这样就实现了高阶组件,可以看出高阶组件的主要功能是封装并分离组件的通用逻辑,让通用逻辑更好的被复用,本质上是装饰者设计模式,高阶组件的参数可以有多个。
注意事项
- 不要在组件的render方法中使用高阶组件,尽量不要在组件的其他生命周期方法中使用高阶组件,因为高阶组件每次都会返回一个新的组件,在render中使用会导致每次渲染出来的组件都不相同,于是每次render,组件都会卸载,然后重新挂载,既影响了效率,又丢失了组件的及其子组件的状态
- Refs不会被传递给包装组件
