elementui中,el-popover通过该组件内部方法doShow显示后,点击页面其他部分无法隐藏?

表格中需要用到el-dropdown,但是数据稍微多一点就卡,所以想着能不能共用一个下拉组件,但是没有找到资料,但是发现可以共用一个el-popover,然后把dropdown放进去,所以需要自己控制el-popover的显示隐藏,点击触发按钮后,调用组件的doShow()能够显示该组件,但是点击其他位置,该组件无法隐藏了,该怎么处理?

阅读 1k
avatarAI BotBETA

在 Element UI 中,el-popover 组件通常用于创建悬浮的弹出框,它依赖于用户的交互(如点击)来显示和隐藏。当你直接调用 doShow() 方法来显示 el-popover 时,可能会绕过其默认的隐藏逻辑,导致点击其他位置时无法自动隐藏。

为了解决这个问题,你可以采取以下几种策略之一:

1. 使用 visible.syncv-model 来控制显示状态

推荐的方式是使用 v-model 或在 el-popover 上使用带有 .sync 修饰符的 visible 属性。这样,你可以通过修改绑定的变量来控制 el-popover 的显示与隐藏。

<template>
  <el-button @click="showPopover = true">点击打开 Popover</el-button>
  <el-popover
    placement="bottom"
    width="200"
    v-model="showPopover"
    title="标题"
    trigger="manual">
    <p>这是一段内容,这是一段内容。</p>
    <div slot="reference">悬停显示</div>
  </el-popover>
</template>

<script>
export default {
  data() {
    return {
      showPopover: false,
    };
  },
  methods: {
    // 如果需要,可以在这里添加方法来控制 showPopover
  },
};
</script>

注意,这里将 trigger 设置为 "manual",这意呀着你需要手动控制显示和隐藏。

2. 监听全局点击事件来隐藏 Popover

如果你确实需要通过 doShow() 来控制显示,并且希望点击其他地方时能够隐藏,你可以监听全局的点击事件,并检查点击是否发生在 el-popover 外部。

<template>
  <!-- Popover 和其他内容 -->
  <el-popover
    ref="popoverRef"
    ...
    :visible.sync="popoverVisible"
    ...
  >
    <!-- Popover 内容 -->
  </el-popover>
</template>

<script>
export default {
  data() {
    return {
      popoverVisible: false,
    };
  },
  methods: {
    showPopover() {
      this.$refs.popoverRef.doShow();
      this.popoverVisible = true;

      // 添加一个全局点击监听器,用于隐藏 Popover
      document.addEventListener('click', this.handleClickOutside);
    },
    handleClickOutside(e) {
      // 检查点击是否发生在 Popover 外部
      if (!this.$refs.popoverRef.$el.contains(e.target)) {
        this.popoverVisible = false;
        // 移除监听器,防止内存泄漏
        document.removeEventListener('click', this.handleClickOutside);
      }
    },
  },
  // 组件销毁时清理
  beforeDestroy() {
    document.removeEventListener('click', this.handleClickOutside);
  },
};
</script>

注意:这种方法可能会导致性能问题,特别是如果你的应用中有大量的 DOM 元素时。此外,记得在组件销毁时移除事件监听器,以避免内存泄漏。

结论

通常推荐使用 v-modelvisible.sync 来控制 el-popover 的显示和隐藏,因为它更符合 Vue 的响应式原则,并且易于管理和维护。如果你有特殊的需求,需要通过其他方式控制显示和隐藏,确保你能够适当地处理所有相关的事件和逻辑。

1 个回答

自己处理好了,思路,默认晴空下把所有的el-dropdown隐藏起来,在获取表格数据的时候每一条记录添加属性,标记是否有下拉按钮,点击时,动态设置一个变量,v-if显示该el-dropdown就行。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏