javascript - REACT:有条件地渲染 JSX
问题描述
在构建具有侧边栏的网站时,我遇到了这个问题。我正在尝试实现侧边栏仅在单击子菜单项而不是单击父元素时关闭的行为。这是它的外观截图。如您所见,我不想在单击概览、州财政和预算时关闭侧边栏。
为了实现这种行为,我试图在 sidebar.js 文件中有条件地呈现 JSX,如下面的代码片段所示。buttonhook 是一个附加了 onClick 事件的组件。
{ SidebarData.map((item, index) => {
return <span item = {item}
key = {index}>
{item.subNav &&
item.subNav.map(subItem => {
return subItem.cName ? true : false
})
? < ButtonHook >
< SubMenu item = {item}
key = {index} />
</ButtonHook>
: < SubMenu
item = {item}
key = {index} />
}
</span>
})
}
上面代码的问题在于它也在 ButtonHook 组件中包装了 state 元素的财务。这是可以理解的,因为该元素的 item.Subnav 返回 true。有什么办法可以避免这种情况并获得预期的结果?
SidebarData.js 有以下内容。
export const SidebarData = [
{
title: 'Overview',
path: '/overview',
id: 1,
// icon: <AiIcons.AiFillHome />,
iconClosed: <RiIcons.RiArrowDownSFill />,
iconOpened: <RiIcons.RiArrowUpSFill />,
},
{
title: 'Finances of the state',
path: '/finances',
id: 1,
iconClosed: <FaIcons.FaPlusSquare size="12px"/>,
iconOpened: <FaIcons.FaRegMinusSquare size="12px" />,
subNav: [
{
title: 'Introduction',
path: '/finances/introduction',
id: 2,
icon: <FaIcons.FaAngleRight />,
cName: 'sub-nav'
},
{
title: 'Major Sources',
path: '/finances/sources',
id: 2,
icon: <FaIcons.FaAngleRight />,
cName: 'sub-nav'
},
{
title: 'Sources and Application of funds',
path: '/finances/application',
id: 2,
icon: <FaIcons.FaAngleRight />,
cName: 'sub-nav'
}
]
},
{
title: 'Budget',
id: 1,
path: '/budget',
icon: <IoIcons.IoIosPaper />
}
];
submenu.js 文件具有以下内容
const SubMenu = ({ item }) => {
const [subnav, setSubnav] = useState(false);
const showSubnav = () => {
return (
setSubnav(!subnav))
};
return (
<>
<SidebarLink to={item.path} onClick={item.subNav && showSubnav}>
<div>
{item.icon}
<SidebarLabel>{item.title}</SidebarLabel>
</div>
<div>
{item.subNav && subnav
? item.iconOpened
: item.subNav
? item.iconClosed
: null}
</div>
</SidebarLink>
{subnav &&
item.subNav.map((item, index) => {
return (
<DropdownLink to={item.path} key={index}>
{item.icon}
<SidebarLabel>{item.title}</SidebarLabel>
</DropdownLink>
);
})}
</>
);
};
如果您需要任何其他信息,请告诉我。
解决方案
推荐阅读
- java - 如何判断一个对象是可序列化的还是不可序列化的?
- javascript - 用 SVG 文本做 polyfill 线条效果的最佳方法是什么?
- javascript - 如何在网站中显示来自 Firestore 下载 URL 的图像
- reactjs - React Smooth DND Library 导致和“非法调用错误”
- c++ - 每毫秒写入 fstream 与批量写入
- python - DRF 错误:无法使用嵌套序列化程序上的视图名称解析超链接关系的 URL
- r - 为什么 plm::pvcm 的汇总函数会给出模型 = "within" 的系数分位数?
- android - JobScheduler 有时会在应用空闲时停止工作
- sql - 如果第一个 SQL 语句返回 NULL(或什么都不返回),则运行第二个 Select 语句
- memory-management - Is cudaDeviceSynchronize() required before cudaFree()?