我有以下内容(使用材质UI)....
import React from "react";
import { NavLink } from "react-router-dom";
import Tabs from "@material-ui/core/Tabs";
import Tab from "@material-ui/core/Tab";
function LinkTab(link){
return <Tab component={NavLink}
to={link.link}
label={link.label}
value={link.link}
key={link.link}
/>;
}
在新版本中,这会导致以下警告...
警告:无法为函数组件提供引用。访问此引用的尝试将失败。是否要使用React.forwardRef()?
检查NavLink中ForwardRef
.的渲染方法(由ForwardRef创建)
我试着换...
function LinkTab(link){
// See https://material-ui.com/guides/composition/#caveat-with-refs
const MyLink = React.forwardRef((props, ref) => <NavLink {...props} ref={ref} />);
return <Tab component={MyLink}
to={link.link}
label={link.label}
value={link.link}
key={link.link}
/>;
}
但我还是收到了警告。我该如何解决这个问题?
9条答案
按热度按时间qni6mghb1#
把它写成
innerRef
将其用作
ref
。csbfibhn2#
来自
react-router
的NavLink
是Link的专用版本的函数组件,其公开了用于该目的的innerRef
属性。您还可以在我们的文档中搜索
react-router
,然后转到https://mui.com/getting-started/faq/#how-do-i-use-react-router,该链接指向https://mui.com/components/buttons/#third-party-routing-library。最后一个链接提供了一个工作示例,并解释了这一点在react-router v6中可能会发生的变化h5qlskok3#
您可以使用refs代替ref。这只在避免特殊的 prop 名称ref时才起作用。
igsr9ssn4#
如果您发现无法向组件添加自定义的
ref
prop或forwardRef
,我有一个技巧,仍然可以为您的功能组件获取ref对象。假设您想将ref添加到一个定制功能组件,例如:
你可以把它 Package 在一个通用的html元素中,并在上面设置
ref
。当然,要相应地管理状态,并在何处使用buttonRef对象。
ctehm74n5#
在我们的例子中,我们将一个SVG组件(站点的徽标)直接传递给NextJS的Link Component,这是一个有点定制的组件,我们得到了这样的错误。
使用SVG的标头组件是问题的“原因”。
控制台上的错误消息
自定义链接组件
现在,我们确保在自定义的链接组件中使用forwardRef,但仍然得到该错误。
为了解决这个问题,我将SVG元素的 Package 器定位改为this和 :poof:
vsikbqxv6#
要修正这个警告,你应该用
forwardRef
函数 Package 你的定制组件,就像blog中提到的那样将上面的代码更改为
5t7ly7z57#
使用片段求解React.forwardRef()?警告
qoefvg9y8#
如果你正在使用函数组件,那么React.forwardRef是一个非常好的特性,可以让你知道如何在这样的场景中使用它。如果阅读这篇文章的人是更多的动手类型,我就提供了一个codesandbox供你使用。有时它最初并不加载样式化组件,所以当沙箱加载时,你可能需要刷新内联浏览器。
https://codesandbox.io/s/react-forwardref-example-15ql9t?file=/src/App.tsx
然后在调用屏幕上,创建ref变量并将其传递到组件的ref字段。
就是这么简单!不管你把MyAwesomeInput组件放在哪里,你都可以使用一个ref。
enxuqcxy9#
我只是在这里粘贴
skychavda
解决方案,因为它提供了一个引用到一个孩子:因此您可以直接从父方法调用子方法或子引用,而不需要任何警告。来源:https://github.com/reactjs/reactjs.org/issues/2120