Hoc
应用场景:在React
中想要对组件进行逻辑的复用,或者功能的扩充的时候,可以使用到高阶组件
给一个组件扩充获取鼠标位置的小功能demo
示例:
- 实现一个获取鼠标位置的高阶组件
// ./Hoc/Index.js
import React, { Component } from 'react'
import PropTypes from 'prop-types'
export default (WrappedComponent) => {
class hocComponent extends Component {
// 鼠标的位置
state = {
x:0,
y:0
}
// 监听鼠标位置
componentDidMount(){
window.addEventListener('mousemove', this.handleMouseMove)
}
// 鼠标移动事件
handleMouseMove = ( e ) => {
this.setState({
x:e.clientX,
y:e.clientY
})
}
// 组件卸载的时候取消监听事件
componentWillUnmount(){
window.removeEventListener('mousemove', this.handleMouseMove)
}
render() {
return (
<>
<h1>高阶组件--开始</h1>
<WrappedComponent {...this.state} />
<h1>高阶组件--结束</h1>
</>)
}
}
// 小细节:这个时候当你在react devtools中会发现经过高阶组件包装之后的组件名称都叫hocComponent,
// 当组件数量多的时候会分不清楚,可以通过设置displayName来改变
hocComponent.displayName = `hocComponent${getDisplayName(WrappedComponent)}`
return hocComponent
}
function getDisplayName(Component){
return Component.displayName || Component.name || 'Component'
}
- 使用高阶组件,在任何一个组件中只要你需要用到获取鼠标位置的功能你都可以使用这个高阶组件进行扩展
import React, { Component } from 'react'
import Hoc from './Hoc/Index.js'
// 基础函数式组件
const Posi = props => {
return <h1>鼠标的位置{ JSON.stringify(props) }:{props.x}--{props.y}</h1>
}
// 基础类组件
// class Posi extends Component{
// render(){
// return (<h1>鼠标的位置{ JSON.stringify(this.props) }:{this.props.x}--{this.props.y}</h1>)
// }
// }
// 经过高阶组件包装之后得到的增强组件
const WrapCom = Hoc(Posi)
export default class Index extends Component {
render() {
return (
<div>
{/* 引用经过高阶组件包装之后的组件 */}
<WrapCom></WrapCom>
</div>
)
}
}
- 效果展示