向功能组件添加forwardRef是否是一项重大更改?

时间:2018-11-23 13:15:42

标签: reactjs semantic-versioning

TL; DR:我在一个库中有一个功能组件,该组件具有react@^16.3.0作为对等依赖项。如果我将此组件包装在React.forwardRef中,这是一个重大变化吗?

根据forwarding Refs#Note for component library maintainers中的react文档,将引用转发引入您的组件是一个重大变化。

对于类组件,我理解这一点,因为在获得该类的引用之前,现在您将获得对该对象的引用。

但是,对于功能组件,ref最初从未得到支持,并且会触发警告。

可以安全地假设向函数组件引入forwardRef是一项功能,而不是重大更改吗?

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

编辑: 与^16.3.0的对等体已经需要React了,因此我们已经可以访问forwardRef。我们不需要用户升级他们的React版本。

2 个答案:

答案 0 :(得分:1)

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

  

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

以前,引用应该是DOM元素或类实例。现在,引用可能会变成其他东西。如果是班级组成部分

// 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,这会破解。

另一件事是forwardRef自16.3起可用,并且无法有效地进行多填充。 React版本要求可能还会引入重大更改。

答案 1 :(得分:0)

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