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 的開關邏輯。