我使用react和nextjs框架,我尝试用这样的结构构建我自己的javascript组件
<Dropdown>
<DropdownToggle>Action</DropdownToggle>
<DropdownMenu>
<DropdownItem>Menu 1</DropdownItem>
<DropdownItem>Menu 2</DropdownItem>
</DropdownMenu>
</Dropdown>
字符串
让我们关注一下子对象(DropdownToggle和DropdownMenu),在子对象组件中,我想在DropdownMenu
上传递变量isOpen
,在DropdownToggle
上传递变量onClick
,我想检查子对象是DropdownToggle还是DropdownMenu组件
Dropdown.tsx
export const Dropdown = () => {
const [dropdownOpen, setDropdownOpen] = useState(false);
const childrenWithProps = React.Children.map(children, child => {
// child.type (div or button / html tag) or child.type.name (undefined)
if (React.isValidElement(child) && child.props?.className?.includes('DropdownToggle')) {
return React.cloneElement(child, {
onClick: () => {
setDropdownOpen(!dropdownOpen)
},
});
}
if (React.isValidElement(child) && child.props?.className?.includes('DropdownMenu')) {
return React.cloneElement(child, {
isOpen: dropdownOpen,
});
}
return child;
});
return (
<div className={styles.dropdown}>
{childrenWithProps}
</div>
)
}
型
DropdownToggle.tsx
export const DropdownToggle: React.FC<PropsWithChildren<DropdownToggleProp>> = ({onClick, children}) => {
return (
<button onClick={onClick}>
{children}
</button>
)
}
型
DropdownMenu.tsx
export const DropdownMenu: React.FC<PropsWithChildren<DropdownMenuProp>> = ({isOpen, children}) => {
return (
<div className={isOpen && 'open'}>
{children}
</div>
)
}
型
1.我无法使用child.type
(返回按钮或div)、child.type.name
(返回未定义)、child.type.displayName
(返回未定义)获取组件名称,因此我通过className进行检查
1.我在服务器和客户端得到错误:警告:React不识别DOM元素上的isOpen
prop。组件DropdownMenu props不被识别,但它直接附加到DOM元素
1条答案
按热度按时间ckocjqey1#
这看起来像是一个上下文会更容易的东西。那么你就不需要担心传递 prop 了。
例如,
Dropdown
组件可以是上下文提供程序字符串
在您的组件中,您可以使用上下文挂钩
型
的数据