• react 高价组件HOC实现组件复用


    目录

    一 使用步骤

    二 显示鼠标坐标

     三 鼠标随图片移动

    四 设置displayName

    五 传递props


    高阶组件HOC: Higher-Order Component,是一个函数,接收要包装的组件,返回增强后的组件
    目的:实现状态逻辑复用
    高阶组件就相当于手机壳, 采用包装(装饰)模式

    一 使用步骤


    1 创建一个函数,名称约定以with开头
    2 指定函数的参数,参数以大写字母开头(作为要渲染的组件)
    3 在函数内部创建一个类组件,提供复用的状态逻辑代码,并返回
    4 渲染参数组件,同时将状态通过props传递给参数组件
    5 调用该高阶组件,传入要增强的组件,通过返回值拿到增强后的组件,并将其渲染到页面中

    二 显示鼠标坐标

    1. import React from "react";
    2. import ReactDOM from "react-dom";
    3. // 1 创建一个函数,名称约定以with开头
    4. // 2 指定函数的参数,参数以大写字母开头(作为要渲染的组件)
    5. function withMouse(WrappedComponent) {
    6. // 3 在函数内部创建一个类组件,提供复用的状态逻辑代码,并返回
    7. class Mouse extends React.Component {
    8. //鼠标状态
    9. state = {
    10. x: 0,
    11. y: 0
    12. }
    13. //处理状态的逻辑代码
    14. handleMouseMove = e => {
    15. this.setState({
    16. x: e.clientX,
    17. y: e.clientY
    18. })
    19. }
    20. //监听鼠标移动事件
    21. componentDidMount() {
    22. window.addEventListener("mousemove", this.handleMouseMove)
    23. }
    24. //解绑事件
    25. componentWillUnmount() {
    26. window.removeEventListener('mousemove', this.handleMouseMove)
    27. }
    28. render() {
    29. //4 渲染参数组件,同时将状态通过props传递给参数组件
    30. return <WrappedComponent {...this.state}/>
    31. }
    32. }
    33. return Mouse;
    34. }
    35. const Position = props => (
    36. <p>
    37. 鼠标当前位置:(x:{props.x},y:{props.y})
    38. p>
    39. )
    40. //调用该高阶组件,传入要增强的组件,通过返回值拿到增强后的组件,并将其渲染到页面中
    41. const MousePosition = withMouse(Position)
    42. class App extends React.Component {
    43. render() {
    44. return (
    45. <div>
    46. {/*渲染增强后的组件*/}
    47. <MousePosition/>
    48. div>)
    49. }
    50. }
    51. ReactDOM.render(<App/>, document.getElementById("root"));

    效果

     三 鼠标随图片移动

    加入鼠标随图片移动的功能

    1. import imgage from "./images/cat.jpg"
    2. const Cat = props => (
    3. <img src={imgage} alt='猫' style={{
    4. position: 'absolute',
    5. // 为了让鼠标在图片的中间,top减掉了图片的一半高度,left减掉了图片一半的宽度
    6. top: props.y - 180,
    7. left: props.x - 180
    8. }}/>
    9. )
    10. //调用该高阶组件,传入要增强的组件,通过返回值拿到增强后的组件,并将其渲染到页面中
    11. const MousePosition1 = withMouse(Cat)

    效果

    完整代码

    1. import React from "react";
    2. import ReactDOM from "react-dom";
    3. import imgage from "./images/cat.jpg"
    4. // 1 创建一个函数,名称约定以with开头
    5. // 2 指定函数的参数,参数以大写字母开头(作为要渲染的组件)
    6. function withMouse(WrappedComponent) {
    7. // 3 在函数内部创建一个类组件,提供复用的状态逻辑代码,并返回
    8. class Mouse extends React.Component {
    9. //鼠标状态
    10. state = {
    11. x: 0,
    12. y: 0
    13. }
    14. //处理状态的逻辑代码
    15. handleMouseMove = e => {
    16. this.setState({
    17. x: e.clientX,
    18. y: e.clientY
    19. })
    20. }
    21. //监听鼠标移动事件
    22. componentDidMount() {
    23. window.addEventListener("mousemove", this.handleMouseMove)
    24. }
    25. //解绑事件
    26. componentWillUnmount() {
    27. window.removeEventListener('mousemove', this.handleMouseMove)
    28. }
    29. render() {
    30. //4 渲染参数组件,同时将状态通过props传递给参数组件
    31. return <WrappedComponent {...this.state}/>
    32. }
    33. }
    34. return Mouse;
    35. }
    36. const Cat = props => (
    37. <img src={imgage} alt='猫' style={{
    38. position: 'absolute',
    39. // 为了让鼠标在图片的中间,top减掉了图片的一半高度,left减掉了图片一半的宽度
    40. top: props.y - 125,
    41. left: props.x - 100
    42. }}/>
    43. )
    44. //调用该高阶组件,传入要增强的组件,通过返回值拿到增强后的组件,并将其渲染到页面中
    45. const MousePosition1 = withMouse(Cat)
    46. const Position = props => (
    47. <p>
    48. 鼠标当前位置:(x:{props.x},y:{props.y})
    49. p>
    50. )
    51. //调用该高阶组件,传入要增强的组件,通过返回值拿到增强后的组件,并将其渲染到页面中
    52. const MousePosition2 = withMouse(Position)
    53. class App extends React.Component {
    54. render() {
    55. return (
    56. <div>
    57. {/*渲染增强后的组件*/}
    58. <MousePosition1/>
    59. <MousePosition2/>
    60. div>)
    61. }
    62. }
    63. ReactDOM.render(<App/>, document.getElementById("root"));

    四 设置displayName

    默认情况下,react使用组件名称作为displayName
    使用高阶组件存在的问题: 得到的两个组件名称相同


    解决办法: 设置displayName → 用于调试时区分不同的组件

     效果

    完整代码

    1. import React from "react";
    2. import ReactDOM from "react-dom";
    3. import imgage from "./images/cat.jpg"
    4. // 1 创建一个函数,名称约定以with开头
    5. // 2 指定函数的参数,参数以大写字母开头(作为要渲染的组件)
    6. function withMouse(WrappedComponent) {
    7. // 3 在函数内部创建一个类组件,提供复用的状态逻辑代码,并返回
    8. class Mouse extends React.Component {
    9. //鼠标状态
    10. state = {
    11. x: 0,
    12. y: 0
    13. }
    14. //处理状态的逻辑代码
    15. handleMouseMove = e => {
    16. this.setState({
    17. x: e.clientX,
    18. y: e.clientY
    19. })
    20. }
    21. //监听鼠标移动事件
    22. componentDidMount() {
    23. window.addEventListener("mousemove", this.handleMouseMove)
    24. }
    25. //解绑事件
    26. componentWillUnmount() {
    27. window.removeEventListener('mousemove', this.handleMouseMove)
    28. }
    29. render() {
    30. //4 渲染参数组件,同时将状态通过props传递给参数组件
    31. return <WrappedComponent {...this.state}/>
    32. }
    33. }
    34. //设置displayName
    35. Mouse.displayName = `withMouse${getDisplayName(WrappedComponent)}`
    36. return Mouse;
    37. }
    38. //displayName
    39. function getDisplayName(WrappedComponent) {
    40. return WrappedComponent.displayName || WrappedComponent.name || 'Component'
    41. }
    42. const Cat = props => (
    43. <img src={imgage} alt='猫' style={{
    44. position: 'absolute',
    45. // 为了让鼠标在图片的中间,top减掉了图片的一半高度,left减掉了图片一半的宽度
    46. top: props.y - 125,
    47. left: props.x - 100
    48. }}/>
    49. )
    50. //调用该高阶组件,传入要增强的组件,通过返回值拿到增强后的组件,并将其渲染到页面中
    51. const MousePosition1 = withMouse(Cat)
    52. const Position = props => (
    53. <p>
    54. 鼠标当前位置:(x:{props.x},y:{props.y})
    55. p>
    56. )
    57. //调用该高阶组件,传入要增强的组件,通过返回值拿到增强后的组件,并将其渲染到页面中
    58. const MousePosition2 = withMouse(Position)
    59. class App extends React.Component {
    60. render() {
    61. return (
    62. <div>
    63. {/*渲染增强后的组件*/}
    64. <MousePosition1/>
    65. <MousePosition2/>
    66. div>)
    67. }
    68. }
    69. ReactDOM.render(<App/>, document.getElementById("root"));

    五 传递props

    问题:

    添加了一个属性, 打印了props

     属性没显示在props里

    原因:props传递丢失

    解决办法:

     效果

     完整代码

    1. import React from "react";
    2. import ReactDOM from "react-dom";
    3. // 1 创建一个函数,名称约定以with开头
    4. // 2 指定函数的参数,参数以大写字母开头(作为要渲染的组件)
    5. function withMouse(WrappedComponent) {
    6. // 3 在函数内部创建一个类组件,提供复用的状态逻辑代码,并返回
    7. class Mouse extends React.Component {
    8. //鼠标状态
    9. state = {
    10. x: 0,
    11. y: 0
    12. }
    13. //处理状态的逻辑代码
    14. handleMouseMove = e => {
    15. this.setState({
    16. x: e.clientX,
    17. y: e.clientY
    18. })
    19. }
    20. //监听鼠标移动事件
    21. componentDidMount() {
    22. window.addEventListener("mousemove", this.handleMouseMove)
    23. }
    24. //解绑事件
    25. componentWillUnmount() {
    26. window.removeEventListener('mousemove', this.handleMouseMove)
    27. }
    28. render() {
    29. //4 渲染参数组件,同时将状态通过props传递给参数组件
    30. return <WrappedComponent {...this.state}{...this.props}/>
    31. }
    32. }
    33. return Mouse;
    34. }
    35. const Position = props => {
    36. console.log(props)
    37. return (
    38. <p>
    39. 鼠标当前位置:(x:{props.x},y:{props.y})
    40. p>
    41. )
    42. }
    43. //调用该高阶组件,传入要增强的组件,通过返回值拿到增强后的组件,并将其渲染到页面中
    44. const MousePosition = withMouse(Position)
    45. class App extends React.Component {
    46. render() {
    47. return (
    48. <div>
    49. {/*渲染增强后的组件*/}
    50. <MousePosition a="1"/>
    51. div>)
    52. }
    53. }
    54. ReactDOM.render(<App/>, document.getElementById("root"));

  • 相关阅读:
    VMware Workstation Player虚拟机Ubuntu启用Windows共享目录
    nagios
    js第六章
    CEPH-3:cephfs功能详解
    程序编译过程(扫盲贴)
    Java框架 SSM整合
    智能电话机器人,使用Microsoft语音识别技术(Speech sdk)
    CSAPP-Lab05 Cache Lab 深入解析
    App Store审核被拒的原因和解决方案
    Leetcode1608. 特殊数组的特征值
  • 原文地址:https://blog.csdn.net/m0_45877477/article/details/125896275