解决 shadui组件库Popover 点击后会消失

react用了shadui组件库

        <Popover>
          <PopoverTrigger>
            <div className="text-operation-item" onClick={props.callback}>
              <img src={props.imgSrc} width={20} height={20} />
            </div>
          </PopoverTrigger>
          <PopoverContent className="text-operation-bar">
          {props?.childComponent}
          </PopoverContent>
        </Popover>

原因

shadcn/ui 的 Popover 底层是基于 @radix-ui/react-popover,默认行为是:

PopoverContent 里的任何点击事件,如果冒泡到 document,就会触发 Popover 的自动关闭。

📌 为什么点 childComponent 会让 Popover 关闭?
因为 @radix-ui/react-popover 会监听 onPointerDownOutside / onInteractOutside 事件,判断如果点击不是在 PopoverTrigger 或 PopoverContent 里,就关闭 Popover。
如果你的 childComponent 内部点击事件没有 stopPropagation,或者它的 focusable 元素 blur 了,也会触发关闭

解决办法:

方法 1:
给 childComponent 里的元素加 onClick={(e) => e.stopPropagation()}

<input onClick={(e) => e.stopPropagation()} />

如果 childComponent 是个自定义组件,也要确保它内部点击事件 stop 了冒泡。

方法 2:
利用 Popover 的 onOpenChange 和 open 手动控制开关状态
如果希望 Popover 点里面的内容不消失,推荐受控写法:

const [open, setOpen] = useState(false);

<Popover open={open} onOpenChange={setOpen}>
  <PopoverTrigger>...</PopoverTrigger>
  <PopoverContent>
    <input onClick={(e) => e.stopPropagation()} />
  </PopoverContent>
</Popover>

这样你能完全控制 Popover 的开关逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值