javascript - ReactJS 下拉菜单,在打开当前菜单之前关闭其他菜单
问题描述
我做了一些下拉菜单:
export default class DropdownMenu extends Component {
constructor(props) {
super(props)
this.state = {
menuOpen: false,
highlight: false,
count: this.props.count | 0
}
this.showDropdown = this.showDropdown.bind(this);
}
componentDidMount() {
}
showDropdown() {
this.setState({
menuOpen: !this.state.menuOpen
});
}
render() {
return <div className="dropdown__menu" onClick={this.showDropdown}>
{this.props.text} {this.state.count > 0 ? <b>{this.state.count}</b> : ''}
<div className="dropdown__content" style={this.state.menuOpen ? {'display': 'block'} : {'display': 'none'}}>
{this.props.children}
</div>
</div>
}
}
问题是您可以打开所有这些并让它们保持打开状态,直到您再次单击它们以关闭它们。如果打开另一个菜单,我如何使它关闭任何其他打开的菜单?
这是它们的实现位置:
render() {
...
<div className="filter_container">
<DropdownMenu text="New" count={127} disabled/>
<DropdownMenu text="Only show">
<li>New</li>
<li>Old</li>
</DropdownMenu>
<DropdownMenu text="Other">
<li>one</li>
<li>two</li>
</DropdownMenu>
<DropdownMenu text="Sort by">
<li>Name</li>
<li>Age</li>
<li>Value</li>
</DropdownMenu>
</div>
</div>
...
解决方案
你可以玩,onBlur
因为当另一个被点击时它会失去焦点。
class DropDown extends React.Component {
state = {
isVisible: false
}
closeMenu = () => {
this.setState({ isVisible: false })
}
toggleMenu = () => {
this.setState(prevState => ({ isVisible: !prevState.isVisible }))
}
render() {
const { isVisible } = this.state;
return (
<div
className="dropdown__menu"
onBlur={this.closeMenu}
tabIndex={0}
role="menu"
onClick={this.toggleMenu}>
{isVisible ? 'visible' : 'hidden'}
</div>
)
}
}
const App = () => (
<div>
<DropDown />
<DropDown />
</div>
)
ReactDOM.render(<App />, document.getElementById('root'));
.dropdown__menu {
outline: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>
推荐阅读
- docker - 检查访问了多少 docker 映像?
- python - Numpy polyfit 预测 - 如何在“训练”数据中包含错误?
- javascript - 调用 location.reload() 后如何运行附加的 JS 函数?
- angular - 在 Windows nginx 服务器上运行 Angular Springboot 应用程序 - nginx.conf 设置
- javascript - 给定不同的唯一键:值,是否可以使用“=”设置一个对象属性?
- pandas - 如何在pandas groupby之后将行旋转到列
- oracle - 当 Oracle Function 没有输入值时,Spring Boot SimpleJdbcCall 失败
- java - 如何替换特定位置的特殊字符
- mysql - 从一个表中提取记录,其中 1 个变量存在于第二个表中?非常大的桌子
- kotlin - 为什么在 Intellij IDEA 中代码中存在 ENQ/ESA unicode 字符会导致它显示错误的多字符文字错误?