当前位置: 首页 > article >正文

扩展el-table,实现当showOverflowTooltip时,鼠标可移入tooltip功能

 1.在utils里创建elTable.js

import { Table } from 'element-ui';
import { getCell, getColumnByCell } from 'element-ui/packages/table/src/util';
import { getStyle, hasClass } from 'element-ui/src/utils/dom';
Object.assign(Table.components.TableBody.methods, {
  handleCellMouseEnter(event, row) {
    const { table } = this;
    const cell = getCell(event);

    if (cell) {
      const column = getColumnByCell(table, cell);
      table.hoverState = { cell, column, row };
      const { hoverState } = table;
      table.$emit('cell-mouse-enter', hoverState.row, hoverState.column, hoverState.cell, event);
    }

    // 判断是否text-overflow, 如果是就显示tooltip
    const cellChild = event.target.querySelector('.cell');
    if (!(hasClass(cellChild, 'el-tooltip') && cellChild.childNodes.length)) {
      return;
    }
    // use range width instead of scrollWidth to determine whether the text is overflowing
    // to address a potential FireFox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1074543#c3
    const range = document.createRange();
    range.setStart(cellChild, 0);
    range.setEnd(cellChild, cellChild.childNodes.length);
    const rangeWidth = range.getBoundingClientRect().width;
    const padding = (parseInt(getStyle(cellChild, 'paddingLeft'), 10) || 0) + (parseInt(getStyle(cellChild, 'paddingRight'), 10) || 0);
    if ((rangeWidth + padding > cellChild.offsetWidth || cellChild.scrollWidth > cellChild.offsetWidth) && this.$refs.tooltip) {
      const { tooltip } = this.$refs;
      const { tooltipEnterable } = this.table;
      const showTooltip = () => {
        this.tooltipContent = cell.innerText || cell.textContent;
        tooltip.referenceElm = cell;
        if (tooltip.$refs.popper) {
          tooltip.$refs.popper.style.display = 'none';
        }
        tooltip.doDestroy();
        tooltip.setExpectedState(true);
        this.activateTooltip(tooltip);
      };
      if (tooltipEnterable && tooltip.showPopper) {
        clearTimeout(tooltip.timeoutEnter);
        tooltip.timeoutEnter = setTimeout(() => {
          if (!tooltip.expectedState) {
            tooltip.handleClosePopper();
            showTooltip();
          }
          tooltip.timeoutEnter = null;
        }, 100);
        return;
      }

      showTooltip();
    }
  },
  handleCellMouseLeave(event) {
    const { tooltip } = this.$refs;
    if (tooltip) {
      tooltip.setExpectedState(false);
      const { tooltipEnterable } = this.table;
      if (tooltipEnterable) {
        clearTimeout(tooltip.timeoutLeave);
        tooltip.timeoutLeave = setTimeout(() => {
          if (!tooltip.expectedState) {
            tooltip.handleClosePopper();
          }
          tooltip.timeoutLeave = null;
        }, 100);
      } else {
        tooltip.handleClosePopper();
      }
    }
    const cell = getCell(event);
    if (!cell) return;

    const oldHoverState = this.table.hoverState || {};
    this.table.$emit('cell-mouse-leave', oldHoverState.row, oldHoverState.column, oldHoverState.cell, event);
  }
});

/**
 * @description 扩展el-table,实现当showOverflowTooltip时,鼠标可移入tooltip功能
 * @prop {Boolean} tooltipEnterable 仅在列属性showOverflowTooltip为true时生效,鼠标是否可进入到 tooltip 中,默认为true
 */
const ElTable = {
  extends: Table,
  props: {
    tooltipEnterable: {
      type: Boolean,
      default: true
    }
  }
};
export default Vue => {
  Vue.component('ElTable', ElTable);
};

2.在main.js中引入 并绑在vue上

import ElTable from '@/utils/elTable';

Vue.use(ElTable);


http://www.kler.cn/a/374989.html

相关文章:

  • Java 字符流详解
  • 【私聊记录】最近在忙什么啊?听说你在学人工智能?
  • 深入理解Docker,从入门到精通-Part1(基础使用)
  • 游戏和各大APP改IP地址方法教程
  • 【二分查找】——搜索插入位置#力扣hot100
  • 【数据结构二叉树】补充:C实现二叉树的层次遍历
  • 一个免费开源自托管的机器翻译项目,支持API接口
  • 建筑行业知识库搭建:好处、方法与注意事项
  • Chrome和Firefox哪款浏览器的密码管理更安全
  • C++第十讲:继承
  • LeetCode --- 421周赛
  • linux开机自启动三种方式
  • PySpark的使用
  • 一、Go语言快速入门之基础语法
  • python的socket库的基本使用总目录
  • 大语言模型推理源码解读(基于llama3模型:来源github)
  • SpringBoot旋律线:Web音乐网站构建
  • 基于SSM医药进出口交易系统的设计
  • 无线基础配置
  • 深入解析C/C++中的__attribute__((packed)):内存对齐与紧打包技术
  • 目录遍历漏洞
  • AE制作太阳光线穿过手指间隙的教程
  • A*算法求第k短路
  • 机器学习:我们能用机器学习来建立投资模型吗
  • 解决宝塔安装wxwork_finance_sdk出现free():invalid pointer Aborted (core dumped)
  • leetcode 2710 移除字符串中的尾随零