位置: 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)

  • 小米手环nfc怎么用(小米手环nfc怎么刷地铁卡)

    小米手环nfc怎么用(小米手环nfc怎么刷地铁卡)

  • 中国农业银行如何查看银行交易记录(中国农业银行如何查询开户行)

    中国农业银行如何查看银行交易记录(中国农业银行如何查询开户行)

  • 抖音怎么删除转发的视频(抖音怎么删除转发过视频的人)

    抖音怎么删除转发的视频(抖音怎么删除转发过视频的人)

  • 微信聊天记录怎么看(微信聊天记录怎么永久删除)

    微信聊天记录怎么看(微信聊天记录怎么永久删除)

  • 罗技m185和m186的区别(罗技m185和186的区别)

    罗技m185和m186的区别(罗技m185和186的区别)

  • 手机屏幕部分区域失灵(手机屏幕部分区域失灵怎么办)

    手机屏幕部分区域失灵(手机屏幕部分区域失灵怎么办)

  • 设置了仅聊天能看到对方朋友圈吗(设置了仅聊天能看出吗)

    设置了仅聊天能看到对方朋友圈吗(设置了仅聊天能看出吗)

  • 苹果手表可以外放音乐嘛(苹果手表可以外放QQ音乐吗)

    苹果手表可以外放音乐嘛(苹果手表可以外放QQ音乐吗)

  • ps源文件太大怎么办(ps源文件太大怎么保存)

    ps源文件太大怎么办(ps源文件太大怎么保存)

  • ipad更新系统会不会越来越卡(ipad更新系统会关机吗)

    ipad更新系统会不会越来越卡(ipad更新系统会关机吗)

  • 华为mate50什么时候出(华为mate50好久出)

    华为mate50什么时候出(华为mate50好久出)

  • 微信朋友圈发图片怎么配音乐(微信朋友圈发图片的方法)

    微信朋友圈发图片怎么配音乐(微信朋友圈发图片的方法)

  • 抖音收藏的图片在哪里找(抖音收藏的图片怎么转到微信)

    抖音收藏的图片在哪里找(抖音收藏的图片怎么转到微信)

  • 中国有光刻机吗(全世界有几台光刻机)

    中国有光刻机吗(全世界有几台光刻机)

  • ps闪退是什么原因(ps闪退什么情况)

    ps闪退是什么原因(ps闪退什么情况)

  • word如何交换两页位置(word文档怎么交换两页位置)

    word如何交换两页位置(word文档怎么交换两页位置)

  • ps显示暂存盘已满怎么办(用ps时显示暂存盘已满怎么处理)

    ps显示暂存盘已满怎么办(用ps时显示暂存盘已满怎么处理)

  • 华为手表watch2和gt的区别(华为手表watch2和watch2pro有什么区别)

    华为手表watch2和gt的区别(华为手表watch2和watch2pro有什么区别)

  • 乐视账号怎么强行解绑(乐视2怎么跳过乐视账号)

    乐视账号怎么强行解绑(乐视2怎么跳过乐视账号)

  • 物联网概念是在哪一年(物联网概念是在( )年美国麻省理工学院提出的?)

    物联网概念是在哪一年(物联网概念是在( )年美国麻省理工学院提出的?)

  • 为什么嘿siri不能唤醒(为什么嘿siri不能录取)

    为什么嘿siri不能唤醒(为什么嘿siri不能录取)

  • 微信撤回的视频怎么看(微信撤回的视频还能找到吗)

    微信撤回的视频怎么看(微信撤回的视频还能找到吗)

  • 小米手机安装包在哪里(小米手机安装包白名单在哪里)

    小米手机安装包在哪里(小米手机安装包白名单在哪里)

  • 如何降低网站改版风险(调整网站)

    如何降低网站改版风险(调整网站)

  • 税收会计在会计中的应用
  • 计提住房公积金怎么算
  • 简易计税36个月不能变指的是这个项目吗?
  • 销售费用和管理费用和财务费用
  • 长期投资算资产负债表吗
  • 经营罚没物品增值税计算
  • 收到的房租增值税专用发票可以抵扣吗
  • 增值税专票怎么抵扣
  • 个人房产税延期怎么办理
  • 非公益捐赠税率
  • 城建税和教育费附加可以税前扣除吗
  • 关联的公司
  • 个税中的年金是什么意思
  • 自产自用增值税组成计税价格
  • 摊销土地使用权和专利权会计分录怎么写
  • 债转股需不需要交税
  • 无票申报后开发票怎么申报
  • 支付应付账款的会计科目
  • 刷单的费用计入劳务费吗
  • 股东以无形资产投资,撤资时怎么算
  • win7系统没有桌面图标怎么办
  • 事业单位福利发放时间
  • windows 安装
  • linux系统中的文件访问权限包括几种
  • 一般纳税人转小规模流程
  • 同城票据清算会怎么样
  • 固定资产抵账的增值税
  • 银行代收费收入是什么意思
  • php编写用户注册界面
  • 土地增值税的计算方法和步骤例题
  • 银行贷款利息已划转支付
  • php xml转数组
  • php面向对象和面向过程
  • win10系统安装配置
  • 小微企业怎么给员工交保险
  • 自动化工具 业务有哪些
  • uniapp微信小程序兼容
  • 没有初级会计证可以从事会计工作吗
  • vmware workstation pro怎么卸载干净
  • 员工的工资属于什么资产
  • 产权转移书据是什么印花税
  • 上市公司净资产转正的方法
  • phpcms技术
  • 印花税步骤
  • 小规模收入账务
  • 宣告分配现金股利和股票股利的区别
  • 固定资产后续支出一律计入固定资产成本
  • 编制弹性预算的关键在于
  • 利润太高,如何调产品收发存
  • 出租写字楼写字楼
  • 单位车辆转籍
  • 远期支票可以背书转让吗
  • 企业筹建期间发生的费用应计入什么账户
  • 新手学会计怎么学
  • 删除sql server2019
  • 老毛桃u盘启动制作工具如何把原来的win7改xp系统图文教程
  • windows录音机录音文件格式
  • Win10 Mobile 10549中Cortana电池消耗很大该怎么办?
  • win7桌面怎么设置到d盘
  • XP系统怎么安装打印机
  • win7怎么关闭自带键盘
  • winxp开启远程控制
  • win7怎么删除操作中心
  • window8设置在哪里
  • javascript基础
  • perl -p -i
  • 批处理文件的拷贝怎么写
  • ftp下载工具能自动登录ftp服务器
  • android环境搭建实验报告
  • ui课程入门
  • javascript面向对象精要pdf
  • asx文件的作用
  • 广东国家税务局电子税务局官网入口
  • 填了专项附加扣除但没有进行综合年度汇算
  • 国税系统升级后怎么添加办税人
  • 卷烟批发环节的消费税
  • 区域化管理的利与弊
  • 宁夏退休职工网上认证
  • 小规模纳税人土地使用税减免政策
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设