0

0

React中的函数子组件和高阶组件的详解

不言

不言

发布时间:2018-09-05 10:03:40

|

1993人浏览过

|

来源于php中文网

原创

这篇文章给大家带来的内容是关于react中的函数子组件和高阶组件的详解 ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

在接触过React项目后,大多数人都应该已经了解过或则用过了HOC(High-Order-Components)和FaCC(Functions as Child Components),因为这两个模式在大多数react的开源库里都存在。比如react-router里面的withRouter 就是典型的高阶组件,接受一个组件返回另外一个经过增强后的组件。而react-motion中的Motion就是典型的FaCC的应用。

HOC和FaCC两者做的事也是非常相似的,都是类似设计模式里面的装饰者模式。都是在原有的实例或则单元上进行功能的增强。

当然不只是一些开源库中会使用,在平常的代码编写中,也有很多地方是适用于使用HOC和FaCC去封装一些逻辑。比如数据埋点,新特性的toggle,获取转换数据等。对于增强代码可读性和逻辑复用来说,非常有用的。

HOC

高阶函数我们都用过,就是接受一个函数然后返回一个经过封装的函数:

const plus = first => second => (first + second)
plus(1)(2) // 3

而高阶组件就是高阶函数的概念应用到高阶组件上:

const withClassName = ComposedComponent => props => (
   
)

// 使用
const Header = text => (
{text}
) const headerWitheClass = withClassName(Header)

接受一个组件返回一个经过包装的新组件。在我们经常使用的withRouter就是在原有组件props上面在加上localtion等属性。除了添加props以外高阶组件还能做到:

  • 在真正调用组件前后做一些事,比如埋点数据等

  • 判断组件是否该render,或则应该render其他的东西,比如出错之后render错误页面

  • 传递props并增加新的props

  • 不render组件,转而做一些其他的事情,比如渲染一个外部的dom

对于上面的前三点都比较好理解,解释一下第4点。比如你在render了一个页面之后,需要改变一下页面的title.这是单页应用普遍存在的一个需求,通常你可以在具体router库中使用hook去实现。当然也可以通过HOC来实现:

const withTitleChange = ComposedComponent => {
  return class extends React.Component {
    componentDidMount () {
      const { title } = this.props
      document.title = title
    }
    render () {
      const props = this.props
      return 
    }
  }
}

FaCC

同样FaCC也是用于增强原有组件能力的一种模式,其主要功能的实现在于react的props.children可以是任何东西,包括函数。我们可以拿上面class的例子用FaCC再实现一遍:

const ClassNameWrapper = ({ children }) => children('demo-class')

// 使用

const HeadWithClass = (props) => (
  
    {(class) => 
}
)

在FaCC中你也可以像HOC一样在生命周期中做很多事对原有的组件进行封装,基本上HOC能做的FaCC也都能做。我所在的项目之前都是大范围的使用HOC,再经过一番讨论后,开始大范围的转变成FaCC。

区别

两者都是用来增强原有组件的,具体该使用那种?那种是正确的模式?社区关于这一点也有很多讨论,比如就有人说FaCC是反模式:Function as Child Components Are an Anti-Pattern。他给出的理由是children并不语义化,会造成困惑,然后他提出了Component Injection的模式,有兴趣的同学可以读一读。

AlegroCart
AlegroCart

AlegroCart新功能:维类:包括在这两种线性长宽高或面积或体积长波产品尺寸允许与期权产品:让产品/期权组合独特的数量,尺寸,图像和型号。选择店铺标识管理 图片放大镜:显示一个图片放大上空盘旋时,产品形象弹出框。自定义错误报告:设置在管理员启用。 开发者只可以显示详细的信息。错误信息都写入到错误日志文件每天可以通过电子邮件发送给管理员。仓库皮卡航运模块:允许客户指定产品在商店的位置回升。增加了

下载

具体从几个方面做一下对比:

  1. 组合阶段

组合阶段意思就是HOC,FaCC和要被增强的组件的组合时候。可以很明显发现,FaCC对于前后组件对接依赖信息显示的更多,相对而言更容易理解。而HOC,相互之间如何桥接,你必须得深入到HOC内部读代码才可以知道这个HOC具体干了啥。

// HOC example
import View from './View'

const DetailPage = withServerData(withNavigator(View))
// FaCC example

import View from './View'

const DetailPage = props => (
  
    {
      data => (
        
          
        
      )
    }
  
)

如果在上面再增加2个HOC,上面组合的过程就变得十分难看。而FaCC相对而言,如何封装,数据源来自那里,组件接受了那些数据都比较显眼。

  1. 性能优化

在HOC中我们能接受到宿主的prop,因为props是从HOC往下传递的,所以我们也有完整的生命周期,我们可以使用shouldComponentUpdate优化。而FaCC则不然,无法在其内部做比较props,除非在组合的时候外部在包一个组件才能进行比较props。

  1. 灵活性

FaCC 在组合阶段相对HOC更为灵活,他并不规定被增强组件如何使用它传递下去的属性。而HOC基本上在编写完后就定死了。

另外,FaCC不会再去创建一个新的Component,而HOC会创建一个新的Component然后传递props下去。

总结

社区中很多开源库已经使用了两种模式,也有很多的文章进行比较。也有很多激烈讨论,当然对于最后解决问题而言,两种模式都有好处。出于不同的考虑,可能选择不一样。

相关推荐:

React高阶组件实例解析

React中受控组件和非受控组件实例详解

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

469

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.12.06

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

485

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

163

2023.10.07

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

3374

2024.08.14

PHP 高并发与性能优化
PHP 高并发与性能优化

本专题聚焦 PHP 在高并发场景下的性能优化与系统调优,内容涵盖 Nginx 与 PHP-FPM 优化、Opcode 缓存、Redis/Memcached 应用、异步任务队列、数据库优化、代码性能分析与瓶颈排查。通过实战案例(如高并发接口优化、缓存系统设计、秒杀活动实现),帮助学习者掌握 构建高性能PHP后端系统的核心能力。

102

2025.10.16

PHP 数据库操作与性能优化
PHP 数据库操作与性能优化

本专题聚焦于PHP在数据库开发中的核心应用,详细讲解PDO与MySQLi的使用方法、预处理语句、事务控制与安全防注入策略。同时深入分析SQL查询优化、索引设计、慢查询排查等性能提升手段。通过实战案例帮助开发者构建高效、安全、可扩展的PHP数据库应用系统。

89

2025.11.13

JavaScript 性能优化与前端调优
JavaScript 性能优化与前端调优

本专题系统讲解 JavaScript 性能优化的核心技术,涵盖页面加载优化、异步编程、内存管理、事件代理、代码分割、懒加载、浏览器缓存机制等。通过多个实际项目示例,帮助开发者掌握 如何通过前端调优提升网站性能,减少加载时间,提高用户体验与页面响应速度。

30

2025.12.30

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React.JS中文基础视频教程
React.JS中文基础视频教程

共14课时 | 3万人学习

React 教程
React 教程

共58课时 | 4.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号