当我单击导航栏中的单个下拉菜单链接时,也会显示或显示所有下拉菜单链接。如何只显示一个下拉菜单链接来解决此问题?
我尝试更改指向aria-labelledby的ID值
这是我的应用程序的状态
state = {
dropDown: false
};
handleDropdown = e => {
this.setState({ dropDown: !this.state.dropDown });
};
内部渲染功能
render() {
const { dropDown } = this.state;
/*Conditional statement to select a class base on the state*/
const dropMenu = dropDown ? 'dropdown-menu show' : 'dropdown-menu';
/*The two dropdown menu list the displays(both) even when one is clicked*/
<li className="nav-item dropdown">
<Link
onClick={this.handleDropdown}
className="nav-link dropdown-toggle"
href="#"
id="navbarDropdown"
role="button"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
>
Dropdown
</Link>
<div className={dropMenu} aria-labelledby="navbarDropdown">
<Link className="dropdown-item" to="#">
Action
</Link>
<Link className="dropdown-item" to="#">
Another action
</Link>
<div className="dropdown-divider" />
<Link className="dropdown-item" to="#">
Something else here
</Link>
</div>
</li>
<li className="nav-item dropdown">
<Link
onClick={this.handleDropdown}
className="nav-link dropdown-toggle"
href="#"
id="navbarDropdown"
role="button"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
>
Dropdown
</Link>
<div className={dropMenu} aria-labelledby="navbarDropdown">
<Link className="dropdown-item" to="#">
Action
</Link>
<Link className="dropdown-item" to="#">
Another action
</Link>
<div className="dropdown-divider" />
<Link className="dropdown-item" to="#">
Something else here
</Link>
</div>
</li>
};
答案 0 :(得分:1)
更新代码
如下更改状态变量:
state = {
dropDownState: [false, false]
};
由于您只有两个li > div
,所以该数组包含两个元素,如果菜单项增加,也要增加它们。
然后div看起来像
<div className={dropMenu[0]} aria-labelledby="navbarDropdown">
和
<div className={dropMenu[1]} aria-labelledby="navbarDropdown">
每个函数绑定看起来像
onClick={() => this.handleDropdown(0)}
onClick={() => this.handleDropdown(1)}
然后,实际功能将更改为
handleDropdown = (menuIndex) => {
let newMenuState = this.state.dropDownState.map((val, index) => {
if(index === menuIndex) {
return !val
} else return val
});
this.setState({ dropDownState: newMenuState })
};
请注意,我还没有运行代码,但是您应该明白这一点。
旧答案
将值绑定到函数而不是调用函数:
更改
onClick={this.handleDropdown}
收件人
onClick={() => this.handleDropdown()}
答案 1 :(得分:1)
因为您只有1种状态来处理显示和隐藏下拉菜单。尝试这样做:
state = {
dropDown: {
link1: false,
link2: false,
}
}
handleDropdown = e => {
const { id } = e.target;
this.setState(prevState => ({
dropDown : {
...prevState.dropDown,
[id]: !prevState.dropDown[id],
}
}));
}
render() {
const { dropDown } = this.state;
/*Conditional statement to select a class base on the state*/
const dropMenu = dropDown ? 'dropdown-menu show' : 'dropdown-menu';
/*The two dropdown menu list the displays(both) even when one is clicked*/
<li className="nav-item dropdown">
<Link
onClick={this.handleDropdown}
className="nav-link dropdown-toggle"
href="#"
id="link1" // name your id same as the variable from state dropDown
role="button"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
>
Dropdown
</Link>
<div className={`dropdown-menu ${dropDown.link1 ? 'show' : ''}`} aria-labelledby="navbarDropdown">
<Link className="dropdown-item" to="#">
Action
</Link>
<Link className="dropdown-item" to="#">
Another action
</Link>
<div className="dropdown-divider" />
<Link className="dropdown-item" to="#">
Something else here
</Link>
</div>
</li>
<li className="nav-item dropdown">
<Link
onClick={this.handleDropdown}
className="nav-link dropdown-toggle"
href="#"
id="link2" // name your id same as the variable from state dropDown
role="button"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
>
Dropdown
</Link>
<div className={`dropdown-menu ${dropDown.link2 ? 'show' : ''}`} aria-labelledby="navbarDropdown">
<Link className="dropdown-item" to="#">
Action
</Link>
<Link className="dropdown-item" to="#">
Another action
</Link>
<div className="dropdown-divider" />
<Link className="dropdown-item" to="#">
Something else here
</Link>
</div>
</li>
}
希望它能起作用。