【问题标题】:Is adding forwardRef to a function component a breaking change?向功能组件添加 forwardRef 是一项重大更改吗?
【发布时间】:2019-04-26 02:38:31
【问题描述】:

TL;DR:我在一个库中有一个函数组件,它具有 react@^16.3.0 作为对等依赖项。如果我将此组件包装在 React.forwardRef 中,是否会发生重大变化?

根据forwarding Refs#Note for component library maintainers 中的 react 文档,将 ref 转发引入您的组件是一项重大更改。

我对类组件理解这一点,因为在您获得类的引用之前,现在您将获得对您转发的任何内容的引用。

然而,对于函数组件,引用从一开始就不受支持,并且会触发警告。

是否可以假设将 forwardRef 引入功能组件是一项功能而不是重大更改?

对我来说,这类似于向 API 添加新属性。之前我会得到类型错误,而现在我得到一个定义的值。总的来说,这听起来像是文档声明不存在一个功能实际上是一个功能,这意味着每个功能都是一个重大更改。

编辑: React 作为 ^16.3.0 的对等点已经是必需的,因此我们已经可以访问 forwardRef。我们不会要求用户升级他们的 React 版本。

【问题讨论】:

  • 我认为您是对的,在这种特定情况下,这只是您以前无法使用的新功能,因此我认为这里没有危险

标签: reactjs semantic-versioning


【解决方案1】:

我自己遇到的一个问题是hoist-non-react-statics 需要一个主要的版本来支持React.forwardRef。使用hoist-non-react-statics@2.x(对于高阶组件很流行)的每个人都需要更新它,因为即使增强组件是函数组件,也用hoistNonReactStatics 装饰的增强组件会导致ReactIs.isForwardRef 返回true。

【讨论】:

    【解决方案2】:

    forwardRef 可能会为库用户提供重大更改,而不管组件类型如何,因为这首先取决于库提供的公共 API:

    当您开始在组件库中使用 forwardRef 时,应将其视为重大更改并发布库的新主要版本。 这是因为您的库可能具有明显不同的行为(例如分配给什么引用,以及导出什么类型)

    以前,ref 应该是 DOM 元素或类实例。现在一个 ref 可能是别的东西。 if类组件

    // can be used like <Foo ref={this.foo}/> and this.foo.doFoo()
    class Foo extends Component {
      doFoo() {}
      ...
    }
    

    被替换为

    const Foo = forwardRef((props, ref) => {
      ref.current = { doFoo: () => {} };
      return ...;
    });
    

    公共 API,如果用户已经将其视为类实例,这可能会引入重大更改,例如在测试中。

    另一种情况是功能组件,可以直接调用like suggested here 为其子级提供参考。如果将功能组件替换为 forwardRef,这将是一个 hack。

    另一件事是 forwardRef 从 16.3 开始可用,并且无法有效地填充。 React 版本要求也可能会引入重大更改。

    【讨论】:

    • 以前,对于函数组件,ref 应该是 DOM 节点、类实例或无。这很重要,因为我专门针对功能组件。我们已经需要 react@^16.3.0。我忘了提。
    • 我明白了。从问题中不清楚您的案例是库还是您自己的应用程序。您链接的备注仅适用于库,因为其 API 中的引用可能会更改,恕不另行通知。
    • 但由于组件功能正常,因此没有用户依赖ref。所以没有可能被破坏的代码。
    • @skyboyer 如果以前不能正常工作,现在可以正常工作,它可能会损坏。我看到的另一个问题是是否直接调用功能组件来获取参考。
    • 好的,如果从针对库维护者的链接中看不到的话:这是库中的一个功能组件,我想对其进行重大更改。反应文档说 forwardRef 总是一个突破性的变化,但我很难想象用户依赖于不存在的功能
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多