React高阶组件入门

React高阶组件入门

React高阶组件也差不多快要退出主流舞台了,我是因为初学,所以记录一下自己的理解

简介

有点像Vue的Mixin(对象混入),封装公共模块。不过React并不提倡这种做法,所以引入了一种新的概念叫高阶组件(HOC):一个函数,能够接受一个组件并返回一个新的组件。

命题

一个模块需要显示用户个人基础信息,一个模块需要显示用户个人基础信息加等级

一般做法

ShowPersonInfo.tsx(显示用户个人信息)

import React from 'react';

interface PersonInfoState {
  name: string,
  age: string,
  sex: string,
  level?: string
}

const ShowPersonInfo: React.FC<any> = (props: PersonInfoState) => {
  return (
    <div>
      <p>姓名:{props.name}</p>
      <p>性别:{props.sex}</p>
      <p>年龄:{props.age}</p>
      <p>亲爱的{props.name},早上好!</p>
    </div>
  )
}
export default ShowPersonInfo

ShowPersonlevel.tsx(显示用户个人等级)

import React from 'react';

interface PersonInfoState {
  name: string,
  age: string,
  level: string,
  sex: string
}

const ShowPersonLevel: React.FC<any> = (props: PersonInfoState) => {
  return (
    <div>
      <p>姓名:{props.name}</p>
      <p>性别:{props.sex}</p>
      <p>年龄:{props.age}</p>
      <p>你的Vip等级为lev{props.level},离下一级还有……天</p>
    </div>
  )
}
export default ShowPersonLevel

index.tsx

import React from 'react';

import ShowPersonInfo from './showPersonInfo';
import ShowPersonLevel from './ShowPersonLevel';

const personInfo = {
  name:'jx',
  age:'25',
  sex:'男',
  level:'12'
}

const Person: React.FC<any> = (props: any) => {
  return (
    <div style={{margin:'50px'}}>
      <p>基础信息</p>
      <ShowPersonInfo {...personInfo}></ShowPersonInfo>
      <p>基础信息加等级</p>
      <ShowPersonLevel {...personInfo}></ShowPersonLevel>
    </div>
  )
}

export default Person;
一般效果

在这里插入图片描述

高阶组件封装

hoc/GetBasicInfo.tsx

import React from 'react';

const GetBasicInfo = (Func: any) => {
  return (props: any) => {
    return (
      <div>
        <p><span>姓名:</span><span>{props.name}</span></p>
        <p><span>年龄:</span><span>{props.age}</span></p>
        <p><span>性别:</span><span>{props.sex}</span></p>
        <Func {...props}></Func>
      </div>
    )
  }
}

export default GetBasicInfo;

ShowPersonInfo.tsx

import React from 'react';

import GetBasicInfo from '@/hoc/getBasicInfo';

const ShowPersonInfo: React.FC<any> = (props: any) => {
  return (
    <div>
      <p>亲爱的{props.name},早上好!</p>
    </div>
  )
}

export default GetBasicInfo(ShowPersonInfo);

ShowPersonLevel.tsx

import React from 'react';
import GetBasicInfo from '@/hoc/getBasicInfo';

const ShowPersonLevel: React.FC<any> = (props: any) => {
  return (
    <div>
      <p>你的Vip等级为lev{props.level},离下一级还有……天</p>
    </div>
  )
}
export default GetBasicInfo(ShowPersonLevel);
封装后效果

在这里插入图片描述

总结

可以看到两种效果都是一致的,同时其他两个模块的代码量大大减少了,后续开发中我们一般就只需要关注GetBasicInfo.tsx这个组件。当然实际项目中肯定不会这么简单。

不过现在因为hooks的出现,现在也不提倡使用高阶组件了,因为会出现多层嵌套,对后续维护不友好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值