如何在鼠标悬停时打开 react-bootstrap Dropdown?

Posted

技术标签:

【中文标题】如何在鼠标悬停时打开 react-bootstrap Dropdown?【英文标题】:How can I make react-bootstrap's Dropdown open on mouse hover? 【发布时间】:2017-08-18 01:25:59 【问题描述】:

好的,问题很简单。我需要在鼠标悬停而不是单击时打开下拉菜单。

目前我的代码如下。

    <Nav>
      <NavDropdown
        onMouseEnter = ()=> isOpen=true
        open=isOpen
        noCaret
        id="language-switcher-container"
      >
        <MenuItem>Only one Item</MenuItem>
      </NavDropdown>
    </Nav>

如您所见,我尝试了 onMouseEnter 但没有效果。有人可以解决这个问题吗?我应该传递什么属性来实现这一点。

API 页面在这里react-bootstrap API page

【问题讨论】:

首先如果你需要一个组件重新渲染,你需要设置一个新的状态,或者新的道具。您可以通过将 isOpen 添加到状态来实现您的目标,然后调用 setState onMouseEnter 是的,我采用了与您建议的完全相同的代码!!感谢您的帮助! 【参考方案1】:

另一种方式

const HoverDropDown = ( children, ...rest ) => 
   const [show, setShow] = useState(false);

   return (
      <NavDropdown ...rest show=show onMouseEnter=() => setShow(true) onMouseLeave=() => setShow(false)>
         children
      </NavDropdown>
   );


<Nav>
   <HoverDropDown id="language-switcher-container" title="Menu">
      <Dropdown.Item>Item 1</Dropdown.Item>
   </HoverDropDown>         
</Nav>

【讨论】:

【参考方案2】:

受Rei Dien's answer 的启发,以下是使用 React Hooks 的方法。

export const Menu = () => 
  const [menuOpen, toggleMenuOpen] = useState(false);

  return (
    <Dropdown
      onMouseEnter=() => 
        toggleMenuOpen(true);
      
      onMouseLeave=() => 
        toggleMenuOpen(false);
      
      show=menuOpen
    >
      <Dropdown.Toggle>
        Menu
      </Dropdown.Toggle>

      <Dropdown.Menu>
        <Dropdown.Item href="#">Menu!!!</Dropdown.Item>
      </Dropdown.Menu>
    </Dropdown>
  );
;

【讨论】:

【参考方案3】:

就这么简单:)

<NavDropdown onMouseEnter=(e) => document.getElementById("idofthiselement").click() onMouseLeave=(e) => document.getElementById("idofthiselement").click() title="Others" id="idofthiselement">

【讨论】:

【参考方案4】:

我自己也遇到过这个问题,我发现你需要 bootstrap CSS 和 react-bootstrap 的参数。添加以下 CSS:

.dropdown:hover>.dropdown-menu 
  display: block;

然后你需要为子元素添加参数renderMenuOnMount=true在加载时渲染:

<NavDropdown renderMenuOnMount=true>
  <NavDropdown.Item href="#">Item #1</NavDropdown.Item>
</NavDropdown>

【讨论】:

【参考方案5】:

基于@Rei Dien 的回答

   onMouseEnter =  this.handleOpen.bind(this) 
   onMouseLeave =  this.handleClose.bind(this) 

【讨论】:

【参考方案6】:

这似乎是一个 hacky 解决方案,但它是让我的应用在更新后保持运行的最简单方法。

在最新更新中,dropdown-menu 在单击按钮之前不会呈现。

我一直在我的 css 中使用它:

.dropdown:hover .dropdown-menu 
    display: block;

并将其添加到我的组件中

  componentDidMount() 
    // TODO: Fix so menu renders automatically w/out click
    const hiddenNavToggle = document.getElementById('navbar__hamburger_wrapper-hidden_click')
    hiddenNavToggle.click()
    hiddenNavToggle.click()
  

我添加了一个带有给定 id 的包装 div,只是为了点击它。

我很想听听另一种解决方案。

【讨论】:

【参考方案7】:

这里有一个更干净的纯 CSS 解决方案:

.dropdown:hover .dropdown-menu display: block;

【讨论】:

这不应该是公认的答案。只需尝试将鼠标移到下拉菜单元素上 - 下拉菜单再次关闭。 @rbtbar,你在使用嵌套菜单吗?我已经在没有嵌套菜单的情况下进行了测试,它工作正常。 “反应引导”:“^0.32.4” 这在较新的版本中不起作用,直到第一次点击下拉菜单才会呈现。您需要先触发 onclick,然后才能通过 css 进行控制【参考方案8】:
export class Nav extends React.Component 

  constructor(props) 
    super(props)
    this.state =  isOpen: false 
  

  handleOpen = () => 
    this.setState( isOpen: true )
  

  handleClose = () => 
     this.setState( isOpen: false )
  

  render() 
    return (
       <Nav>
        <NavDropdown
          onMouseEnter =  this.handleOpen 
          onMouseLeave =  this.handleClose 
          open= this.state.isOpen 
          noCaret
          id="language-switcher-container"
        >
          <MenuItem>Only one Item</MenuItem>
        </NavDropdown>
      </Nav>
    )
  

希望这能解决您的问题。

【讨论】:

再次感谢,它有效。我想我需要改变我的想法,从传统的前端转向状态控制的渲染技术。 道具open已经不存在了,它已经被重命名为show 此技术将打开页面上的所有下拉菜单。您如何将其限制为有针对性的特定下拉菜单?或者将鼠标悬停在整个页面的多个其他下拉菜单上? 对不同的下拉菜单使用不同的状态【参考方案9】:

你可以复制这个https://codepen.io/bsngr/pen/frDqh,它使用下面的JS

$('ul.nav li.dropdown').hover(function() 
  $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(500);
, function() 
  $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(500);
);

或者你也可以安装一个像https://github.com/CWSpear/bootstrap-hover-dropdown这样的插件

编辑:完美的引导解决方案,但我现在注意到你说它的反应,我以前没有使用过,但我不明白为什么上面的 js 不能工作,即使它需要调整

【讨论】:

感谢您的帮助,是的,我正在使用引导程序,因此这样做可能不是一个好主意, 就像我说的我不熟悉反应,但我使用引导程序。如果您在自己的 js 文件中弹出该代码并确保您有一个 .dropdown-menu 等以便它工作,那么我不明白为什么这不是一个好主意? 使用 jQuery 操作 DOM 违背了使用 React 的全部目的——一个组件库。

以上是关于如何在鼠标悬停时打开 react-bootstrap Dropdown?的主要内容,如果未能解决你的问题,请参考以下文章

openlayers简单的鼠标悬停在标记上

如何在悬停时暂停引导轮播并在鼠标悬停时恢复它?

在鼠标悬停上打开菜单,在mouseleave上关闭菜单进行反应

如何使用 jQuery 在鼠标悬停时找到当前元素?

如何在鼠标悬停时更改边框粗细

当鼠标悬停而不是 pyFLTK 中的小部件时如何调用函数?