vue Element UI扩展内容过长使用tooltip显示

 更新时间:2022年06月01日 15:24:42   作者:FangMu  
这篇文章主要为大家介绍了vue Element UI扩展内容过长使用tooltip展示鼠标hover时的提示信息,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

1. 介绍

Tooltip常用于展示鼠标 hover 时的提示信息。

而在实际过程中,有这么一个需求:只有文字内容排不下,出现省略号,才需要显示tooltip的提示内容。

本文章的思路是通过一个自定义指令实现如下效果:姓名字段过长时才显示tooltip

2. element-ui(vue2版本)

2.1 注册指令

1) akTooltipAutoShow.js

说明

注册了一个名称为 'ak-tooltip-auto-show' 的指令。会根据内容进行判断是否展示tooltip。

import Vue from 'vue';
import { on, off, getStyle } from 'element-ui/src/utils/dom';
/**
 * ak-tooltip-auto-show
 * 当text没有被折叠时,不显示tooltip
 */
Vue.directive('ak-tooltip-auto-show', {
  inserted: function (el, binding, vnode) {
    el.addEventListener('mouseenter', function (e) {
      let defalutSilent = !!Vue.config.silent;
      Vue.config.silent = true;
      vnode.componentInstance.disabled = true;
      const range = document.createRange();
      range.setStart(el, 0);
      range.setEnd(el, el.childNodes.length);
      const rangeWidth = Math.round(range.getBoundingClientRect().width);
      const padding = (parseInt(getStyle(el, 'paddingLeft'), 10) || 0) + (parseInt(getStyle(el, 'paddingRight'), 10) || 0);
      if (rangeWidth + padding > el.offsetWidth || el.scrollWidth > el.offsetWidth) {
        vnode.componentInstance.disabled = false;
      }
      Vue.config.silent = defalutSilent;
    });
  }
});

2.2 使用

说明

使用<el-tooltip v-ak-tooltip-auto-show>包囊展示的内容。

  <div class="details-inner__row">
    <span class="details-inner__row-name">姓名:</span>
    <el-tooltip placement="top" effect="dark" :content="item.name" v-ak-tooltip-auto-show>
        <span class="details-inner__row-value">{{item.name}}</span>
    </el-tooltip>
</div>
// css
.details-inner__row-value {
  width: 80%;
  display: inline-block;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
}

3. element-plus(vue3版本)

3.1 注册指令

1) akTooltipAutoShow.js

说明

注册了一个名称为 'ak-tooltip-auto-show' 的指令。会根据内容进行判断是否展示tooltip。

注意

因为element-plus与之前的element-ui不一样,在element-plus(vue3版本)中是 <展示组件>包含<el-tooltip>的,所以代码中需要在<展示组件>内查找<el-tooltop>。

import { getStyle } from 'element-plus/lib/utils/dom/index';
/**
 * show-overflow-tooltip for text
 * 当text没有被折叠时,不显示tooltip
 */
const akTooltipAutoShow = {
  created(el, binding, vnode) {
    let tooltipNode = vnode.children.find((childrenCmpt) => childrenCmpt.component?.type.name == 'ElTooltip');
    if (tooltipNode) {
      let { content } = tooltipNode.props;
      if (content && ['添加', '编辑', '删除','查看'].includes(content)) {
        el.addEventListener('click', function (e) {
          let defalutDisabled = tooltipNode.component.props.disabled;
          if (!defalutDisabled) {
            tooltipNode.component.props.disabled = true;
            setTimeout(() => {
              tooltipNode.component.props.disabled = defalutDisabled;
            }, 200);
          }
        });
      } else {
        el.addEventListener('mouseenter', (e) => {
          tooltipNode.component.props.disabled = true;
          const range = document.createRange();
          range.setStart(el, 0);
          range.setEnd(el, el.childNodes.length);
          const rangeWidth = Math.round(range.getBoundingClientRect().width);
          const padding = (parseInt(getStyle(el, 'paddingLeft'), 10) || 0) + (parseInt(getStyle(el, 'paddingRight'), 10) || 0);
          if (rangeWidth + padding > el.offsetWidth || el.scrollWidth > el.offsetWidth) {
            tooltipNode.component.props.disabled = false;
          }
        });
      }
    }
  }
};
export default akTooltipAutoShow;

2) 进行局部或全局注册

// main.js
const app = createApp(App);
import akTooltipAutoShow from './akTooltipAutoShow.js';
app.directive('ak-tooltip-auto-show', akTooltipAutoShow);

3.2 使用

说明

因element-plus(vue3版本)本身不提供 root element,所以需要把此指令放到<el-tooltip>的父级组件。

<div class="details-inner__row">
  <span class="details-inner__row-name">姓名:</span>
  <span class="details-inner__row-value" v-ak-tooltip-auto-show>
    <el-tooltip placement="top-end" :content="item.name">{{item.name}}</el-tooltip>
  </span>
</div>

css 

.details-inner__row-value {
  width: 80%;
  display: inline-block;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
}

以上就是vue Element UI扩展内容过长使用tooltip显示示的详细内容,更多关于vue Element UI内容过长tooltip显示的资料请关注脚本之家其它相关文章!

相关文章

  • vue封装一个简单的div框选时间的组件的方法

    vue封装一个简单的div框选时间的组件的方法

    这篇文章主要介绍了vue封装一个简单的div框选时间的组件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Vue  webpack 项目自动打包压缩成zip文件的方法

    Vue webpack 项目自动打包压缩成zip文件的方法

    这篇文章主要介绍了Vue -- webpack 项目自动打包压缩成zip文件的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • 详解vuejs2.0 select 动态绑定下拉框支持多选

    详解vuejs2.0 select 动态绑定下拉框支持多选

    这篇文章主要介绍了vuejs2.0 select动态绑定下拉框 ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • vue.js实现点击图标放大离开时缩小的代码

    vue.js实现点击图标放大离开时缩小的代码

    这篇文章主要介绍了vue.js实现点击图标放大离开时缩小,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 详解如何使用webpack打包Vue工程

    详解如何使用webpack打包Vue工程

    本篇文章主要介绍了详解如何使用webpack打包Vue工程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 如何使用sm4js进行加密和国密sm4总结

    如何使用sm4js进行加密和国密sm4总结

    近期由于公司项目的需要开始研究国密SM4加密,下面这篇文章主要给大家介绍了关于如何使用sm4js进行加密和国密sm4的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • Vue filters过滤器的使用方法

    Vue filters过滤器的使用方法

    这篇文章主要为大家详细介绍了Vue filters过滤器的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • 使用Vue逐步实现Watch属性详解

    使用Vue逐步实现Watch属性详解

    这篇文章主要介绍了使用Vue逐步实现Watch属性详解,watch对象中的value分别支持函数、数组、字符串、对象,较为常用的是函数的方式,当想要观察一个对象以及对象中的每一个属性的变化时,便会用到对象的方式
    2022-08-08
  • Vue2中compiler和runtime模式报错template compiler is not available

    Vue2中compiler和runtime模式报错template compiler is 

    本文主要介绍了Vue2中compiler和runtime模式报错template compiler is not available,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • VSCode使React Vue代码调试变得更爽

    VSCode使React Vue代码调试变得更爽

    这篇文章主要为大家介绍了VSCode使React Vue代码调试变得更爽的使用方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07

最新评论