React NavDropdown 在点击任何 MenuItem 时隐藏

React NavDropdown hides on click of any MenuItem

您好,我正在使用 React bootstrap,NavDropdown。 我的应用程序中有一个 Navbar,我想将 NavDropdown 放在 Navbar 中,但 NavDropdown 的默认行为会在任何地方单击时隐藏下拉菜单。

我用过的解决方案:

evt.preventDefault();
evt.stopPropagation();

None 以上对我有用。

我的代码:

class CustomNavDropdown extends React.Component {

  constructor(props, context) {
    super(props, context);
    this.handleClick = this.handleClick.bind(this);
  }
  handleClick(evt) {
    evt.preventDefault();
    evt.stopPropagation();
  }
  render() {
    return (
      <NavDropdown title={"Dropdown"}>
        <MenuItem divider />
        <MenuItem onClick={this.handleClick}>an item</MenuItem>
      </NavDropdown>
    );
  }
}

所以基本上我的问题是,如果我点击任何地方,我的 NavDropdown 就会隐藏,我希望它只在我点击 <ul> 标签时隐藏,而不是 <li> 标签或申请。

我是这样解决的:

class CustomNavDropdown extends React.Component {

  constructor(props, context) {
    super(props, context);
    this.state = {menuIsOpened: false}
    this.handleToggle = this.handleToggle.bind(this);
  }
  handleToggle(toggle) {
    //you code here, change state of menuIsOpened if you want to open or close
  }
  render() {
    return (
      <NavDropdown title={"Dropdown"} open={this.state.menuIsOpened} onToggle={this.handleToggle}>
        <MenuItem divider />
        <MenuItem onClick={this.handleClick}>an item</MenuItem>
      </NavDropdown>
    );
  }
}

我设置了 NavDropdown 支持的 onToggle 事件,然后我们可以在 handleToggle 中处理该事件,并在 toggle 为布尔值的情况下对其进行任何操作。

React Bootstrap 下拉菜单可以 closed/opened 通过其属性 "Open" 将其设置为 true 或 false。 所以基本上,当您单击下拉菜单时,将状态设置为 true,当您单击 menuItem 时,将其设置为 false,然后就可以了!

const [dropDownOpen, setdropDownOpen] = React.useState(false);

下拉菜单如下:

<NavDropdown
  eventKey={index}
  open={dropDownOpen}
  key={`navItem_${index}`}
  onClick={() => {setdropDownOpen(true)}}
/>

菜单项代码如下:

<MenuItem
  onClick={() => {setdropDownOpen(false)}
/>

我可能错了,但似乎 open 已被 show 取代。实现的逻辑是一样的。

(来自@user1735921 的修改示例)

 class CustomNavDropdown extends React.Component {
  constructor(props, context) {
    super(props, context);
    this.state = {menuIsOpened: false}
    this.handleToggle = this.handleToggle.bind(this);
  }
  handleToggle(toggle) {
    //you code here, change state of menuIsOpened if you want to open or close
  }
  render() {
    return (
      <NavDropdown title={"Dropdown"} show={this.state.menuIsOpened} onToggle={this.handleToggle}>
        <MenuItem divider />
        <MenuItem onClick={this.handleClick}>an item</MenuItem>
      </NavDropdown>
    );
  }
}