Antd - 是不是可以阻止空格键关闭弹出菜单?

Posted

技术标签:

【中文标题】Antd - 是不是可以阻止空格键关闭弹出菜单?【英文标题】:Antd - Is it possible to stop the spacebar from closing a popover menu?Antd - 是否可以阻止空格键关闭弹出菜单? 【发布时间】:2022-01-15 14:51:25 【问题描述】:

我正在使用带有文本输入组件的popover component。每当用户点击空格键时,弹出框就会关闭。

我真正需要的是在用户按下空格键时阻止 Antd 调用 onVisibleChange。我试过在输入上使用event.stopPropogation()event.preventDefault,但没有运气。我在弹出框内有一堆下拉菜单、选择等,因此创建我自己的弹出框似乎很难处理 handleOutsideClick 功能。

我的 Popover 看起来像:

  <Popover
        content=content
        title=null
        trigger="click"
        getPopupContainer=(triggerNode) => triggerNode
        onVisibleChange=onChange
        visible=showMenu
   >

TLDR:我只想在按下空格键时阻止弹出框关闭。但是,如果您在其外部单击,我也希望将其保持关闭状态。

【问题讨论】:

能否请您在codesandbox中分享您的代码,以便我可以帮助您? 如果popover里面的内容很多,用Modal组件ant.design/components/modal不是更好吗?我认为它具有您正在查看的行为,即默认情况下在外部单击时关闭模式。 @HDM91 这里是复制链接codesandbox.io/s/antd-reproduction-template-forked-w1jke?file=/… @RajindRuparathna 对于我们的 UI,我们确实需要弹出窗口以通过打开它的按钮出现。弹出框/工具提示在各方面都很完美,除了能够按空格键。 【参考方案1】:

我相信空格键会关闭弹出框的原因是因为默认情况下按钮是聚焦的。您可以使用 ref 并删除焦点 inputRef.current?.blur();,如下所示。

https://codesandbox.io/s/antd-reproduction-template-forked-g0xld

import React,  useState, useRef  from "react";
import  Button, Popover, Input  from "antd";

const HistogramInsight = (props) => 
  const [isVisible, setIsVisible] = useState(false);
  const inputRef = useRef(null)

  const handleVisibleChange = (isVisible) => 
    setIsVisible(isVisible);
    if (isVisible) 
      inputRef.current?.blur();
    
  ;
  return (
    <div style= width: 300 >
      <h2>I want to have an input in a popover/tooltip.</h2>
      <h4>Hitting the spacebar with the popover open will close it.</h4>
      <Popover
        content=
          <Input style= width: 200  placeholder="Type Hello World" />
        
        title=null
        trigger="click"
        visible=isVisible
        onVisibleChange=handleVisibleChange
        getPopupContainer=(triggerNode) => triggerNode
      >
        <Button ref=inputRef>Open Popover</Button>
      </Popover>
    </div>
  );
;

export default HistogramInsight;

【讨论】:

【参考方案2】:

我认为您必须有一个 ref 来指示是否使用 useRef 按下了空格键,并且在可见更改处理程序中使用它来决定不隐藏弹出框,这不是我喜欢的方式,但它现在可能对您有用。如果我找到另一种更好的方法,我会在这里告诉你

const HistogramInsight = (props) => 
  const [isVisible, setIsVisible] = useState(false);
  const spacePressedRef = useRef(false);

  const handleVisibleChange = (isVisible) => 
    if (spacePressedRef.current) 
      setIsVisible(true);
      spacePressedRef.current = false;
     else 
      setIsVisible(isVisible);
    
  ;

  const handleKeyUp = (event) => 
    if (event.which === 32) 
      spacePressedRef.current = true;
      console.log("Space pressed.");
    
  ;

  return (
    <div style= width: 300 >
      <h2>I want to have an input in a popover/tooltip.</h2>
      <h4>Hitting the spacebar with the popover open will close it.</h4>
      <Popover
        content=
          <Input
            onKeyUp=handleKeyUp
            style= width: 200 
            placeholder="Type Hello World"
          />
        
        title=null
        trigger="click"
        visible=isVisible
        onVisibleChange=handleVisibleChange
        getPopupContainer=(triggerNode) => triggerNode
      >
        <Button>Open Popover</Button>
      </Popover>
    </div>
  );
;

export default HistogramInsight;

Fixed Codesandbox

【讨论】:

以上是关于Antd - 是不是可以阻止空格键关闭弹出菜单?的主要内容,如果未能解决你的问题,请参考以下文章

苹果手机怎么阻止弹出网页

IE8怎么把已经允许弹出的窗口重新阻止该窗口弹出呢?

winform如何让弹出窗口始终置于程序最顶层

如何在 sprite kit swift 中制作弹出菜单? [关闭]

如何关掉屏蔽电脑桌面的弹窗广告

confirm多次以后弹出后,不是取消、确认了,而是关闭网页,何解