Vue ElementUI在el-table中使用el-popover问题

目录
  • ElementUI在el-table中使用el-popover
  • el-popover在el-table中会出现不显示情况
    • 以下属于个人猜测,为了解释给自己听的
  • 总结

ElementUI在el-table中使用el-popover

Vue ElementUI在el-table中使用el-popover,点击嵌套内容中的确定或取消来关闭el-popover。

<el-table-column width="100" align="center" label="操作">
  <template slot-scope="scope">
    <el-popover width="160" :ref="`popover-${scope.$index}`">
      <p>确定删除该项吗?</p>
      <div style="text-align: right; margin: 0">
        <el-button type="text" size="mini" @click="scope._self.$refs[`popover-${scope.$index}`].doClose()">
          取消
        </el-button>
        <el-button type="danger" size="mini" >确定</el-button>
      </div>
      <el-button type="text" slot="reference">删除</el-button>
    </el-popover>
  </template>
</el-table-column>

方法二

<el-table-column width="100" align="center" label="操作">
  <template slot-scope="scope">
    <el-popover width="160" :ref="`popover-${scope.$index}`">
      <p>确定删除该项吗?</p>
      <div style="text-align: right; margin: 0">
        <el-button type="text" size="mini" @click="handleClose(scope.$index)">
          取消
        </el-button>
        <el-button type="danger" size="mini" >确定</el-button>
      </div>
      <el-button type="text" slot="reference">删除</el-button>
    </el-popover>
  </template>
</el-table-column>

<script>
 ...
   handleClose(index) {
     this.$refs[`popover-${index}`].doClose()
   }
 ...
</script>

方法三

<div ref="closepopover">
<el-table-column  label="操作">
 <template slot-scope="item">
  <el-popover
    placement="right"
    title="确定删除?"
    width="200"
    v-model="item.row.visible"
    trigger="click">
    <div style="text-align: right; margin: 0">
      <el-button size="mini" type="text" @click="updateVisible()">取消</el-button>
      <el-button type="primary" size="mini" @click="updateVisible()">确定</el-button>
    </div>
    <el-button slot="reference">删除</el-button>
  </el-popover>
</template >
</el-table-column>

//也可解决
updateVisible(){
    this.$refs.closepopover.click();
}

el-popover在el-table中会出现不显示情况

Popover 的属性与 Tooltip 很类似 都是弹出提示,一般情况下,如果是固定提示内容的话,采取Tooltip 简单了事。

接触到一个需求,el-table其中一列,根据后端返回的数据不同展示不同的 btn,其中一个btn 需要鼠标hover 的时候 获取该行元素的 id(需要在hover的时候 通过调接口获取),此时使用Tooltip就无法达到动态显示提示内容的效果了。

Popover 在基于Tooltip 有@show事件,当提示内容hover的时候,可以触发@show回调,此时可以去请求后端接口获取需要的数据。

问题: 在el-table-column 内 使用el-popover 有时候会出现hover 不显示提示框的情况

总所周知,el-table-column 代表的是 列,在其中写 一个el-popover ,其相当于 写了N个,(N取决于el-table 中 data 的 数组长度) table 常常 与 分页 一起使用

以下属于个人猜测,为了解释给自己听的

由于el-table data数据长度,遍历出多个 el-popover 而 el-popover 是根据条件row.staus === 1 判断是否出现的 (其中el-popover 的一些熟悉 就不写了)

<el-table-column >
 <template #default="{row}">
  <el-popover ....>
    <span>需要显示的文本内容</span>
    <div slot="reference" v-if="row.status === 1">查看内容</div>
  </el-popover>
  <div v-if="row.status === 2">暂无内容</div>
 </template>
</el-table-column>

此时可能会出现一种情况,第一页table 有10条数据, 其中第一条 和 第5条的row.status === 1

第二页 只有2条数据,第一条row.status === 2 第二条 row.status === 2

bug 复现: 当我第一次进入页面, hover 第一页的第一条数据 能够正常显示 <span>内容,也能正常显示第五条<span>内容,

当我切换到第二页,由于第二页只有两条数据,而且status === 2 所以 hover 是不会显示数据的, 这个时候 我再切换到第一页,再次hover 到第一条数据发现,此时row.status === 1 的那条数据不再显示<span>内容了 然而 第一页的 第五条数据 row.status ===1 hover 还是能正常显示<span>内容

经过上述操作,(个人觉得,没有官方判断)第一页的第一条本应该hover 展示<span>内容的 却没有展示 是因为 可能复用了 第二页第一条row.status === 2 的el-popover

为了防止 el-popover 复用,采取两个方法 :

1. 给el-popover不同的ref

2. 将v-if 判断同步移到 el-popover里

<el-table-column >
 <template #default="{row}">
  <el-popover v-if="row.status === 1" :ref="`node-${row.id}`">
    <span>需要显示的文本内容</span>
    <div slot="reference" v-if="row.status === 1">查看内容</div>
  </el-popover>
  <div v-if="row.status === 2">暂无内容</div>
 </template>
</el-table-column>

当 row.status !==1 时 el-popover 自然而然就被销毁了,也就不存在复用的情况,若出现第一页 和 第二页 都是row.status === 1 的情况,此时 由于ref 不同也不会复用  (下划线内容 为个人判断)

经过上述操作,大致能解决 el-popover 不显示的问题 (由于个人对该组建理解不是很深刻,所以不敢打包票 百分百解决)

额外内容:

通过查看el-popover 的源码 发现 存在一些 element 组件options没有 给出的一些方法,可以配合 ref 一起使用,能实现一些特殊功能的处理 。 通过 this.$refs['el-popover的ref'].方法()

通过查看源码可以发现,el-popover 中的methods 有以下几个方法:

  • doShow() : 展示el-popover
  • doClose() : 关闭el-popover
  • doToToggle() : 取反  关闭则展示,展示则关闭

tips:

当el-popover 内 不写 slot=“reference” 其中内容是不会展示(div内容)的 例如:

<el-popover>
 <div>没有使用slot插槽</div>
</el-popover>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • vue中element-ui表格缩略图悬浮放大功能的实例代码

    element-ui界面非常简洁和美观,提供的组件可以满足绝大多数的应用场景,当表格中显示了图片的缩略图时,想要鼠标浮动在缩略图上时放大图片的效果,该如何实现呢?element-ui虽然没有直接提供图片悬浮放大的组件,但是可以使用Popover弹出框组件,一样实现效果,如下: 具体的代码(此处只是图片单元格的代码,其它代码省略): <el-table-column prop="picture" header-align="center" align="

  • elementui的el-popover修改样式不生效的解决

    在使用element-ui的时候,有一个常用的组件,那就是el-popover,但是element-ui官方文档中样式跟用法都比较局限,在使用时都需要改动样式 项目中使用了el-popover,但是想修改一下样式,一直不成功,先来看一下官方文档怎么说的 添加一个类名,string类型,ok,添加一个 <el-popover placement="right" width="400" trigger="hover" popper-class=

  • el-table嵌套el-popover处理卡顿的解决

    目录 罪魁祸首 解决方法 罪魁祸首 一个常见的场景是在表格行内以el-popover的形式对行内信息进行一些业务操作.在表格分页10条.20条的情况下页面运行良好,但是在分页400条的时候会出现肉眼可见的卡顿.原因是表格渲染的popover组件太多了,一行如果至少3个popover组件,那么400行至少就得渲染1200个了.下面就是导致卡顿的通常写法: <el-table-column label="操作"> <template #default="{ ro

  • vue element-ui里的table中表头与表格出现错位的解决

    目录 element-ui里的table中表头与表格出现错位 解决方案 element-ui表格样式错乱调整方式 1.线没有对齐 2.fixed固定导致的高度问题 3.去掉鼠标hover修改背景色事件 element-ui里的table中表头与表格出现错位 现象: 原因:电脑显示的缩放引起的,并且发现同为webkit内核的Google浏览器和360浏览器中360浏览器显示正常,而Google浏览器才会出现这个问题. 解决方案 找到项目入口文件(敲黑板重点!!),添加全局样式: .el-table

  • 在vue和element-ui的table中实现分页复选功能

    背景 后台管理系统中,使用表格展示数据时,可能的需求是多项选择然后进行批量操作,也期望能翻页多选. 实现 页面结构如下 <el-table class="table" :data="tableData" border style="width: 100%" @selection-change="handleSelectionChange" ref="asTable" > <el-table

  • 解决vue elementUI中table里数字、字母、中文混合排序问题

    1.使用场景 使用elementUI中的table时,给包含数字字母中文的名称等字段排序 例如:数字(0->9)->大写字母(A->Z)->小写字母(a->z)->中文拼音(a->z) 2.代码解析 <el-table ref="multipleTable" border tooltip-effect="dark" class="xg-table" style="width: 100%&q

  • vue+elementui实现点击table中的单元格触发事件--弹框

    elementui中提供了点击行处理事件 查看位置: elementui的table事件 elementui的table中怎样点击某个单元格触发事件? 可以先看一下官网中table的自定义列模板代码 <template> <el-table :data="tableData" border style="width: 100%"> <el-table-column label="日期" width="180

  • vue element-ui中table合计指定列求和实例

    注意点: 1. <el-table> 中 加:summary-method="getSummaries" 2. <el-table-column> 中要加 prop // 房间号的合计去掉 getSummaries (param) { const { columns, data } = param const sums = [] columns.forEach((column, index) => { if (index === 0) { sums[ind

  • 关于vue中element-ui form或table lable换行的问题

    element-ui form或table lable换行问题 今天在写项目,突然遇到个需求,需要将form里面的lable换行,百度了下,发现了一个办法,特此记录下来 First,我们先要在我们的lable里面进行以下操作 :label="'机组: \n(xxx用)'" 双引号嵌套单引号 在需要换行的文字中间 加入\n 换行符 Second,再添加css的样式 /deep/ .el-form-item__label{ white-space:pre-line; } //如果是tabl

  • vue element-ui table表格滚动加载方法

    添加全局注册事件,用来监听滚动事件 window.Vue.directive('loadmore', { bind(el, binding) { const selectWrap = el.querySelector('.el-table__body-wrapper') selectWrap.addEventListener('scroll', function() { let sign = 100 const scrollDistance = this.scrollHeight - this.

  • Element-ui table中过滤条件变更表格内容的方法

    组件中: <el-table :data="users" highlight-current-row v-loading="listLoading" style="width: 100%;"> <el-table-column prop="sex" label="性别" width="100" :formatter="formatSex" sorta

  • vue elementUI table 自定义表头和行合并的实例代码

    最近项目中做表格比较多,对element表格的使用,只需要传递进去数据,然后写死表头即可渲染. 但现实中应用中,如果写死表头,并且每个组件中写自己的表格,不仅浪费时间而且消耗性能.这个时候需要动态渲染表头. 而官方例子都是写死表头,那么为了满足项目需求,只能自己来研究一下. 1.自定义表头 代码如下,其实就是分了两部分,表格主数据是在TableData对象中,表头的数据保存在headerDatas,headerDatas.label其实就是表头的值,如果表头是"序号",那么header

  • vue elementUI table表格数据 滚动懒加载的实现方法

    在项目中遇到了一个性能问题 vue+elementUI table表格展示数据,当数据很多的时候,不能一页显示完,同时一次请求数据量太大,会增加网页渲染的时间,影响体验, 这个时候常常有两种方法处理, 1.分页,如下 2.如果我不想分页,又想在一页显示全部数据呢?这个时候其实就可以用数据懒加载了 如下一开始表格只显示31行数据 当将滚动条拉到低的时候,就会再加载31条数据,如果剩下的数据不足31,那就加载剩下的 根据项目需求,这需要一页可以看到全部数据,所以我选择了第二中方式 那么第二种方式要怎

随机推荐