Reactjs 将forwardRef添加到功能组件是否是一个突破性的更改?

Reactjs 将forwardRef添加到功能组件是否是一个突破性的更改?,reactjs,semantic-versioning,Reactjs,Semantic Versioning,TL;DR:我在一个库中有一个函数组件,它将react@^16.3.0作为对等依赖项。如果我将此组件包装在React.forwardRef中,这是一个突破性的更改吗 根据react文档,将ref转发到组件是一个突破性的变化 我理解类组件的这一点,因为之前你会得到一个类的引用,现在你会得到一个转发给任何东西的引用 但是,对于功能组件,REF从一开始就不受支持,并且会触发警告 假设将forwardRef引入功能组件是一种特性,而不是一种突破性的更改,安全吗 对我来说,这类似于向API添加新属性。以前

TL;DR:我在一个库中有一个函数组件,它将react@^16.3.0作为对等依赖项。如果我将此组件包装在
React.forwardRef
中,这是一个突破性的更改吗

根据react文档,将ref转发到组件是一个突破性的变化

我理解类组件的这一点,因为之前你会得到一个类的引用,现在你会得到一个转发给任何东西的引用

但是,对于功能组件,REF从一开始就不受支持,并且会触发警告

假设将forwardRef引入功能组件是一种特性,而不是一种突破性的更改,安全吗

对我来说,这类似于向API添加新属性。以前我会得到类型错误,而现在我得到一个定义的值。总的来说,这听起来像是文档中说的不存在一个特性实际上就是一个特性,这意味着每个特性都是一个突破性的变化

编辑:
React已被要求作为具有
^16.3.0
的对等方,因此我们可以访问
forwardRef
。我们不会要求用户升级其react版本。

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

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


以前,ref应该是DOM元素或类实例。现在ref可能是其他的东西。If类组件

// can be used like <Foo ref={this.foo}/> and this.foo.doFoo()
class Foo extends Component {
  doFoo() {}
  ...
}
公共API,这可能会引入突破性的变化,以防用户已经认为它是类实例,例如在测试中

另一个场景是可以直接调用的功能组件,以向其子级提供引用。如果将功能组件替换为
forwardRef
,则该漏洞将被破解


另一件事是,
forwardRef
从16.3开始就可用,不能有效地填充。React版本要求也可能带来突破性的变化。

我自己遇到的一个问题是,
提升非React静力学
需要一个主要的版本通气来支持
React.forwardRef
。所有使用
提升机的人无反应-statics@2.x
(对于高阶组件很流行)还需要更新该值,因为同样使用
提升非反应性
修饰的增强组件将导致
ReactIs.isForwardRef
返回true,即使增强组件是功能组件。

我认为您是对的,在这个特定的例子中,这只是一个您以前无法使用的新特性,所以我不认为在这里有危险。以前,对于函数组件,ref应该是DOM节点、类实例或none。这很重要,因为我专门针对功能组件。我们已经需要react@^16.3.0。我忘记提了,我明白了。这个问题不清楚您的案例是图书馆还是您自己的应用程序。您链接的备注仅适用于库,因为它们的API中的引用可能会在不通知的情况下更改。但由于组件是功能性的,因此没有用户依赖于
ref
。所以没有可能被破坏的代码。@skyboyer如果它以前不起作用,现在起作用,它可能会被破坏。我看到的另一个问题是,是否直接调用functional component来获取参考。如果从指向库维护者的链接看不出,那么Ok:这是库中的一个函数组件,我想对其进行突破性的更改。react文档说forwardRef总是一个突破性的改变,但我很难想象用户依赖于一个不存在的特性
const Foo = forwardRef((props, ref) => {
  ref.current = { doFoo: () => {} };
  return ...;
});