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

cursor-关于自定义指令的问题处理

问题描述:

        今天碰见一个关于自定义指令的问题,在项目中关于el-tooltip组件封装了一个自定义组件,功能就是常规的悬浮窗显示鼠标选中的文本,做一个具体的全部展示。问题是这个数据是会更新的,但是悬浮窗中的文本数据仍然是前一次的数据,所以鼠标悬浮之后显示为上一次的数据,造成了这个问题,当然只要是定位到了问题,并且可以复现,那么还是老规矩,先交给cursor去试试。

修改前:

import type { DirectiveBinding } from 'vue'
import { ElTooltip } from 'element-plus'
import { h, render } from 'vue'function setupTruncateTooltip(el: HTMLElement, binding: DirectiveBinding) {const updateTooltip = () => {const text = el.innerTextconst classes = el.classNameconst inputWidth = el.offsetWidthconst scrollWidth = el.scrollWidth// 内容长度大于元素长度时,显示tooltipif (scrollWidth > inputWidth) {if (!el.parentElement?.classList.contains('el-tooltip__trigger')) {// 创建tooltip vnodeconst tooltipVNode = h(ElTooltip, {content: text,placement: 'top-end',effect: 'dark',}, () => [h('span', { class: classes }, { default: () => el.cloneNode(true) })])// 渲染tooltipconst container = document.createElement('div')render(tooltipVNode, container)// 找到tooltip元素const tooltipElement = container.querySelector('.el-tooltip__trigger') || container.firstElementChildif (tooltipElement) {el.parentNode?.insertBefore(tooltipElement, el)// el 增加一个style 样式为宽度100%el.style.width = '100%'tooltipElement.appendChild(el)}}} else {const tooltipTrigger = el.closest('.el-tooltip__trigger')// 清除style为100%el.style.cssText = ''if (tooltipTrigger && tooltipTrigger !== el) {tooltipTrigger.parentNode?.insertBefore(el, tooltipTrigger)tooltipTrigger.parentNode?.removeChild(tooltipTrigger)}}}// 初始设置updateTooltip()// 监听元素内容变化const observer = new MutationObserver(updateTooltip)observer.observe(el, {childList: true,characterData: true,subtree: true,})// 监听窗口大小变化window.addEventListener('resize', updateTooltip)// 清理函数el._cleanup = () => {observer.disconnect()window.removeEventListener('resize', updateTooltip)}
}export default {mounted(el: HTMLElement, binding: DirectiveBinding) {setupTruncateTooltip(el, binding)},updated(el: HTMLElement, binding: DirectiveBinding) {setupTruncateTooltip(el, binding)},
}

修改后:

import type { DirectiveBinding } from 'vue'
import { ElTooltip } from 'element-plus'
import { h, render, nextTick } from 'vue'// 扩展 HTMLElement 类型,添加自定义属性
declare global {interface HTMLElement {_tooltipInstance?: any_cleanup?: () => void_tooltipContainer?: HTMLElement}
}function setupTruncateTooltip(el: HTMLElement, binding: DirectiveBinding) {const updateTooltip = async () => {// 等待 DOM 更新完成await nextTick()const text = el.innerTextconst classes = el.classNameconst inputWidth = el.offsetWidthconst scrollWidth = el.scrollWidth// 内容长度大于元素长度时,显示tooltipif (scrollWidth > inputWidth) {if (!el.parentElement?.classList.contains('el-tooltip__trigger')) {// 创建tooltip vnodeconst tooltipVNode = h(ElTooltip, {content: text,placement: 'top-end',effect: 'dark',}, () => [h('span', { class: classes }, { default: () => el.cloneNode(true) })])// 渲染tooltipconst container = document.createElement('div')render(tooltipVNode, container)// 找到tooltip元素const tooltipElement = container.querySelector('.el-tooltip__trigger') || container.firstElementChildif (tooltipElement) {el.parentNode?.insertBefore(tooltipElement, el)// el 增加一个style 样式为宽度100%el.style.width = '100%'tooltipElement.appendChild(el)// 保存 tooltip 实例和容器引用,用于后续更新el._tooltipInstance = tooltipVNodeel._tooltipContainer = container}} else {// 如果已经存在 tooltip,更新其内容updateExistingTooltip(el, text)}} else {const tooltipTrigger = el.closest('.el-tooltip__trigger')// 清除style为100%el.style.cssText = ''if (tooltipTrigger && tooltipTrigger !== el) {tooltipTrigger.parentNode?.insertBefore(el, tooltipTrigger)tooltipTrigger.parentNode?.removeChild(tooltipTrigger)// 清理引用el._tooltipInstance = undefinedel._tooltipContainer = undefined}}}// 更新已存在的 tooltip 内容const updateExistingTooltip = (el: HTMLElement, newText: string) => {if (el._tooltipInstance && el._tooltipContainer) {// 重新创建 tooltip vnode 并更新内容const newTooltipVNode = h(ElTooltip, {content: newText,placement: 'top-end',effect: 'dark',}, () => [h('span', { class: el.className }, { default: () => el.cloneNode(true) })])// 重新渲染render(newTooltipVNode, el._tooltipContainer)// 更新引用el._tooltipInstance = newTooltipVNode}}// 初始设置updateTooltip()// 监听元素内容变化const observer = new MutationObserver(() => {// 使用防抖,避免频繁更新clearTimeout(el._updateTimer)el._updateTimer = setTimeout(updateTooltip, 50)})observer.observe(el, {childList: true,characterData: true,subtree: true,})// 监听窗口大小变化const handleResize = () => {clearTimeout(el._resizeTimer)el._resizeTimer = setTimeout(updateTooltip, 100)}window.addEventListener('resize', handleResize)// 清理函数el._cleanup = () => {observer.disconnect()window.removeEventListener('resize', handleResize)clearTimeout(el._updateTimer)clearTimeout(el._resizeTimer)// 清理 tooltip 相关引用if (el._tooltipContainer) {el._tooltipContainer.remove()}el._tooltipInstance = undefinedel._tooltipContainer = undefined}
}export default {mounted(el: HTMLElement, binding: DirectiveBinding) {setupTruncateTooltip(el, binding)},updated(el: HTMLElement, binding: DirectiveBinding) {// 在 updated 钩子中重新设置,确保数据更新后 tooltip 内容也更新setupTruncateTooltip(el, binding)},unmounted(el: HTMLElement) {// 组件卸载时清理if (el._cleanup) {el._cleanup()}},
}

结果:

        cursor不负众望,完成了我想要的结果。还是感叹AI的强大辅助能力,在这里记录一下。


文章转载自:

http://DerzUpjq.LLqky.cn
http://XIEXyCji.LLqky.cn
http://C2nVjmjP.LLqky.cn
http://4MP5ezpA.LLqky.cn
http://WxhINX2u.LLqky.cn
http://srfQ90UN.LLqky.cn
http://nuADBQeg.LLqky.cn
http://byfjn6Kf.LLqky.cn
http://0eTXMoLb.LLqky.cn
http://us9w0ZOq.LLqky.cn
http://VJy8Yefw.LLqky.cn
http://jazOdXWb.LLqky.cn
http://ZFJV1vHQ.LLqky.cn
http://exI4DUX7.LLqky.cn
http://6DO3hp5x.LLqky.cn
http://65NQULOE.LLqky.cn
http://dA09UxVy.LLqky.cn
http://9Cyujcxu.LLqky.cn
http://9mwNsXVJ.LLqky.cn
http://cUeBhzzB.LLqky.cn
http://lofrUgfl.LLqky.cn
http://Zl3w6taJ.LLqky.cn
http://r7Y5PDP6.LLqky.cn
http://4Gv9H4e1.LLqky.cn
http://HlcHZPzV.LLqky.cn
http://ylsFZicx.LLqky.cn
http://dytCMz9p.LLqky.cn
http://zyu3KTGj.LLqky.cn
http://gBkkzd49.LLqky.cn
http://EADU6gvJ.LLqky.cn
http://www.dtcms.com/a/386168.html

相关文章:

  • Vision Transformer (ViT) :Transformer在computer vision领域的应用(四)
  • 【开题答辩全过程】以 “今天吃什么”微信小程序为例,包含答辩的问题和答案
  • iOS App 内存泄漏与性能调优实战 如何排查内存问题、优化CPU与GPU性能、降低耗电并提升流畅度(uni-app iOS开发优化指南)
  • 从 Token 拦截器到 Web 配置
  • Next.js 的原理和它的使用场景
  • SPAR模型优化思路
  • pycharm+miniconda cursor+miniconda配置
  • windows在pycharm中为项目添加已有的conda环境
  • 微信小程序实现-单选-以及全选功能。
  • 知识点19:生产环境的安全与治理
  • 软件开源协议(Open Source License)介绍
  • SAP HANA Scale-out 04:缓存
  • ios制作storyboard全屏启动图
  • 2025高教杯数学建模大赛全流程,从数据处理、建模到模型评价
  • 点拨任务应用于哪些业务场景
  • 墨色规则与血色节点:C++红黑树设计与实现探秘
  • C#语言入门详解(19)委托详解
  • 【数字展厅】企业展厅设计怎样平衡科技与人文呈现?
  • Day25_【深度学习(3)—PyTorch使用(6)—张量拼接操作】
  • WSL2(ubuntu20.04)+vscode联合开发(附迁移方法)
  • 无线数传模块优化汽车装配立库物料运送设备间低延迟通信方案
  • Parasoft助力「东软睿驰」打造高质量汽车软件
  • 设计多租户 SaaS 系统,如何做到数据隔离 资源配额?
  • 基于错误xsleak 悬空标记 使用css利用帧计数 -- Pure leak ASIS CTF 2025
  • 【Day 57】Redis的部署
  • 在 Zellij 中用 Neovim 优雅地解决剪贴板同步问题
  • 云手机的技术架构可分为哪些
  • 基于 GitHub Actions 的 Kubernetes 集群节点变更操作自动化
  • 嵌入式第五十四天(EPIT,GPT)
  • 何为楼宇自动化控制系统的质量管理?本质与关键要素解析