五、Hoc高阶组件

本文介绍了如何在React中使用高阶组件(HOC)来实现鼠标位置的追踪功能。通过创建一个名为`hocComponent`的高阶组件,监听`mousemove`事件并更新状态,将鼠标坐标传递给被包裹的组件。文章提供了详细的代码示例,展示了如何在任何需要此功能的组件中使用这个高阶组件。同时,还提到了通过设置`displayName`来区分经过高阶组件包装后的组件名称。
摘要由CSDN通过智能技术生成

Hoc应用场景:在React中想要对组件进行逻辑的复用,或者功能的扩充的时候,可以使用到高阶组件
给一个组件扩充获取鼠标位置的小功能demo示例:

  1. 实现一个获取鼠标位置的高阶组件
//   ./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'
}
  1. 使用高阶组件,在任何一个组件中只要你需要用到获取鼠标位置的功能你都可以使用这个高阶组件进行扩展
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>
    )
  }
}

  1. 效果展示
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值