【问题标题】:React-Bootstrap dropdown on hover悬停时的 React-Bootstrap 下拉菜单
【发布时间】:2020-06-07 22:58:52
【问题描述】:

我正在开发我的第一个 react-bootstrap 网站,我注意到导航栏中的下拉菜单不允许悬停下拉菜单。

我想知道是否有解决方法。我尝试在我的 CSS 中添加一些代码。 演示 - https://codesandbox.io/s/react-bootstrap-nav-active-link-5v5jq?fontsize=14&hidenavigation=1&theme=dark

/*MENU*/
.dropdown:hover {
  display: block;
}
/*END MENU*/

但是,这不起作用

这是代码。

import React from 'react';
import {Nav, Navbar, NavDropdown } from 'react-bootstrap';
import '../App.css';

function Header() {
    return (
            <Navbar bg="transparent" variant="dark" expand="lg">
            <Navbar.Brand href="#home" className="App-logo">AdStichr</Navbar.Brand>
            <Navbar.Toggle aria-controls="basic-navbar-nav" />
            <Navbar.Collapse id="basic-navbar-nav">
                <Nav className="ml-auto">
                <Nav.Link href="#home">Home</Nav.Link>
                <Nav.Link href="#link">Link</Nav.Link>
                <NavDropdown title="Dropdown" id="basic-nav-dropdown" alignRight>
                    <NavDropdown.Item href="#action/3.1">Action</NavDropdown.Item>
                    <NavDropdown.Item href="#action/3.2">Another action</NavDropdown.Item>
                    <NavDropdown.Item href="#action/3.3">Something</NavDropdown.Item>
                    <NavDropdown.Divider />
                    <NavDropdown.Item href="#action/3.4">Separated link</NavDropdown.Item>
                </NavDropdown>
                </Nav>

            </Navbar.Collapse>
            </Navbar>
    )
}
export default Header;

甚至试过这个

const Header = props => {
    const { location } = props;
    const [isOpen, updateIsOpen] = useState(false);
    return (
        <Navbar bg="transparent" variant="dark" expand="lg">
        <Navbar.Brand href="#home" className="App-logo">AdStichr</Navbar.Brand>
        <Navbar.Toggle aria-controls="basic-navbar-nav" />
        <Navbar.Collapse id="basic-navbar-nav">
            <Nav className="ml-auto" activeKey={location.pathname}>
            <Nav.Link href="/">Home</Nav.Link>
            <Nav.Link href="/advertisers">Advertisers</Nav.Link>
            <NavDropdown title="Publishers" id="basic-nav-dropdown" alignRight
             onMouseOver={() => updateIsOpen(true)}
             onFocus={() => updateIsOpen(true)}
             onMouseLeave={() => updateIsOpen(false)}
             onBlur={() => updateIsOpen(false)}
             toggle={() => updateIsOpen(!isOpen)}
             isOpen={isOpen}>
                <NavDropdown.Item href="/publishers/radio">Radio Stations</NavDropdown.Item>
                <NavDropdown.Divider />
                <NavDropdown.Item href="/publishers/podcasters">Audio Podcasters</NavDropdown.Item>
                <NavDropdown.Divider />
                <NavDropdown.Item href="/publishers/videopodcasters">Video Podcasters</NavDropdown.Item>
            </NavDropdown>
            <Nav.Link href="/case-studies">Case Studies</Nav.Link>
            <Nav.Link href="/contact">Contact</Nav.Link>
            </Nav>

        </Navbar.Collapse>
        </Navbar>
    );
  };
  const HeaderWithRouter = withRouter(Header);
  export default HeaderWithRouter;

但没有成功。

【问题讨论】:

  • 你的 dropdown 类在 dom 中在哪里??
  • 我认为我不需要将其添加为自定义类名,因为我使用的是他们已经使用的引导类。 - 还是我还需要添加它?
  • @AkhilAravind 我添加了 className="dropdown" 但它不起作用
  • @你可以创建一个stackblitz演示并分享链接,我会检查
  • 检查这是否对您有帮助 - github.com/reactstrap/reactstrap/issues/1088

标签: reactjs bootstrap-4 react-bootstrap


【解决方案1】:
const [show, setShow] = useState(false);
const showDropdown = (e)=>{
    setShow(!show);
}
const hideDropdown = e => {
    setShow(false);
}
  <NavDropdown title="Dropdown" 
   id="collasible-nav-dropdown" 
   show={show}
   onMouseEnter={showDropdown} 
   onMouseLeave={hideDropdown}
   >

我在 React Bootstrap 中将其用于悬停时打开下拉菜单。

【讨论】:

  • 解决方案很棒,但我相信它只适用于单个下拉菜单。如果多个菜单项上有多个下拉菜单怎么办?
  • 对于多个下拉菜单处理,您必须使用自定义挂钩。
  • 谢谢,一个样本会很有帮助。
【解决方案2】:

NavDropdown 组件首次挂载时不呈现下拉菜单。

CSS 解决方案:您只需在您的 NavDropdown 元素上添加 renderMenuOnMount={true},如下所示:

<NavDropdown title={name} id={name} renderMenuOnMount={true}>
...menu items...
</NavDropdown>

在 CSS 中:

.nav-item.dropdown:hover .dropdown-menu {
    display: block;
}

【讨论】:

    【解决方案3】:

    使用此代码。

      const [showDropdown, setShowDropdown] = useState(false);
      return (
        <Dropdown
          onMouseLeave={() => setShowDropdown(false)}
          onMouseOver={() => setShowDropdown(true)}
          style={{ width: '166px' }}
        >
          <Dropdown.Toggle
            className="main-style"
            id="dropdown-basic"
          >
            Dropdown Button
          </Dropdown.Toggle>
    
          <Dropdown.Menu show={showDropdown}>
            <Dropdown.Item href="#/action-1">
              Action
            </Dropdown.Item>
            <Dropdown.Item href="#/action-2">
              Another action
            </Dropdown.Item>
            <Dropdown.Item href="#/action-3">
              Something else
            </Dropdown.Item>
          </Dropdown.Menu>
        </Dropdown>
      );
    

    Codesandbox

    【讨论】:

      【解决方案4】:

      将以下代码添加到 css,在沙箱中检查并正常工作。如果您仍有问题,请告诉我。

      检查沙箱 sn -p Here

      .nav-item:hover .dropdown-menu{
        display:block!important
      }
      

      【讨论】:

      • 在 Mac 上的当前 Chrome 中似乎不起作用
      • 实际上它有时可以工作 - 你的沙箱 sn-p 根本不工作,但我的代码在我第一次点击它后就开始工作了。单击之前,悬停不起作用。但是点击后,它开始悬停
      【解决方案5】:

      这应该可行:

      .nav-item.dropdown:hover .dropdown-menu {
          display: block;
      }
      

      【讨论】:

      • 确实可以,但我必须先点击它,然后下次我将鼠标悬停在它上面时会掉下来。
      • 这个问题有什么解决办法吗?
      • 这是因为下拉菜单默认不会在挂载时呈现。您可以通过在NavDropdown 中添加renderMenuOnMount 作为道具来启用它。这是一个布尔值,因此您无需明确提及 true。
      猜你喜欢
      • 2020-07-15
      • 2020-07-15
      • 2019-10-30
      • 2018-12-27
      • 2019-12-31
      • 2017-10-24
      • 2018-12-30
      • 2016-11-04
      • 1970-01-01
      相关资源
      最近更新 更多