位置: IT常识 - 正文

自定义vue指令,实现el-tooltip仅在文字溢出时显示,文字未溢出则不显示,复制即可使用(vue3自定义指令)

编辑:rootadmin
自定义vue指令,实现el-tooltip仅在文字溢出时显示,文字未溢出则不显示,复制即可使用 一、写在开头

推荐整理分享自定义vue指令,实现el-tooltip仅在文字溢出时显示,文字未溢出则不显示,复制即可使用(vue3自定义指令),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue3.0自定义指令,vuejs自定义指令,自定义vue指令,vuecli自定义指令,vue3自定义指令,自定义vue指令,vue3.0自定义指令,自定义vue指令,内容如对您有帮助,希望把文章链接给更多的朋友!

在项目里遇到了这种需求,想到el-table里的show-overflow-tooltip属性就有这种效果,在参考了一些网上的文章以及show-overflow-tooltip跟el-tooltip的源码后,觉得使用自定义指令的方式来实现这个需求会很方便,于是便有了以下代码

二、自定义指令代码1、创建一个js文件,复制粘贴以下代码即可使用,无需改动import Vue from 'vue'import debounce from 'throttle-debounce/debounce'import { Tooltip } from 'element-ui'Vue.use(Tooltip)/*** 指令功能:元素内容溢出隐藏时悬浮tooltip展示详细内容,元素内容未溢出时不展示* 基于element-table的show-overflow-tooltip原理与el-tooltip的功能实现* 使用方式:* <div v-overflow-tooltip>这是一段会溢出的文本内容</div>** 指令也可传递参数,参数内容为el-tooltip的参数配置:* <div v-overflow-tooltip="{content:'啦啦啦啦~~~'}">这是一段会溢出的文本内容</div>* *//*** tooltipVM —— el-tooltip的VNode实例* tooltipContent —— 默认提示文本内容* props —— el-tooltip的配置参数* ctx —— 命名空间* activateTooltip —— el-tooltip展开的防抖延迟,默认50ms* */let tooltipContentlet propsconst ctx = '@@store'// 创建一个Vue实例并渲染为真实DOM,内有一个空的el-tooltip组件const vm = new Vue({render (h) {return (<Tooltip ref="customToolTipRef" content={ tooltipContent } { ...{ props } }></Tooltip>)}}).$mount()const tooltipVM = vm.$refs.customToolTipRefconst activateTooltip = debounce(50, tooltipVM => tooltipVM.handleShowPopper())const overflowHandler = (el, binding, vnode) => {// 获取元素文本内容,作为el-tooltip的默认content进行展示el[ctx].tooltipContent = el.innerText || el.textContent// 获取通过指令接收的绑定值el[ctx].props = { ...binding.value }const computedStyle = getComputedStyle(el)// 使用range对象判断文本是否有溢出,优先考虑使用range对象, 因为 scrollWidth 属性在火狐浏览器 v32 版本中有 bug。当元素的 CSS 属性中使用了 text-overflow: ellipsis 和 box-sizing: border-box 时获取到的 scrollWidth 的值会比真实值偏小const range = document.createRange()range.setStart(el, 0)range.setEnd(el, el.childNodes.length)const rangeDOM = range.getBoundingClientRect()const padding = parseInt(computedStyle.paddingLeft.replace('px', '')) + parseInt(computedStyle.paddingRight.replace('px', ''))const rangeWidth = Math.round(rangeDOM.width)if (rangeWidth + padding > el.offsetWidth || el.scrollWidth > el.offsetWidth) {// 文本溢出了,绑定鼠标事件el.addEventListener('mouseenter', el[ctx].handleMouseEnter)el.addEventListener('mouseleave', el[ctx].handleMouseLeave)} else {// 文本未溢出,移除鼠标事件el.removeEventListener('mouseenter', el[ctx].handleMouseEnter)el.removeEventListener('mouseleave', el[ctx].handleMouseLeave)}}Vue.directive('overflowTooltip', {// 只调用一次,指令第一次绑定到元素时调用。在这里进行一次初始化设置,初始化鼠标事件,控制el-tooltip的展开与收起bind: function (el, binding, vnode) {el[ctx] = {tooltipContent: '',props: {},handleMouseEnter: () => {// 展开el-tooltip方法,将el-tooltip的引用元素指向当前绑定节点,然后执行展开逻辑tooltipContent = el[ctx].tooltipContentprops = el[ctx].propsvm.$forceUpdate()tooltipVM.referenceElm = eltooltipVM.$refs.popper && (tooltipVM.$refs.popper.style.display = 'none')tooltipVM.doDestroy()tooltipVM.setExpectedState(true)activateTooltip(tooltipVM)},handleMouseLeave: () => {// 关闭el-tooltip方法,销毁内部popperJS的实例后走关闭逻辑tooltipVM.doDestroy()tooltipVM.setExpectedState(false)tooltipVM.handleClosePopper()}}},inserted: overflowHandler,componentUpdated: overflowHandler,unbind (el) {delete el[ctx]}})2、使用方法2.1. 默认无参数用法自定义vue指令,实现el-tooltip仅在文字溢出时显示,文字未溢出则不显示,复制即可使用(vue3自定义指令)

没有传递值给指令的时候,将使用el-tooltip的默认配置,提示内容默认显示指令绑定元素的文本内容

<el-input v-model="value" placeholder="请输入内容" style="width: 200px; margin-bottom: 25px"></el-input><div v-overflow-tooltip class="overflow">{{ value }}</div>

默认效果

2.2. 自定义传递参数用法

参数内容其实就是el-tooltip官方定义可以传递的配置参数,我们可以自定义内容、主题、显示位置等

<el-input v-model="value" placeholder="请输入内容" style="width: 200px; margin-bottom: 25px"></el-input><div v-overflow-tooltip="{content:'这是通过content自定义的溢出显示内容',effect:'light'}" class="overflow">{{ value }}</div>

自定义参数效果

三、实现原理简述

不了解自定义指令的小伙伴可以看一下我在文末分享的链接。

最开始我们需要创建一个tooltip的vue实例,以及其他的一些空变量为后续内容做准备。此处为了方便,vue实例中使用了JSX语法,大家可以根据需求更换为h函数(createElement)的写法。

本文链接地址:https://www.jiuchutong.com/zhishi/284052.html 转载请保留说明!

上一篇:如何像专业人员那样在openSUSE上安装和更新软件?opensuse安装软件详细教程(如何使专业人员的工作卓有成效读后感悟)

下一篇:YOLOv5/v8改进主干GhostNetV2系列:首发结合最新NIPS2022华为诺亚的GhostNetV2 架构:引入长距离注意力机制增强廉价操作,构建更强端侧轻量型骨干,打造高效轻量级检测器(改进yolov4)

  • 微信如何看出好友在线(微信怎么看好友)

    微信如何看出好友在线(微信怎么看好友)

  • 华为手机重置后怎么恢复数据(华为手机重置后还能恢复数据吗)

    华为手机重置后怎么恢复数据(华为手机重置后还能恢复数据吗)

  • 中国移动v7.4.0版本(中国移动app7.0)

    中国移动v7.4.0版本(中国移动app7.0)

  • ipx系列跟其他有什么区别(ipx和ipxr)

    ipx系列跟其他有什么区别(ipx和ipxr)

  • 商家如何查到匿名差评(商家可以看到匿名评价)

    商家如何查到匿名差评(商家可以看到匿名评价)

  • 闲鱼上卖书为什么便宜(闲鱼上卖书为什么这么贵)

    闲鱼上卖书为什么便宜(闲鱼上卖书为什么这么贵)

  • 智能手机采用什么功能进行移动支付(智能手机采用什么信号)

    智能手机采用什么功能进行移动支付(智能手机采用什么信号)

  • 表格怎么合计总数(表格怎么合计总数的公式)

    表格怎么合计总数(表格怎么合计总数的公式)

  • freebuds3怎么调音量(freebuds3调节)

    freebuds3怎么调音量(freebuds3调节)

  • 华为atu一tl10是什么型号(华为atu一tl10多少钱一部)

    华为atu一tl10是什么型号(华为atu一tl10多少钱一部)

  • 喜马拉雅vip与喜点的区别(喜马拉雅中的vip跟付费是一样的吗)

    喜马拉雅vip与喜点的区别(喜马拉雅中的vip跟付费是一样的吗)

  • 抖音用微信登录授权在哪里(抖音用微信登录不了,未获得权限没有绑定微信)

    抖音用微信登录授权在哪里(抖音用微信登录不了,未获得权限没有绑定微信)

  • 11录屏怎么设置(录屏怎么设置可以看到密码)

    11录屏怎么设置(录屏怎么设置可以看到密码)

  • 蓝牙充电一会红灯就灭了(蓝牙充电为啥老是一闪一闪)

    蓝牙充电一会红灯就灭了(蓝牙充电为啥老是一闪一闪)

  • 在outlook的服务器设置中SMTP协议是指(outlook邮箱服务)

    在outlook的服务器设置中SMTP协议是指(outlook邮箱服务)

  • 咋删除情侣空间的访客(怎样删除情侣空间)

    咋删除情侣空间的访客(怎样删除情侣空间)

  • 手机怎么恢复qq好友(手机怎么恢复qq好友删除的好友)

    手机怎么恢复qq好友(手机怎么恢复qq好友删除的好友)

  • 荣耀v20解锁有哪几种(荣耀v20屏幕锁解锁)

    荣耀v20解锁有哪几种(荣耀v20屏幕锁解锁)

  • html超链接去下划线(html超链接底下横怎么去掉)

    html超链接去下划线(html超链接底下横怎么去掉)

  • 苹果蓝牙键盘连不上(苹果蓝牙键盘连接失败)

    苹果蓝牙键盘连不上(苹果蓝牙键盘连接失败)

  • 华为9x上市时间(华为9x什么时候出来的)

    华为9x上市时间(华为9x什么时候出来的)

  • word图标变成白底怎么办(word图标变成白色)

    word图标变成白底怎么办(word图标变成白色)

  • 转转如何卖东西(转转小程序怎么卖东西)

    转转如何卖东西(转转小程序怎么卖东西)

  • 苹果8基带坏了能修吗(苹果8基带坏了可以修吗,多少钱)

    苹果8基带坏了能修吗(苹果8基带坏了可以修吗,多少钱)

  • groupadd命令  创建新的用户组(使用groupadd命令创建用户组)

    groupadd命令 创建新的用户组(使用groupadd命令创建用户组)

  • 城建税和教育费附加
  • 含税价怎么算不含税价
  • 个人发票需要身份证信息吗?
  • 季度预缴能不能弥补亏损
  • 缴纳增值税金税率是多少
  • 合伙企业可以弥补以前年度亏损吗
  • 电费发票可以抵扣进项吗
  • 印花税计入税金及附加什么时候开始
  • 银行代收费业务会计分录
  • 外商投资企业税务优惠
  • 只有进项没有销项怎么报税
  • 原材料明细账目
  • 办税人员的职责和义务
  • 临时员工什么意思
  • 科研机构进口直接用于科学研究的仪器免征增值税吗
  • qbupdate.exe - qbupdate是什么进程 有什么作用
  • 双链表的删除操作算法,两条改链语句能调换位置吗?
  • ajax+json
  • 原版win10系统安装方法
  • windows10什么时候上市
  • intel me有什么用
  • wordpress app怎么用
  • 原材料结转成本的会计分录例题
  • 付不出去的应付账款如何写说明书
  • 个人应纳税所得额是要交钱吗
  • 投资性房地产出售时其他综合收益
  • 微信开发获取位置
  • 增值税和所得税重复交了吗
  • 一键部署源码
  • 【超直白讲解opencv RGB与BGR】RGB模式与BGR模式有什么不同,如何相互转换?
  • 做毕业设计,前景如何
  • 谷粒学院项目含金量
  • 37.JavaScript对象与JSON格式的转换,JSON.stringify、JSON.parse方法的使用方法和注意事项
  • 上年折旧费多计提了,本年怎么调
  • 发生售后维修领用材料分录
  • mongodb27017
  • 融资租赁确认的具体条件
  • short int、long、float、double使用问题说明
  • 不动产经营租赁发票开具注意
  • 医院购买医疗器械
  • 以前年度应收账款贷方余额如何调整
  • 一般纳税人销售自己使用过的物品
  • 安全生产费用应当专户储存专款专用专户核算
  • 车辆处置如何缴纳企业所得税
  • 应付职工薪酬的工资是实发工资还是应发工资
  • 职工福利费的扣除标准工资总额包括什么
  • 外账进销存单据是怎么弄的?
  • 公交充值卡发票能报销吗
  • 退税勾选选成抵扣勾选怎么办
  • 企业残保金如何计算
  • sql语句错误提示
  • 基于mysql的sql应用
  • mysql 修改密码后 unknown error 1820
  • mysql存储过程判断输入判断类型
  • win10预览版好吗
  • 快速切换电脑界面
  • 设置动态壁纸来电铃声
  • fedora8安装教程
  • win7系统每次开机都要选择用户
  • linux iocp
  • win8.1系统要求配置
  • 网页标准化技术有哪些
  • 怎么理解python
  • tensorflow for
  • perl计算时间差
  • jQuery实现Tab选项卡切换效果简单演示
  • javascript常用语法
  • jquery与js
  • python 文件头
  • shell脚本计算执行时间
  • python生成随机数据
  • unity3d应用
  • 用javascript
  • 医保已申报未缴费可以撤销申报吗
  • 停车定额费发票还能用吗
  • 我的电脑软件下载
  • 个体商户营业额多少万以下免税
  • 开票没有0还是o
  • 过了征期更正申报进项税可以多认证嘛
  • 下列哪些表述是正确的( )
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设