【问题标题】:Issue in displaying submenu on hover悬停时显示子菜单的问题
【发布时间】:2020-04-23 16:30:19
【问题描述】:

我正在使用 reactstrap 制作一个 reactjs 应用程序,其中我制作了一个包含子菜单的下拉菜单。

我正在尝试实现使子菜单在悬停在下拉菜单上时显示的结果,如果有n 下拉数字,则需要显示与悬停项目相关的子菜单。

代码尝试:

<Dropdown
  className="d-inline-block"
  onMouseOver={this.onMouseEnter}
  onMouseLeave={this.onMouseLeave}
  isOpen={this.state.dropdownOpen}
  toggle={this.toggle}
>
  <DropdownToggle caret>Dropdown1</DropdownToggle>
  <DropdownMenu>
    <DropdownItem header>Submenu 1</DropdownItem>
    <DropdownItem>Submenu 1.1</DropdownItem>
  </DropdownMenu>
  &nbsp;&nbsp;&nbsp;
  <DropdownToggle caret>Dropdown2</DropdownToggle>
  <DropdownMenu>
    <DropdownItem header>Submenu 2</DropdownItem>
    <DropdownItem>Submenu 2.1</DropdownItem>
    <DropdownItem>Submenu 2.2</DropdownItem>
  </DropdownMenu>
  &nbsp;&nbsp;&nbsp;
  <br />
  <br />
  <DropdownToggle caret>Dropdown3</DropdownToggle>
  <DropdownMenu>
    <DropdownItem header>Submenu 3</DropdownItem>
    <DropdownItem>Submenu 3.1</DropdownItem>
    <DropdownItem>Submenu 3.2</DropdownItem>
    <DropdownItem>Submenu 3.3</DropdownItem>
  </DropdownMenu>
</Dropdown>

Click here for working demo

预期结果:http://supply.com/

在上面给出的链接中,您可以看到水平菜单,悬停时将显示它们各自的子菜单,我需要实现相同的行为。

【问题讨论】:

    标签: css reactjs twitter-bootstrap reactstrap megamenu


    【解决方案1】:
    1. 您需要将这些菜单分开并放入一个 &lt;Dropdown&gt; 组件中。
    2. 并且您需要为它们中的每一个设置一个事件处理程序。
    3. 您可以使用Array.prototype.map 来简化设置处理程序。
    import React from "react";
    import {
      Dropdown,
      DropdownToggle,
      DropdownMenu,
      DropdownItem
    } from "reactstrap";
    
    export default class Example extends React.Component {
      constructor(props) {
        super(props);
    
        this.onMouseEnter = this.onMouseEnter.bind(this);
        this.onMouseLeave = this.onMouseLeave.bind(this);
        this.state = {
          dropdownOpen: -1
        };
        this.toggle = this.toggle.bind(this);
    
        this.menus = [
          {
            title: "Bathroom",
            submenus: [{ title: "Toilets" }, { title: "Toilet seats" }]
          },
          {
            title: "Kitchen",
            submenus: [{ title: "Farmhouse Sinks" }, { title: "Cast Iron Sinks" }]
          }
        ];
      }
    
      onMouseEnter(current) {
        this.setState({ dropdownOpen: current });
      }
    
      onMouseLeave() {
        this.setState({ dropdownOpen: -1 });
      }
    
      toggle() {}
    
      render() {
        return (
          <div>
            {this.menus.map((menu, i) => (
              <Dropdown
                className="d-inline-block"
                onMouseOver={e => this.onMouseEnter(i)}
                onMouseLeave={this.onMouseLeave}
                isOpen={this.state.dropdownOpen === i}
                toggle={this.toggle}
              >
                <DropdownToggle caret>{menu.title}</DropdownToggle>
                <DropdownMenu>
                  {menu.submenus.map((submenu, i) => (
                    <DropdownItem header>{submenu.title}</DropdownItem>
                  ))}
                </DropdownMenu>
              </Dropdown>
            ))}
          </div>
        );
      }
    }
    

    stackblitz:https://stackblitz.com/edit/reactstrap-v6-qsffjj

    【讨论】:

    • 你能在 stackblitz 中创建任何同样的例子吗?
    • 感谢您的帮助,我怎样才能在我的实际应用程序中获得相同的结果,其中下拉名称将与问题supply.com 中提供的链接完全相同。如果您帮助我显示菜单和子菜单完全一样,我非常感谢你的帮助,因为我是 reactjs 的新手,我无法得到处理它的图片。我真正的应用程序菜单只会像那个链接,我也在努力实现一样的..
    • @TestUser 我已经编辑了帖子和 stackblitz。我认为您可以更改menus 以获得您想要的。
    • 感谢您的帮助,但为什么默认情况下第一个下拉菜单是打开的.. 它应该只在悬停时打开..
    • @TestUser 默认值 state.dropdownOpen 不正确。我已经修好了。
    猜你喜欢
    • 1970-01-01
    • 2013-11-16
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 2018-02-09
    相关资源
    最近更新 更多