目录

Element-Plus-中-el-popover-内使用-el-select-导致弹层被关闭的解决方案

Element Plus 中 el-popover 内使用 el-select 导致弹层被关闭的解决方案

在使用 Element Plus 时,如果你在 el-popover 内放置了 el-selectel-autocomplete 等下拉类组件,可能会遇到这样的问题:

👉 点击下拉选择框时,el-popover 会被自动关闭。

问题原因

el-selectel-autocomplete 等组件的下拉面板 默认会 teleport 到 <body>

对于 el-popover 来说,这样的点击就不在它的内容区域内,被误判为“点击了外部区域”,于是自动关闭。


解决方案

1. 让下拉面板不 teleport

el-selectel-autocomplete 上添加 :teleported="false",这样它们的下拉内容会直接挂在 el-popover 内部,不会触发关闭。


<el-popover
v-model:visible="popoverVisible"
trigger="click"
placement="top"
width="470"
:popper-style="{ overflow: 'visible' }" <!-- 防止内容被裁剪 -->
>
<template #reference>
<img
style="cursor: pointer"
@click.stop="popoverVisible = !popoverVisible"
src="./images/123123123123.png"
alt=""
/>
</template>


<div>
<el-form :model="searchForm" ref="formRef">
<el-form-item label="事件类型">
<div style="display: flex">
<!-- 下拉选择框 -->
<el-select
v-model="pageParams.param.eventType"
placeholder="请选择"
style="width: 240px"
clearable
:teleported="false"
>
<el-option
v-for="item in eventTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>


<!-- 自动完成框 -->
<el-autocomplete
v-model="pageParams.param.eventTypeName"
:fetch-suggestions="querySearch123"
clearable
class="inline-input w-50"
placeholder="请选择或输入"
style="margin-left: 20px"
:teleported="false"
/>
</div>
</el-form-item>
</el-form>
</div>
</el-popover>

2. 避免内容被遮挡

如果发现下拉面板被 popover 裁剪,可以:

  • el-popover 上加 :popper-style="{ overflow: 'visible' }"
  • 或者给下拉框设置专用的 popper-class 并提升 z-index

<el-select :teleported="false" popper-class="in-popover-select-popper" />

.in-popover-select-popper {
z-index: 9999;
}

总结

  • 问题根因:el-select 的下拉面板默认 teleport 到 <body>,导致 popover 判定为“外部点击”而关闭。
  • 解决办法:在下拉类组件上加 :teleported="false",让面板渲染在 popover 内部。
  • 可选优化:通过 popper-stylepopper-class 控制层级,避免内容被遮挡。

这样就可以愉快地在 el-popover 内使用下拉选择,不会再遇到被强制关闭的问题。