el-popover实现点击空白区域关闭,弹窗区域不关闭

难点:

普通方法会无法关闭,虚拟触发会导致选一个关一个,不用visible显示的方法太麻烦。
所以结合其他人的方法,使用手动监听判断的方法(点击蓝色区域看参考,这大佬vue2的,我vue3)

注意:

在 Popover show 的时候监听 document 的 click 事件,触发进入 hidePanel 方法,判断当前点击的 el 是否在 Popover 内部,如果不在,则手动 hide Popover ,并且移除监听事件
而且关键是el-form自己不能挂ref,只能外层套一个div。第二个关键点是:teleported="false",表单选项默认挂在body上,你得取消,挂本页面才能不选一下就关闭了

代码:

<el-form-item>
  <el-popover
    :visible="visiblePopover"
    :width="425"
    placement="bottom-start"
    trigger="click"
    @show="showEvent"
    @hide="hideEvent"
  >
    <div ref="projectButton">
      <el-form
        class="formPopover"
        label-width="64px"
        :model="queryParams"
        :inline="true"
      >
        <el-form-item prop="Sex" label="性别">
          <el-select
            v-model="queryParams.Sex"
            clearable
            filterable
            placeholder="请选择性别"
            :teleported="false"
          >
            <el-option
              v-for="item in SexList"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item prop="BuildingUp" label="圈舍">
          <el-select
            v-model="queryParams.BuildingUp"
            clearable
            filterable
            placeholder="请选择圈舍"
            :teleported="false"
          >
            <el-option
              v-for="item in BuildingUpList"
              :key="item"
              :label="item"
              :value="item"
            />
          </el-select>
        </el-form-item>
        <el-form-item prop="GroupName" label="栏舍">
          <el-select
            v-model="queryParams.GroupName"
            clearable
            filterable
            placeholder="请选择栏舍"
            :teleported="false"
          >
            <el-option
              v-for="item in GroupNameList"
              :key="item.value"
              :label="item.value"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item prop="CowType" label="养殖类型">
          <el-select
            v-model="queryParams.CowType"
            clearable
            filterable
            placeholder="请选择养殖类型"
            :teleported="false"
          >
            <el-option
              v-for="item in CowTypeList"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item prop="Category" label="生长阶段">
          <el-select
            v-model="queryParams.Category"
            clearable
            filterable
            placeholder="请选择生长阶段"
            :teleported="false"
          >
            <el-option
              v-for="item in CategoryList"
              :key="item.value"
              :label="item.value"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item prop="RepCode" label="繁殖状态">
          <el-select
            v-model="queryParams.RepCode"
            clearable
            filterable
            placeholder="请选择繁殖状态"
            :teleported="false"
          >
            <el-option
              v-for="item in RepCodeList"
              :key="item.value"
              :label="item.value"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item prop="GroCode" label="泌乳状态">
          <el-select
            v-model="queryParams.GroCode"
            clearable
            filterable
            placeholder="请选择泌乳状态"
            :teleported="false"
          >
            <el-option
              v-for="item in GroCodeList"
              :key="item.value"
              :label="item.value"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item prop="Variety" label="品种">
          <el-select
            v-model="queryParams.Variety"
            clearable
            filterable
            placeholder="请选择品种"
            :teleported="false"
          >
            <el-option
              v-for="item in VarietyList"
              :key="item.value"
              :label="item.value"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item prop="Color" label="花色">
          <el-select
            v-model="queryParams.Color"
            clearable
            filterable
            placeholder="请选择花色"
            :teleported="false"
          >
            <el-option
              v-for="item in ColorList"
              :key="item.value"
              :label="item.value"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item prop="Lact" label="胎次">
          <el-select
            v-model="queryParams.Lact"
            clearable
            filterable
            placeholder="请选择胎次"
            :teleported="false"
          >
            <el-option
              v-for="item in LactList"
              :key="item"
              :label="item"
              :value="item"
            />
          </el-select>
        </el-form-item>
        <el-form-item prop="Flag" label="在场状态">
          <el-select
            v-model="queryParams.Flag"
            clearable
            filterable
            placeholder="请选择在场状态"
            :teleported="false"
          >
            <el-option
              v-for="item in FlagList"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item prop="StartTime" label="进场时间">
          <el-date-picker
            v-model="dateList"
            :clearable="true"
            type="daterange"
            unlink-panels
            range-separator="~"
            start-placeholder="开始时间"
            end-placeholder="结束时间"
            @change="dateChange"
            :teleported="false"
          />
        </el-form-item>
      </el-form>
    </div>
    <template #reference>
      <el-button @click="visiblePopover = !visiblePopover"
        >更多搜索</el-button
      >
    </template>
  </el-popover>
</el-form-item>


const projectButton: Ref = ref(null);
let visiblePopover = ref(false);
const showEvent = () => {
  document.addEventListener("click", hidePanel, false);
};
const hideEvent = () => {
  document.removeEventListener("click", hidePanel, false);
};
const hidePanel = (e: any) => {
  if (!projectButton.value.contains(e.target)) {
    visiblePopover.value = false;
    hideEvent();
  }
};
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过设置 `popper-class` 属性来实现点击界面其他部分关闭 `el-popover`。具体做法是在 `popper-class` 中添加一个点击事件监听器,当点击事件发生时,关闭 `el-popover`。 示例代码如下: ```html <el-popover popper-class="my-popper" trigger="click" content="这是一个 el-popover" > <button>点击我</button> </el-popover> ``` ```css .my-popper { /* 设置 popper 的样式 */ } .my-popper .el-popover__reference { /* 设置触发元素的样式 */ } .my-popper .el-popover__content { /* 设置弹出内容的样式 */ } .my-popper .el-popover__wrapper { /* 设置弹出框的样式 */ } .my-popper .el-popover__wrapper .popper__arrow { /* 设置箭头的样式 */ } .my-popper .el-popover__wrapper .popper__arrow::before { /* 设置箭头的样式 */ } .my-popper .el-popover__wrapper .popper__arrow::after { /* 设置箭头的样式 */ } /* 添加点击事件监听器 */ .my-popper.show-x-enter-active, .my-popper.show-x-leave-active { transition: opacity 0.3s; } .my-popper.show-x-enter, .my-popper.show-x-leave-to { opacity: 0; } .my-popper.show-x-leave, .my-popper.show-x-enter-to { opacity: 1; } /* 点击事件监听器 */ .my-popper.show-x-enter-active, .my-popper.show-x-leave-active { transition: opacity 0.3s; } .my-popper.show-x-enter, .my-popper.show-x-leave-to { opacity: 0; } .my-popper.show-x-leave, .my-popper.show-x-enter-to { opacity: 1; } /* 点击事件监听器 */ document.addEventListener('click', function (event) { var popper = document.querySelector('.my-popper'); var target = event.target; if (!popper.contains(target)) { popper.style.display = 'none'; } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值