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版本。
答案 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,即使增强组件是功能组件。