了解 React 高阶组件

2023-12-21

有人可以解释一下 React 中的高阶组件吗?我已经阅读并重新阅读了文档,但似乎无法更好地理解。根据文档,HOC 通过创建一个返回 React 组件的主函数,并将参数传递给该函数来帮助消除重复。 我对此有几个问题。

  • 如果 HOC 创建一个新的增强组件,是否可以完全不传入任何组件作为参数?
  • 在一个例子中,例如this https://stackoverflow.com/questions/37847616/proptypes-on-higher-order-components,这是高阶分量,Button or the EnhancedButton.
  • 我尝试创建一个 HOC,如下所示:

    // createSetup.js
    import React from 'react';
    
    export default function createSetup(options) {
        return class extends React.Component {
            constructor(props) {
                super(props);
    
                this.state = {};
    
                this.testFunction = this.testFunction.bind(this);
            }
    
            testFunction() {
                console.log("This is a test function");
            }
    
            render() {
                return <p>{options.name}</p>
            }
        }
    }
    
    
    // main.js
    import React from 'react';
    import {render} from 'react-dom';
    import createSetup from './createSetup';
    
    render((<div>{() => createSetup({name: 'name'})}</div>),
            document.getElementById('root'););
    

运行此命令不会显示 HOC,仅显示div

任何人都可以帮忙提供一个比给出的例子更好的例子吗?


HOC 是一个function它将组件作为其参数之一,并以某种方式增强该组件。

如果 HOC 创建一个新的增强组件,是否可以完全不传入任何组件作为参数?

不,那么它就不是 HOC,因为条件之一是它们将组件作为参数之一,并且返回一个具有一些附加功能的新组件。

在这样的示例中,它是较高阶组件、按钮或增强按钮。

EnhanceButton是 HOC 并且FinalButton是增强组件。

我尝试创建一个 HOC,如下所示:...运行此命令不会显示 HOC,仅显示 div

那是因为你的createSetup函数不是 HOC...它是一个返回组件的函数,是的,但它不会将组件作为参数来增强它。

让我们看一个基本 HOC 的示例:

const renderWhen = (condition, Component) =>
  props => condition(props)
    ? <Component {...props} />
    : null
);

你可以这样使用它:

const EnhancedLink = renderWhen(({invisible}) => !invisible, 'a');

现在你的EnhancedLink会像一个a组件,但如果你传递属性invisible set to true它不会渲染...所以我们增强了默认行为a组件,您可以使用任何其他组件来做到这一点。

在许多情况下,HOC 函数都是柯里化的,并且组件参数放在最后......就像这样:

const renderWhen = condition => Component =>
  props => condition(props)
    ? <Component {...props} />
    : null
);

connectReact-Redux 的功能...这使得组合变得更容易。看一下重组 https://github.com/acdlite/recompose.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 React 高阶组件 的相关文章

随机推荐

  • 长按后启用 ScrollView 中元素的拖动

    我已经用 panResponder 和 ScrollView 实现了拖放列表 我希望即使在触摸该项目时也能够滚动列表 问题是当我做滚动手势时该项目会移动 当然 我也希望能够移动该项目 但现在它具有与滚动相同的手势 我想通过仅在长按 1 5秒
  • 如何循环非默认构造类的 boost MPL 列表?

    我有以下示例 include
  • Sqlite从多个表中选择*

    我真的需要一些有关 sqlite 的帮助 我有一个数据库 有两个表 我们称它们为 table1 和 table2 这两个表基本相同 列名相同 列数相同 第一列是文本 其余列是双列 这适用于两个表 我不想将它们合并到一张表中 如果出现通常应该
  • 限制 Prolog 中的搜索 - Magic Square

    我想用 Prolog 程序求解最完美幻方 维基页面 https en wikipedia org wiki Most perfect magic square https en wikipedia org wiki Most perfect
  • 将文本垂直对齐到框的底部?

    我制作了盒子并设置了行高 文本自动垂直居中 有没有一种方法或任何技巧可以将文本设置在框的底部 div width 100px height 100px background eee color 333 text align center l
  • 在 CQRS 的写入端从数据库读取数据

    背景 Diagrams explaining CQRS usually will have clear separation of read and write paths and one way data flow like in thi
  • 如何使用 style.xml 文件中的样式(以及所有其他样式)创建无边框按钮

    我正在尝试创建一个无边框按钮 但我的按钮还有许多其他样式 并且我想通过将代码嵌入到 style xml 文件中来设计无边框按钮 我发现的一种方法是 通过在我的布局文件中使用 style android attr borderlessButt
  • “此安装不支持该项目类型”错误

    我在 W2k3 操作系统上安装了 VS 2008 SP1 在我安装 ASP NET MVC beta 并尝试创建 ASP NET MVC 类型项目后 出现以下错误 此安装不支持该项目类型 如果您已解决此问题 请告诉我 我尝试了这里发布的一些
  • 将 DataGrid 视图转换为 DataSet/DataTable 的最佳方法

    DataSet DataTable and LINQ表达式是常见的DataSource的值DataGridView 现在反过来 是否可以传递 绑定DataGridView记录到DataSet or DataTable Thanks 你可以这
  • 将 RDS 数据导出到 S3/Glacier

    我想将数据从 Oracle RDS 导出到 S3 然后将其移动到 Glacier 我的最终目标是将 RDS 中存储的数据备份到 S3 和 Glacier 以满足合规性要求 任何人都可以建议实现它的最佳方法 RDS 快照存储在 s3 中 但您
  • 生成订单号的好算法

    尽管我喜欢使用 GUID 作为系统中的唯一标识符 但对于订单号等字段来说 它并不是很用户友好 客户可能必须向客户服务代表重复该字段 有什么好的算法可以用来生成订单号 以便它是 Unique 非连续 纯粹用于光学 仅数字值 因此可以通过电话轻
  • 使用 file_get_contents 来验证和访问受 htaccess 保护的文件[重复]

    这个问题在这里已经有答案了 我需要访问受常规 htaccess 文件 身份验证类型 Basic htpasswords 等 保护的外部 php 页面 我想通过请求发送所需的用户名和密码 是否可以 我想避免cURL和所有pecl http如果
  • 添加项目依赖后出错

    我使用 Gradle 构建多个项目 布局如下 ares build gradle ares settings gradle ares ares gui build gradle ares ares persistence build gra
  • 如何在 VS 2015 中启用 C# 脚本?

    如何配置 VS 2015 以启用 Roslyn 的 C 脚本功能 我尝试安装各种 Nuget 包 包括 Microsoft CodeAnalysis CSharp Microsoft CodeAnalysis Scripting CShar
  • 在 C++ 中嵌入 python 函数

    我正在尝试使用 Cython 从 python 生成 c 代码 但名称修饰似乎存在一些问题 我首先生成将代码从 python 转换为 c 代码 然后使用 gcc 将代码编译为 so 我想使用 cython 而不是 C python API
  • Android:如何以编程方式创建 StateListDrawable

    我有一个 GridView 来显示一些对象 并且在视觉上每个对象都有一个图像图标和一个文本标签 我还希望图像图标在单击时具有一些 推和弹出 效果 也就是说 当按下时 图像将向右下方向移动一小段距离 当释放时返回到其原始位置 这些对象 及其图
  • 按后退按钮的片段

    我现在正在进行一个包含片段的活动 1 2 3 4 如果按按钮 3 可以重定向到 4 我想实现后退按钮 如下所示 当在 4 处按回时 返回到 3 当在 3 处按回时 返回到 2 当按下 1 时 活动完成 目前的实现是完成activity而不是
  • Lambda 表达式:n3290 草案

    n3290 ISO 草案中的一点 Lambda 表达式 第 5 1 2 节 第 6 段 The closure type for a lambda expression with no lambda capture has a public
  • 使用 JSR 310 (DateTime API) 的军事时区

    我在应用程序中使用 JSR 310 DateTime API 并且需要解析和格式化军事日期时间 称为 DTG 或 日期时间组 我正在解析的格式看起来像这样 使用DateTimeFormatter ddHHmm Z MMM yy ie 312
  • 了解 React 高阶组件

    有人可以解释一下 React 中的高阶组件吗 我已经阅读并重新阅读了文档 但似乎无法更好地理解 根据文档 HOC 通过创建一个返回 React 组件的主函数 并将参数传递给该函数来帮助消除重复 我对此有几个问题 如果 HOC 创建一个新的增