【Reatc】 High Order Component 高阶组件

高阶组件定义

高阶组件是将一个组件作为入参,返回值为另一个新组件的函数。通常来说HOC会将额外的数据或者功能,添加到原本的组件中。

为什么需要高阶组件

根据以下代码片段,我们会发现,当不同组件需要使用相同的功能时,不同组件中通常会出现重复的代码,如果当有更多组件需要使用到以下的counter的功能时,这样的重复代码则会越来越多。高阶组件正是为了解决这样的场景,实现功能的复用,而不是代码的复制。

React 中的高阶组件主要有两种形式:属性代理反向继承

属性代理: 是 一个函数接受一个 WrappedComponent 组件作为参数传入,并返回一个继承了 React.Component 组件的类,且在该类的 render() 方法中返回被传入的 WrappedComponent 组件

反向继承:是 一个函数接受一个 WrappedComponent 组件作为参数传入,并返回一个继承了该传入 WrappedComponent 组件的类,且在该类的 render() 方法中返回 super.render() 方法。

实现案例

属性代理 

一个函数接受一个 WrappedComponent 组件作为参数传入,并返回一个继承了 React.Component 组件的类,且在该类的 render() 方法中返回被传入的 WrappedComponent 组件。

在返回之前就可以对这个组件做操作了。(比如说样式的修改, 属性的修改,数据的修改)在内部是不会修改原组件,只会将修改组件后的结果返回。

一般在高阶组件中数据件处理完,把处理好的结果,不管是方法、对象、值,挂载到传递的组件的属性中。在子组件中就可以获取到。

注意: 高阶组件的内部一定是一个类组件,类组件中有this,才能获取传入类组件的自身属性,不能说这个组件传入进去,它自身的属性没有了, 那指定是不行的。组件的属性必须的在!

import React from 'react';
​
//改变颜色的高阶组件
function Color(WrapperComponent,color="#FF0000"){
    return class Hoc extends React.Component{
        
        render(){
            let obj = {
                color:color
            }
            return <WrapperComponent {...this.props} {...obj}></WrapperComponent>
        }
    }
}
​
class Home extends React.Component{
    render (){
        console.log(this.props)
        return (
            <h3 style={{color:this.props.color}}>Home组件</h3>
        )
    }
}
​
export default Color(Home,"#0088dd");

反向继承

一个函数接受一个 WrappedComponent 组件作为参数传入,并返回一个继承了该传入 WrappedComponent

组件的类(继承了参数组件自身),且在该类的 render() 方法中返回 super.render() 方法(这里指的的父类对象中的render方法,直接返回结果,就不需要挂载了 ) 。

class 中 this -- 指向当讲对象 super -- 继承的父类对象

import React, { Component } from 'react'

// 反向继承的 中间过度函数必须是类组件, 只有类才能继承类 
class Goods extends Component {
   render() {
        return(
            <div className='box'>
                <h3 style={{ color: this.state.color }}> hello React</h3>
            </div>    
        )
    }
}

// 反向继承的高阶函数 
function Color(WrapperComponent){
    return class Color extends WrapperComponent{
        constructor() {
            super()
            this.state = {
                color: "#0088dd"
            }
        }
        render() {
            // 继承对象render() 的方法 
            return super.render()         
        }
    }
}

export default Color(Goods)

文章几经修改,不足之处在所难免望海涵,还望大家批评指正
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值