IME 兼容问题 问题在Window系统下拉面板中的Input输入中文时下拉面板预期外关闭IME 工作原理Windows系统的 IME 候选词窗口是OS级别的独立浮层。用户在Input中输入拼音时候选框覆盖在页面上方浏览器将此识别为mouseleave事件鼠标离开了Dropdown区域从而触发hover trigger的关闭逻辑。macOS的 IME 采用内联渲染、不产生独立浮层故不受影响。排查过程antd Select组件不存在类似现象。对比发现根本差异Select默认click trigger仅点击外部时关闭不受mouseleave影响自定义场景使用Dropdown hover triggermouseleave即触发关闭。为什么hover触发而click不触发。rc-trigger内部根据trigger类型决定是否监听mouseleave来关闭popupclick模式下popup的关闭由useWinClick监听全局mousedown实现只有点击popup外部才会关闭键盘输入和IME候选窗均不会触发hover模式下hoverToHidetrueonPopupMouseLeave被注册到popup的onMouseLeave任何导致mouseleave触发的行为包括 IME 候选窗覆盖都会立即执行关闭逻辑。根本原因深入rc-component/trigger源码定位根因hoverToHide分支中onPopupMouseLeave直接调用triggerOpen(false, mouseLeaveDelay)未对「popup内input正在聚焦」状态做任何豁免解决方案查阅antd官方 issue#46874,官方明确表示不计划修复——hover场景本身不稳定,有输入诉求的场景建议改用click。在此基础上,我从「业务侧规避」到「源码级治本」梳理出四套方案,按改动成本与适用范围权衡选型:方案思路官方推荐Input 上 stopPropagation在 popup 内 Input 的 onMouseLeave 中阻止事件冒泡到 trigger动态切换 trigger模式onCompositionStart/End输入中文时切 click输入结束恢复 hoverref 守卫 input 焦点onOpenChange 中内部 input 聚焦时阻止关闭源码根本修复onPopupMouseLeave 关闭前跳过 popup 内 input 处于聚焦的情况其中源码根本修复是问题的治本方案:在onPopupMouseLeave触发关闭逻辑之前先检查popup内是否仍有元素持有焦点。若有说明用户正在popup内的input中输入直接return跳过triggerOpen(false)popup不会收起。onPopupMouseLeave(){if(popupEle?.contains(document.activeElement))(return}triggerOpen(false,mouseLeaveDelay)}验证方案一源码编译编译 trigger 并注册本地连接cd/path/to/rc-component/trigger npm run compile # 编译到 es/和 lib/yarn link # 注册为本地全局包业务项目引用本地包cd/path/to/your-project yarn linkrc-component/trigger方案二patch安装 patch-packagenpm install patch-package--save-dev直接修改 node_modules/rc-component/trigger 的 es/index.js 与 lib/index.js在 onPopupMouseLeave 中加入 focus 豁免逻辑onPopupMouseLeave(){if(popupEle?.contains(document.activeElement)){return;}triggerOpen(false,mouseLeaveDelay);};执行命令生成 patch 文件patches/rc-componenttrigger2.3.0.patchnpx patch-packagerc-component/trigger在 package.json 的 scripts 中加入 postinstall确保每次 npm install 后自动应用补丁postinstall:patch-package结论⚠️ 方案一容易引发版本不一致的问题在项目中我们优先选择方案二。如果项目里用到的是联邦模块则需要在联邦模块处打patch。