Reactjs onMouseOver 和 onMouseOut 事件循环在尝试 Popover

Posted

技术标签:

【中文标题】Reactjs onMouseOver 和 onMouseOut 事件循环在尝试 Popover【英文标题】:Reactjs onMouseOver and onMouseOut event loop in a try for Popover 【发布时间】:2020-07-02 14:33:00 【问题描述】:

我正在尝试创建一个 React Material Popover(https://material-ui.com/api/popover/) 元素,当用户将鼠标悬停在 TableRow (https://material-ui.com/api/table-row/) 上时显示,当用户将鼠标悬停在 TableRow 之外时隐藏。

我已经尝试过的:

const handlePopoverOpen = event => 
  setAnchorEl(event.currentTarget);
;


const handlePopoverClose = event => 
    setAnchorEl(null);
  ;

const open = Boolean(anchorEl);

。 . .

<TableRow
   selected=props.selected === key ? true : false
   hover=true
   key=key className=classes.tableBodyRow
   onClick=() => props.onSelectChange(key, prop[0], prop[1])
   onMouseOver=handlePopoverOpen
   onMouseOut=handlePopoverClose            
>

。 . .

<Popover
    id="mouse-over-popover"
    open=open
    anchorEl=anchorEl
    anchorOrigin=
      vertical: 'bottom',
      horizontal: 'center',
    
    transformOrigin=
      vertical: 'top',
      horizontal: 'left',
    
    onClose=handlePopoverClose
  >
    I use Popover
  </Popover>

当鼠标悬停在 TableRow 上时会出现弹出框,但随后它会一直闪烁,就像 onMouseOver() 和 onMouseOut() 的无限循环一样。我一直在调查这个问题几个小时,我找不到这个问题的解释。如果有人可以提供帮助,我将不胜感激!

这是一个代码现场演示: https://codesandbox.io/s/heuristic-banach-071f3?fontsize=14&hidenavigation=1&theme=dark

【问题讨论】:

你能做一个在线演示吗?这可能有助于其他人快速解决您面临的问题! 好的!我会尝试演示一下。 这个问题现在直接在 React 中的 MouseEnter 和 MouseLeave 事件上发生在我身上,但它只是发生在我在 Firefox 上测试的 chrome 上并且问题没有发生它似乎在 MouseEnter 上有一个无限循环和鼠标离开事件。如果有人知道如何解决它,我将不胜感激。 @cristian.nieto.dev 我记得我从来没有找到解决方案,所以我决定改变设计。但正如我现在所看到的,上面沙箱中提供的链接有效。看看,可能是谷歌浏览器内部的问题 【参考方案1】:

您是否查看了https://material-ui.com/components/popover/ 的“鼠标悬停交互”部分?

我看不到您的其余代码,因此很难就您需要进行的确切更改提供建议,但您的解决方案与示例有点不同:

<Typography
  aria-owns=open ? 'mouse-over-popover' : undefined
  aria-haspopup="true"
  onMouseEnter=handlePopoverOpen
  onMouseLeave=handlePopoverClose
>
  Hover with a Popover.
</Typography>

添加:

看到整个代码后,我会做出这些改变:

    使您的 tableData 数组成为对象数组而不是数组数组
const tableData = [name: "Nick", age: 15, name: "George", age: 10, name: "John", age: 11];
    tableBody 中更改您的代码以反映这一点
<TableBody>
  tableData.map(data => 
    return (
      <TableRow
        key=data.name
        hover=true
        aria-haspopup="true"
        onMouseOver=handlePopoverOpen
        onMouseOut=handlePopoverClose
      >
        <TableCell>data.name</TableCell>
        <TableCell>data.age</TableCell>
      </TableRow>
    )
  )
</TableBody>

注意:key 必须是唯一的,所以不能有重复的名称。最好的选择是向对象添加一个唯一的id 并将其用作键。

id: 1, name: "Nick", age: 15

然后测试弹出框!

【讨论】:

是的,这是我用来构建实现的模板。 onMouseEnter 和 onMouseLeave 产生相同的结果。 Popover 组件在无限循环中显示和消失。 好的,我需要查看更多代码来进行测试。你确实有AnchorEl 的状态,对吗? 我为 anchorEl 使用了一个 React 钩子: const [anchorEl, setAnchorEl] = useState(null);以及两个函数:handlePopoverOpen =&gt; (event) setAnchorEl(event.target)handlePopoverClose =&gt;setAnchorEl(null) 我将等待演示,但请检查您是否使用 setAnchorEl(event.currentTarget) ,如您的示例所示。 看到演示后,我在答案中添加了一个部分:)

以上是关于Reactjs onMouseOver 和 onMouseOut 事件循环在尝试 Popover的主要内容,如果未能解决你的问题,请参考以下文章

ReactJS - 更改图像 onMouseOver 不起作用

常用的方法

如何在 ReactJS 中启用悬停

在 reactjs 中悬停时显示组件 [关闭]

如何使用 Vim 提取匹配正则表达式的文本?

JS学习笔记9之event事件及其他事件