我已经创建了一个侧边栏组件并将其状态设置为false以隐藏该块,直到用户单击hanmburger图标,然后显示该状态。但是,当用户单击关闭的“ X”图标时,我试图返回(或关闭侧边栏菜单)。我写了一个hideMenu方法将状态返回为false,但是它不起作用,并且没有错误。这是我写的
class SubMainNavbar extends React.Component{
constructor(){
super();
this.state = {isShown:false}
this.showMenu = this.showMenu.bind(this)
this.hideMenu = this.hideMenu.bind(this)
}
showMenu(){
this.setState({isShown: true})
}
hideMenu(){
this.setState({isShown: false})
}
render() {
return (
<div className="sub-flex-container">
<div className="co pt-4">
<ul className="flex-container sub-list">
<li>women</li>
<li>mens</li>
<li>health & beauty</li>
</ul>
<span onClick={this.showMenu} className="pl-3 hamburger hide-big pb-4"><Icon type="menu" />
<div className="mobile-menu-display" id="mySidebar" style={{display: this.state.isShown ? 'block' : 'none' }}>
<span onClick={this.hideMenu} className="float-right font-weight-bold hide-big close">X</span>
</div>
</span>
</div>
<div className="co">
{/* <a href=""><Logo className="logo" /></a> */}
<a href=""><img className="img-fluid logo" src={Logo} alt="losode logo"/></a>
</div>
<div className="co pt-4">
<span className="hide-small"><SearchInput /></span>
<div className="icon-mobile hide-big">
<ul className="flex-icon sub-flex-container">
<li><ion-icon name="search-outline"></ion-icon></li>
<li><ion-icon name="person-outline"></ion-icon></li>
<li><ion-icon name="basket-outline"></ion-icon></li>
</ul>
</div>
</div>
</div>
);
}
};
export default SubMainNavbar
您没有正确关闭tags
。根据以下内容更新代码:
<div className="sub-flex-container">
<div className="co pt-4">
<ul className="flex-container sub-list">
<li>women</li>
<li>mens</li>
<li>health & beauty</li>
</ul>
<span onClick={this.showMenu} className="pl-3 hamburger hide-big pb-4"><Icon type="menu" /></span>
<div className="mobile-menu-display" id="mySidebar" style={{display: this.state.isShown ? 'block' : 'none' }}>
<span onClick={this.hideMenu} className="float-right font-weight-bold hide-big close">X</span>
</div>
</div>
<div className="co">
...
我可以告诉您您的问题是什么。单击以隐藏菜单的跨度位于跨度内,该跨度会触发showMenu函数。您需要在设置状态之前,使用event参数调用hideMenu函数,并在hideMenu函数中使用stopPropagation函数。因此,不会触发外部范围的点击,只有内部范围会获得点击。
class SubMainNavbar extends React.Component{
constructor(){
super();
this.state = {isShown:false}
this.showMenu = this.showMenu.bind(this)
this.hideMenu = this.hideMenu.bind(this)
}
showMenu(){
this.setState({isShown: true})
}
hideMenu(event){
event.stopPropagation()
this.setState({isShown: false})
}
render() {
return (
<div className="sub-flex-container">
<div className="co pt-4">
<ul className="flex-container sub-list">
<li>women</li>
<li>mens</li>
<li>health & beauty</li>
</ul>
<span onClick={this.showMenu} className="pl-3 hamburger hide-big pb-4"><Icon type="menu" />
<div className="mobile-menu-display" id="mySidebar" style={{display: this.state.isShown ? 'block' : 'none' }}>
<span onClick={event => this.hideMenu(event)} className="float-right font-weight-bold hide-big close">X</span>
</div>
</span>
</div>
<div className="co">
{/* <a href=""><Logo className="logo" /></a> */}
<a href=""><img className="img-fluid logo" src={Logo} alt="losode logo"/></a>
</div>
<div className="co pt-4">
<span className="hide-small"><SearchInput /></span>
<div className="icon-mobile hide-big">
<ul className="flex-icon sub-flex-container">
<li><ion-icon name="search-outline"></ion-icon></li>
<li><ion-icon name="person-outline"></ion-icon></li>
<li><ion-icon name="basket-outline"></ion-icon></li>
</ul>
</div>
</div>
</div>
);
}
};
export default SubMainNavbar
ps:您可以使用箭头函数,因此不需要使用构造函数。
例如:
this.state = { isShown: false }
showMenu = () => {
this.setState({isShown: true})
}
hideMenu = event => {
event.stopPropagation()
this.setState({isShown: false})
}
您需要确保事件不会再次传递到外部容器。在您的情况下,事件是由内部元素触发的,该内部元素导致一个hideMenu,但是此后,该事件将传播到外部容器,从而导致对showMenu的调用。
有关的其他阅读资料,请参见:https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropagationhttps://www.w3schools.com/jsref/event_stoppropagation.asp
好像Padi Dev也在我面前发现了问题:)
真的很奇怪,但是您可以尝试模仿我在此代码沙箱中所做的事情吗?https://codesandbox.io/s/heuristic-fire-2jp8n?fontsize=14&hidenavigation=1&theme=dark
应该尽可能简单