React 中的 ForwardRefExoticComponent 和 ForwardRefRenderFunction 有什么区别?

2024-04-01

我正在编写一个 React 组件,它可以将引用转发给它的子组件

我发现对于函数组件的返回类型,我可以使用ForwardRefExotic组件 and 前向参考渲染函数。但我不确定它们之间有什么区别。

到目前为止,使用时ForwardRefExotic组件,我可以延长它,而前向参考渲染函数不能?我在这里发布了与我的案例相关的问题:如何使用 ForwardRefRenderFunction 导出forwardRef https://stackoverflow.com/questions/64236857/how-to-export-forwardref-with-forwardrefrenderfunction/64237782#64237782

如果有人知道他们之间的区别以及他们所做的事情,请帮助我。因为React团队似乎没有关于它们的文档(但它们在react包内)


ForwardRefExotic组件

定义取自here https://github.com/DefinitelyTyped/DefinitelyTyped/blob/927f70dd89119f11a47688ed5eb4e0e082bef219/types/react/index.d.ts is

interface ExoticComponent<P = {}> {
    /**
     * **NOTE**: Exotic components are not callable.
     */
    (props: P): (ReactElement|null);
    readonly $$typeof: symbol;
}

interface NamedExoticComponent<P = {}> extends ExoticComponent<P> {
    displayName?: string;
}

interface ForwardRefExoticComponent<P> extends NamedExoticComponent<P> {
    defaultProps?: Partial<P>;
    propTypes?: WeakValidationMap<P>;
}

如果你写出来你会得到

interface ForwardRefExoticComponent<P> {
    /**
     * **NOTE**: Exotic components are not callable.
     */
    (props: P): (ReactElement|null);
    readonly $$typeof: symbol;
    displayName?: string;
    defaultProps?: Partial<P>;
    propTypes?: WeakValidationMap<P>;
}

前向参考渲染函数

定义取自here https://github.com/DefinitelyTyped/DefinitelyTyped/blob/927f70dd89119f11a47688ed5eb4e0e082bef219/types/react/index.d.ts is

interface ForwardRefRenderFunction<T, P = {}> {
    (props: PropsWithChildren<P>, ref: ((instance: T | null) => void) | MutableRefObject<T | null> | null): ReactElement | null;
    displayName?: string;
    // explicit rejected with `never` required due to
    // https://github.com/microsoft/TypeScript/issues/36826
    /**
     * defaultProps are not supported on render functions
     */
    defaultProps?: never;
    /**
     * propTypes are not supported on render functions
     */
    propTypes?: never;
}

差异

  • ForwardRefRenderFunction不支持propTypes and defaultProps, 然而ForwardRefExoticComponent does.
  • ForwardRefExoticComponent有一个额外的成员$$typeof类型的symbol
  • 的呼叫签名ForwardRefRenderFunction需要一个props对象,它必须包含一个成员children和 ref 对象作为参数,而调用签名ForwardRefExoticComponent只接受任意形状的 props 对象作为参数。

还有一些想法

这两个定义的相互作用在的定义forwardRef功能 https://github.com/DefinitelyTyped/DefinitelyTyped/blob/927f70dd89119f11a47688ed5eb4e0e082bef219/types/react/index.d.ts#L805:

function forwardRef<T, P = {}>(render: ForwardRefRenderFunction<T, P>): ForwardRefExoticComponent<PropsWithoutRef<P> & RefAttributes<T>>;

此外,这两个定义之间的一个很大的区别似乎是,ForwardRefExoticComponent(像所有外来组件一样)不是函数组件,而实际上只是对象,在渲染它们时会进行特殊处理。因此评论

NOTE:外来组件不可调用。

由于某种原因,这些奇异的组件在某些地方是必要的。

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

React 中的 ForwardRefExoticComponent 和 ForwardRefRenderFunction 有什么区别? 的相关文章

随机推荐

  • 如何使用另一个模式的表编写存储过程?

    为了调用Oracle的函数和过程 表必须在HR用户中吗 当我从另一个用户运行函数时 它给我一个编译错误 对于我的项目 我想从另一个用户运行函数和过程 我该如何实施 要使用另一个模式中的表编写函数或过程 表所有者需要授予我们所需的权限 例如
  • 一个人可以在 Magento 社区版上托管多个商店吗?

    一个人可以在 Magento 社区版上托管多个商店吗 以及如何在设置每个新商店时自动为其创建子域 是的 您可以从 Magento 社区版运行多个站点 Magento 官方博客实际上刚刚发布了一篇关于此问题的帖子 您可能想查看一下 http
  • 我尝试实施 UPSERT 时出现问题

    我在检查更新 PostgreSQL 中的表的条件时遇到此问题 它必须检查用户是否下载过一次 如果是 则添加 1acessos
  • 如何从任何地方获取上下文? [复制]

    这个问题在这里已经有答案了 在Android中 有什么方法可以静态获取应用程序的上下文吗 例如从后台线程检索它 Thanks 最简单 也是正确 的方法是 定义一个新类 public class MyApp extends Applicati
  • hibernate查询语言还是使用条件?

    任何人告诉我使用 criteria hql sql 进行查询 要求是用户输入电子邮件或用户名 查询返回密码 来自表用户的用户 Criteria API 非常适合动态查询生成 并且是我的首选 你可以这样做 Criteria criteria
  • Git/Mercurial (hg) 意见 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 首先声明 我不是一个专业的程序员 而是一个有需要并且必须学习的工程师 我总是独自工作 所以只有我和我的七个分裂人格 我们作为一个团队工
  • 如何使用struts 2标签比较列表元素(字符串类型)和字符串(在请求范围内)

    我的列表包含 A B C D 元素
  • 如何监听 Firebase 中的特定值变化?

    My data structure is the following compliments received uid complimentId 我想听听有关恭维 已收到 uid complimentId updatedAt 的更改 我的代
  • 如何使JComboBox表格编辑器具有普通JComboBox的设计?

    我有一个JComboBox用作编辑器JTable 在图片中 您可以在标记的列中看到它们Produs 我想使用独立的设计JComboBox在网格单元中 特别是组合框的右侧部分 其中网格单元中缺少三角形 因此用户无需单击其中之一即可知道网格单元
  • 如何从具有相同签名的方法或扩展函数调用顶级函数?

    我使用科特林1 1 2 2 我想调用顶层函数plus100 Int Int从方法Mul2 plus100 Int Int 我尝试在下面的代码中执行此操作 但实际上Mul2 plus100本身被称为 class Mul2 fun plus10
  • Objective-C 属性表达式的地址

    我需要财产的访问地址 但有问题 示例代码是 interface Rectangle NSObject SDL Rect wall SDL Rect ground property SDL Rect wall property SDL Rec
  • WidgetKit @StateObject 不更新视图

    我无法理解如何让我的SwiftUI数据模型示例与我的小部件一起使用 它在我的测试应用程序中运行得很好 我立即观察到变化 当我尝试使用小部件时 我可以看到控制台中打印的数据 但我的中没有发生任何变化View in WidgetKit 我正在使
  • 错误:列表类型不带参数

    尽管它与示例中使用的完全相同 但我收到以下错误 错误 列表类型不带参数 List
  • NODEJS writeStream 错误

    var http require http var fs require fs createWriteStream file1 http createServer function req res This opens up the wri
  • 批量获取消息性能

    我需要获取收件箱中的最后 100 条消息 仅限标题 为此 我目前正在使用 IMAP 扩展来搜索并获取消息 这是通过两个请求完成的 SEARCH进而UID FETCH Gmail API 相当于在一个请求中获取多封邮件的功能是什么 我能找到的
  • 为什么 SDWebImage 加载后在单元格中不显示图像?

    我正在使用 SDWebImage 在我的表格中 每一行都有图像和标签 如您所见 图像看不到 但是当我返回父视图控制器并再次来到这里时 它们就会显示出来 我正在使用的代码是 cell imageView setImageWithURL NSU
  • 如何自动连续垂直滚动div内容

    我需要垂直滚动包含图像的 div 任何帮助或参考将不胜感激 Maybe 像这样的东西 http jsfiddle net 9qC9E 8 有助于 第一张和最后一张图像应该是相同的 JS function var box document g
  • Django REST Framework,PUT/POST 序列化程序数据消失

    当我尝试更新或发布新实例时 我遇到部分数据消失的问题 有了这样的数据 data item Product station Workbench ingredients item ing1 amount 2 item ing2 amount 1
  • auth-hmac功能测试问题

    我想在我的 api 应用程序中使用这个 gemhttps github com seangeo auth hmac https github com seangeo auth hmac 我有一个关于创建请求身份验证测试的问题 我想用 hma
  • React 中的 ForwardRefExoticComponent 和 ForwardRefRenderFunction 有什么区别?

    我正在编写一个 React 组件 它可以将引用转发给它的子组件 我发现对于函数组件的返回类型 我可以使用ForwardRefExotic组件 and 前向参考渲染函数 但我不确定它们之间有什么区别 到目前为止 使用时ForwardRefEx