Reactstrap 多级下拉祖先不关闭
Reactstrap Multi-Level Dropdown Ancestors don't close
我一直在为我正在构建的内部网开发一个多级下拉菜单组件。决定在这方面使用 React 我认为我的多级菜单会很简单。显然不是:)
到目前为止,我开发的内容运行良好,但有一个例外:单击 NavLink 时,打开的菜单项不会折叠。
我加的CSS类都是外观,没有定位语句。我使用 JSON 源文件和 Reactstrap 构建了这个。
这是我的组件的代码。
class MenuBar extends Component {
constructor(props) {
this.NavListItem = this.NavListItem.bind(this);
}
NavListItem = (item, level) => {
if (item.children.length > 0) {
return (
<UncontrolledDropdown direction={level!==0?"right":"down"} nav inNavbar className="menu menu-UncontrolledDropdown" key={"UCD_" + item.pageId}>
<DropdownToggle nav caret
className="menu menu-dropdown-toggle item title"
key={"DDToggle_" + item.pageId}
id={"DDToggle_" + item.pageId}
>
{item.title}
</DropdownToggle>
<DropdownMenu className="menu menu-dropdown-container">
<Nav>
{item.children.map((listItem) => this.NavListItem(listItem, level + 1))}
</Nav>
</DropdownMenu>
</UncontrolledDropdown>
)
}
else {
return (
<NavItem className="menu menu-item-container" key={"DDNavItem_" + item.pageId}>
<NavLink onClick={() => { this.props.updateCurrentPage(item) }} className="menu menu-link" key={"DDNavLink_" + item.pageId}>{item.title}</NavLink>
</NavItem>
)
}
}
render() {
const setIsOpen = (value) => {
this.setState({ isOpen: value })
}
const toggle = () => setIsOpen(!this.state.isOpen);
return (
<div className="row">
<div className="col-2 p-3 menu">
<div onClick={() => this.props.updateCurrentPage(null)}
className="align-top met-logo">
</div>
</div>
<div className="col col-md-6 offset-1 menu ">
<Navbar color="light" light expand="md" className="menu menu-bar">
<NavbarToggler onClick={toggle} className="menu menu-toggler" />
<Nav className="mr-auto" navbar>
{this.props.siteMap.siteMapData.map((link) => this.NavListItem(link, 0))}
</Nav>
</Navbar>
</div>
</div>
);
}
}
我现在唯一的问题是单击选项时打开的项目不会关闭。我希望最好使它成为无状态的并最终将其作为功能组件放入,但现在我正在从 Redux 中提取 Sitemap。
谢谢。
我找不到解决方案,但确实想出了一个占用很少资源的实用解决方法。
在 SPA 的 MainComponent 中,我托管了该组件以及当前页面组件。当我意识到单击菜单关闭它时,我所做的是在 componentDidUpdate() 函数中添加一个小片段:
componentDidUpdate(){
//work around for menu not closing.
document.getElementById("rootDiv").click();
}
这实际上会导致菜单在新页面开始加载后关闭。问题已解决。
我一直在为我正在构建的内部网开发一个多级下拉菜单组件。决定在这方面使用 React 我认为我的多级菜单会很简单。显然不是:)
到目前为止,我开发的内容运行良好,但有一个例外:单击 NavLink 时,打开的菜单项不会折叠。
我加的CSS类都是外观,没有定位语句。我使用 JSON 源文件和 Reactstrap 构建了这个。
这是我的组件的代码。
class MenuBar extends Component {
constructor(props) {
this.NavListItem = this.NavListItem.bind(this);
}
NavListItem = (item, level) => {
if (item.children.length > 0) {
return (
<UncontrolledDropdown direction={level!==0?"right":"down"} nav inNavbar className="menu menu-UncontrolledDropdown" key={"UCD_" + item.pageId}>
<DropdownToggle nav caret
className="menu menu-dropdown-toggle item title"
key={"DDToggle_" + item.pageId}
id={"DDToggle_" + item.pageId}
>
{item.title}
</DropdownToggle>
<DropdownMenu className="menu menu-dropdown-container">
<Nav>
{item.children.map((listItem) => this.NavListItem(listItem, level + 1))}
</Nav>
</DropdownMenu>
</UncontrolledDropdown>
)
}
else {
return (
<NavItem className="menu menu-item-container" key={"DDNavItem_" + item.pageId}>
<NavLink onClick={() => { this.props.updateCurrentPage(item) }} className="menu menu-link" key={"DDNavLink_" + item.pageId}>{item.title}</NavLink>
</NavItem>
)
}
}
render() {
const setIsOpen = (value) => {
this.setState({ isOpen: value })
}
const toggle = () => setIsOpen(!this.state.isOpen);
return (
<div className="row">
<div className="col-2 p-3 menu">
<div onClick={() => this.props.updateCurrentPage(null)}
className="align-top met-logo">
</div>
</div>
<div className="col col-md-6 offset-1 menu ">
<Navbar color="light" light expand="md" className="menu menu-bar">
<NavbarToggler onClick={toggle} className="menu menu-toggler" />
<Nav className="mr-auto" navbar>
{this.props.siteMap.siteMapData.map((link) => this.NavListItem(link, 0))}
</Nav>
</Navbar>
</div>
</div>
);
}
}
我现在唯一的问题是单击选项时打开的项目不会关闭。我希望最好使它成为无状态的并最终将其作为功能组件放入,但现在我正在从 Redux 中提取 Sitemap。
谢谢。
我找不到解决方案,但确实想出了一个占用很少资源的实用解决方法。
在 SPA 的 MainComponent 中,我托管了该组件以及当前页面组件。当我意识到单击菜单关闭它时,我所做的是在 componentDidUpdate() 函数中添加一个小片段:
componentDidUpdate(){
//work around for menu not closing.
document.getElementById("rootDiv").click();
}
这实际上会导致菜单在新页面开始加载后关闭。问题已解决。