You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击下拉菜单外部后Tooltip意外触发问题排查

问题:Dropdown菜单关闭时误触发Tooltip

我实现了一个包含Tooltip和Dropdown Menu的组件,触发下拉菜单后,点击菜单内部或外部关闭菜单时,Tooltip会被错误触发。正常场景下,鼠标悬停按钮时Tooltip触发正常,点击按钮打开下拉菜单也正常,但关闭菜单的操作会误触发Tooltip。

相关代码如下:

<DropdownMenu>
  <Tooltip>
    <DropdownMenuTrigger asChild>
      <TooltipTrigger asChild>
        <Button variant="ghost">
          Type
          <BiFilter className="ml-2 h-5 w-5" />
        </Button>
      </TooltipTrigger>
    </DropdownMenuTrigger>
    <DropdownMenuContent align="end">
      <DropdownMenuRadioGroup
        value={filter}
        onValueChange={handleFilterChange}
      >
        {ValuesToMap.map((value) => (
          <DropdownMenuRadioItem key={value} value={value}>
            value
          </DropdownMenuRadioItem>
        ))}
      </DropdownMenuRadioGroup>
    </DropdownMenuContent>
    <TooltipContent>
      Filter By Type
    </TooltipContent>
  </Tooltip>
</DropdownMenu>

解决方法

1. 调整组件嵌套层级

问题根源在于当前嵌套顺序让Tooltip监听了Dropdown菜单的交互事件。将Tooltip作为DropdownTrigger的子元素,而非包裹整个Dropdown,就能避免菜单关闭时的误触发:

<DropdownMenu>
  <DropdownMenuTrigger asChild>
    <Tooltip>
      <TooltipTrigger asChild>
        <Button variant="ghost">
          Type
          <BiFilter className="ml-2 h-5 w-5" />
        </Button>
      </TooltipTrigger>
      <TooltipContent>
        Filter By Type
      </TooltipContent>
    </Tooltip>
  </DropdownMenuTrigger>
  <DropdownMenuContent align="end">
    <DropdownMenuRadioGroup
      value={filter}
      onValueChange={handleFilterChange}
    >
      {ValuesToMap.map((value) => (
        <DropdownMenuRadioItem key={value} value={value}>
          {value}
        </DropdownMenuRadioItem>
      ))}
    </DropdownMenuRadioGroup>
  </DropdownMenuContent>
</DropdownMenu>

2. 基于Dropdown状态禁用Tooltip

如果需要保留原有嵌套结构,可以通过Dropdown的open状态控制Tooltip的启用状态。以shadcn/ui组件为例,使用useDropdownMenu钩子获取状态后,给Tooltip添加disabled属性:

import { useDropdownMenu } from '@/components/ui/dropdown-menu';

// 在组件内部获取状态
const { open } = useDropdownMenu();

// 渲染部分
<DropdownMenu>
  <Tooltip disabled={open}>
    <DropdownMenuTrigger asChild>
      <TooltipTrigger asChild>
        <Button variant="ghost">
          Type
          <BiFilter className="ml-2 h-5 w-5" />
        </Button>
      </TooltipTrigger>
    </DropdownMenuTrigger>
    <DropdownMenuContent align="end">
      {/* 菜单内容 */}
    </DropdownMenuContent>
    <TooltipContent>
      Filter By Type
    </TooltipContent>
  </Tooltip>
</DropdownMenu>

当Dropdown菜单处于打开状态时,Tooltip会被禁用,关闭菜单时就不会触发Tooltip了。

内容的提问来源于stack exchange,提问作者steve123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:50:01