element-ui 的表格里面使用 el-popover 实现编辑弹层功能

简介: element-ui 的表格里面使用 el-popover 实现编辑弹层功能

功能点


1、表格是没有分页的

2、点击编辑能定位到对应的位置,进行编辑功能

3、表格滚动时候,编辑弹层需要关闭



效果

20201219194757589.png


代码实现

<template>
<el-table ref="multipleTable" >
<el-table-column label="操作" width="90">
  <template slot-scope="scope">
    <el-button type="text" @click="handleClickEdit(scope.row, $event)">编辑</el-button>
  </template>
</el-table-column>
</el-table>
<!-- 编辑模板 -->
<el-popover ref="editPopover" placement="bottom-end" width="370"
    v-model="visibleEdit"  :reference="prevTarget" :key="popperFlag"
></el-popover>
</template>
<script>
// 节流-防抖
import { throttle } from 'throttle-debounce';
export default {
  data() {
    return {
      visibleEdit: false,
      prevTarget: null, // 编辑 Popover 的 Reference (参照),用于 popover.js 对齐两个元素
      popperFlag: false, // 用于编辑 Popover 的刷新
    };
  },
  watch: {
    value(n) {
      if(n) {
        this.$nextTick(() => {
          // 添加这个用于处理fixed定位导致的列表行错位
          console.log('this.$refs.multipleTable--->', this.$refs.multipleTable);
          this.$refs.multipleTable.doLayout();
        });
        // 监听滚动,用于编辑框的滚动移除
        this.removeEditPopoverListener(n);
      }
    }
  },
  methods: {
    // 监听滚动,用于编辑框的滚动移除
    removeEditPopoverListener(flag) {
      let timer = setTimeout(() => {
        let scrollElement = this.$refs.multipleTable.$el.querySelector('.el-table__body-wrapper');
        console.log('监听滚动,用于编辑框的滚动移除', flag, scrollElement);
        // 
        let scrollHandle = () => {
          console.log('执行--->', this.visibleEditOpinions);
          if (this.visibleEditOpinions) {
            this.clearEditPopperComponent();
          }
        }
        if (flag) {
          // 滚动节流
          scrollElement.addEventListener('scroll', throttle(500, scrollHandle));
        } else {
          scrollElement.removeEventListener('scroll', scrollHandle);
        }
        clearTimeout(timer);
      }, 0);
    },
    // 复选框选中的数据
    changeSelection(row) {
      this.selectData = row;
      console.log('复选框选中的数据', this.selectData);
      this.seqs = this.selectData.map((el) => { return el.seq; }).toString();
      console.log('seqs---->', this.seqs);
    },
    // 清空编辑组件
    clearEditPopperComponent() {
      this.prevTarget = null;
      this.popperFlag = !this.popperFlag;
      this.visibleEdit = false;
    },
    // 点击编辑
    handleClickEdit(row, e) {
      //阻止事件冒泡,兼容ie
      if (event.stopPropagation) {
        event.stopPropagation();
      } else if (window.event) {
        window.event.cancelBubble = true;
      }
      let currentTarget = e.target; // 赋值当前点击的编辑
      this.editData = row; // 设置编辑数据
      // 判断是否需要切换
      if (this.prevTarget === currentTarget) {
        // 同一个元素重复点击
        this.visibleEdit = !this.visibleEdit;
      } else {
        // 切换不同元素, 判断之前是否有点击其他编辑 prevTarget
        if (this.prevTarget) {
          // 先清除之前的编辑框
          this.clearEditPopperComponent();
          // 然后生成新的编辑框
          this.$nextTick(() => {
            this.prevTarget = currentTarget;
            this.visibleEdit = true;
          });
        } else {
          // 首次
          console.log('首次--->this.prevTarget');
          this.prevTarget = currentTarget;
          this.visibleEdit = true;
        }
      }
    }
  }
};
</script>




注意点


1、fixed 定位导致的列表行错位

2、监听滚动函数名必须具名,不然滚动的时候会导致内存问题,浏览器直接崩溃,也不能移出对应的滚动事件

3、reference 这个属性 element 文档只说了 slot 的使用,需要去看源码


2020121919481888.png


为什么要用reference这样做的原因?

如果将 el-popoper 写在表格的编辑里,使用 slot 的话,表格数据一多就会有性能问题,页面很卡数据加载很慢,并且每次点击其他的编辑,会导致组件更新多次,另外,滚动的时候需要关闭,不然会编辑框滚来滚去,滚动的时候就需要考虑节流的问题。这样一来就基本在能接受的范围内。


js 库连接

popover.js

throttle-debounce




目录
相关文章
|
5月前
|
流计算 UED
「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现
本篇教程将带你实现一个简易购物车功能。通过使用接口定义商品结构,我们将创建一个动态购物车,支持商品的添加、移除以及实时总价计算。
200 69
「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现
|
6月前
「Mac畅玩鸿蒙与硬件26」UI互动应用篇3 - 倒计时和提醒功能实现
本篇将带领你实现一个倒计时和提醒功能的应用,用户可以设置倒计时时间并开始计时。当倒计时结束时,应用会显示提醒。该项目涉及时间控制、状态管理和用户交互,是学习鸿蒙应用开发的绝佳实践项目。
237 2
「Mac畅玩鸿蒙与硬件26」UI互动应用篇3 - 倒计时和提醒功能实现
|
8月前
|
JavaScript
element-ui table表格多选后再打开默认选中
element-ui table表格多选后再打开默认选中
|
8月前
|
搜索推荐 前端开发 C#
推荐7款美观且功能强大的WPF UI库
推荐7款美观且功能强大的WPF UI库
609 2
|
9月前
|
前端开发 JavaScript UED
element-ui 表格数据究竟隐藏着怎样的神秘样式与格式化技巧?快来揭开谜底!
【8月更文挑战第22天】《element-ui 表格数据样式及格式化案例》展示了如何利用 element-ui 的表格组件实现美观且易读的数据展示。通过简单配置,可以自定义表格样式,如边框、背景色等,并通过 formatter 实现数据格式化,例如将成绩保留一位小数。此外,还能依据条件设置行样式,如成绩达优则高亮显示,从而增强用户体验和数据可读性。
149 1
|
9月前
|
计算机视觉
ElementUI——vue2+element-ui 2.x的动态表格和表单
ElementUI——vue2+element-ui 2.x的动态表格和表单
257 1
|
9月前
|
JavaScript 开发者
Element UI & Element Plus之改变表格单元格颜色
这篇文章展示了如何在Element UI和Element Plus框架中使用`:cell-style`属性来根据条件改变表格单元格的颜色。
803 0
Element UI & Element Plus之改变表格单元格颜色
|
9月前
|
图形学
小功能⭐️Unity获取点击到的UI
小功能⭐️Unity获取点击到的UI
|
3月前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
241 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
1月前
|
人工智能 物联网 编译器
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
64 11
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡