包装 IconButton 组件时 Chakra-ui 中的 ForwardRef 错误
我创建了一个可重用的组件,它包装 IconButton
并作为 react-icons
中的道具图标之一传递。
我收到以下错误:
警告:不能为函数组件提供引用。尝试访问 这个裁判将会失败。您的意思是使用 React.forwardRef() 吗?`
这是我的组件包装器:
export function SidebarMenu({ icon, isActive, handleMenuClick, name }) {
return (
<IconButton
className={isActive ? 'active' : ''}
aria-label={name + ' menu'}
isActive={isActive}
bg="transparent"
px="0"
as={icon}
_hover={{
cursor: 'pointer',
backgroundColor: 'transparent',
}}
_active={{
backgroundColor: 'transparent',
}}
onClick={() => handleMenuClick(name)}
/>
这是我使用包装器组件的方式
<SidebarMenu
icon={VscCode}
name="folders"
handleMenuClick={handleMenuClick}
isActive={menuList.folders}
/>
但是如果我将内容 IconButton
更改为 a 而不是使用 Icon
包裹在 Button
中,错误消失。
export function SidebarMenu({ icon, isActive, handleMenuClick, name }) {
return (
<Button
className={isActive ? 'active' : ''}
aria-label={name + ' menu'}
isActive={isActive}
bg="transparent"
px="0"
// as={icon}
_hover={{
cursor: 'pointer',
backgroundColor: 'transparent',
}}
_active={{
backgroundColor: 'transparent',
}}
onClick={() => handleMenuClick(name)}
>
<Icon as={icon} w={7} h={7} />
</Button>
);
}
编辑: 对于任何可能遇到同样问题的人。 我在这里做错了几件事。
- 我在
IconButton
中使用as
而不是icon
prop - 其次,我传递的是引用而不是组件 我没有这样做
,而是这样做} />
。
I created a reusable component that wraps the IconButton
and pass as one of the props icons from react-icons
.
I get the following error:
Warning: Function components cannot be given refs. Attempts to access
this ref will fail. Did you mean to use React.forwardRef()?`
Here's my component wrapper:
export function SidebarMenu({ icon, isActive, handleMenuClick, name }) {
return (
<IconButton
className={isActive ? 'active' : ''}
aria-label={name + ' menu'}
isActive={isActive}
bg="transparent"
px="0"
as={icon}
_hover={{
cursor: 'pointer',
backgroundColor: 'transparent',
}}
_active={{
backgroundColor: 'transparent',
}}
onClick={() => handleMenuClick(name)}
/>
Here's how i use the wrapper component
<SidebarMenu
icon={VscCode}
name="folders"
handleMenuClick={handleMenuClick}
isActive={menuList.folders}
/>
But if i change the content IconButton
to a instead use a Icon
wrapped in a Button
the error disappears.
export function SidebarMenu({ icon, isActive, handleMenuClick, name }) {
return (
<Button
className={isActive ? 'active' : ''}
aria-label={name + ' menu'}
isActive={isActive}
bg="transparent"
px="0"
// as={icon}
_hover={{
cursor: 'pointer',
backgroundColor: 'transparent',
}}
_active={{
backgroundColor: 'transparent',
}}
onClick={() => handleMenuClick(name)}
>
<Icon as={icon} w={7} h={7} />
</Button>
);
}
Edit:
For anyone who may stumble on the same problem.
There are couple of things i did wrong here.
- I was using
as
instead oficon
prop inIconButton
- Second, i was passing a reference instead of the component
Instead of doing<IconButton icon={<VsColorMode />} />
, i was doing this<IconButton icon={VsCodeMode} />
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
根据文档,
IconButton
有自己的 propicon
,因此不要使用as
,在本例中,使用icon
和Icon
Codesandbox演示
According to the doc,
IconButton
has its own propicon
, so instead of usingas
, in this case, useicon
withIcon
Codesandbox demo