• React之高阶组件


    1.概述:

    • 目的:实现状态逻辑复用
    • 采用包装(装饰)模式,比如说手机壳
    • 手机:获取保护功能
    • 手机壳:提供保护功能
    • 高阶组件就相当于手机壳,通过包装组件,增强组件功能

    2.思路分析:

    • 高阶组件(HOC,Higher-Order Component)是一个函数,接收要包装的组件,返回增强后的组件
    • 高阶组件内部创建一个类组件,在这个类组件中提供复用的状态逻辑代码,通过props将复用的状态传递给被包装组件WrappedComponent

     3.使用步骤

    • 创建一个函数,名称约定为以with开头
    • 指定函数参数,参数应该为以大写字母开头(作为要渲染的组件)
    • 在函数内部创建一个类组件,提供复用的状态代码逻辑,并返回
    • 在该组件中,渲染参数组件时,同时将状态通过props传递给参数组件
    • 调用该高阶组件,传入要增强的组件,通过返回值拿到增强后的组件,并将其渲染到页面中
    1. import React from 'react';
    2. import ReactDOM from 'react-dom';
    3. import MyEditor from './components/MyEditor';
    4. //React脚手架引入图片的方式
    5. // import img from './images/open.png'
    6. // 创建高阶组件
    7. function withMouse (WrappedComponent){
    8. //该组件提供复用的状态代码逻辑
    9. class Mouse extends React.Component{
    10. state={
    11. x:0,
    12. y:0
    13. }
    14. handleMouseMouve= e=>{
    15. this.setState({
    16. x:e.clientX,
    17. y:e.clientY,
    18. })
    19. }
    20. //监听鼠标移动事件
    21. componentDidMount(){
    22. window.addEventListener('mousemove',this.handleMouseMouve)
    23. console.log('listener')
    24. console.log(this.state.x)
    25. console.log(this.state.y)
    26. }
    27. //解除绑定
    28. componentWillUnmount(){
    29. window.removeEventListener('mousemove',this.handleMouseMouve)
    30. }
    31. render(){
    32. return (
    33. <WrappedComponent {...this.state}/>
    34. )
    35. }
    36. }
    37. return Mouse
    38. }
    39. //用来测试高阶组件
    40. const Position = props => {
    41. <p>
    42. X:{props.x} y:{props.y}
    43. p>
    44. }
    45. // const Open = props =>{
    46. //
    47. // src={img}
    48. // alt='open'
    49. // style={{
    50. // position:'absolute',
    51. // top:props.y,
    52. // left:props.x
    53. // }}
    54. // />
    55. // }
    56. //获取增强后的组件:
    57. const MousePosition = withMouse(Position)
    58. // const OpenPosition = withMouse(Open)
    59. class App extends React.Component{
    60. render(){
    61. return(
    62. <div>
    63. <h1>高阶组件h1>
    64. <MousePosition/>
    65. {/* <OpenPosition>OpenPosition> */}
    66. div>
    67. )
    68. }
    69. }
    70. ReactDOM.render(<App/>,
    71. document.getElementById('root'))

     不知道为什么在浏览器无法显示效果,但也没有报错!!

  • 相关阅读:
    快手回应董事长宿华“被带走配合调查”:恶意谣言,已报案;苹果关闭iOS 15.4.1验证通道;Linux 5.18发布|极客头条
    零难度!台式电脑如何连接蓝牙耳机?简单几步完成
    Spring Security整体架构
    实时数据监控,三防平板在工业领域的应用解析
    【速成之路】网页编程必会的Ajax——JSON
    After Effects 2022(AE2022)支持win版和mac版下载
    nodejs面经
    使用@validated注解校验参数
    Neo4j:入门基础—APOC插件
    IDEA 配置及插件和快捷键总结
  • 原文地址:https://blog.csdn.net/weixin_53052268/article/details/126086706