vue渲染数组各子项实现文本超出宽度显示tooltip

news2025/6/1 4:37:56

vue渲染数组各子项实现文本超出宽度显示tooltip

需求背景

vue项目中,通过v-for渲染数组,子项中均存在一行描述文字。当描述文字超出固定宽度时,显示省略号并且鼠标悬浮时显示tooltip;当描述文字不超出固定宽度时则正常显示,且鼠标悬浮不显示tooltip

否决方案

否决的两个方案均基于文本宽度与容器宽度的计算,具体实现将在后续实际方案中再进行详细阐述。否决方案仅做思路阐述,不做过于具体的赘述

1.存储各子项宽度计算结果

  • 具体实现:各子项描述文字容器绑定独有的ref,页面挂载完成后遍历各ref获取到对应元素并计算文本宽度与容器宽度关系,将计算结果存储在数组中。根据该结果通过v-if进行判断是否渲染tooltip
  • 否决原因:需要计算并存储所有子项的宽度对比,在数组量较大的情况下会有一定的性能问题。且在部分情境下,还需要考虑页面resize事件后是否要重新计算的问题

2.宽度计算结果实时应用渲染

  • 具体实现:各子项描述文字容器绑定独有的ref,各子项通过v-if绑定宽度计算函数,计算函数通过ref获取到对应元素并计算文本宽度与容器宽度关系,并返回计算结果。
  • 否决原因:v-if绑定的计算函数,内部需要在页面渲染完成后才能获取到对应的元素进行计算,但是无论是使用$nextTick还是结合Promise微任务都无法做到在渲染完成后计算结果并返回用于渲染更新

实现方案

宽度计算(核心)

// clientWidth为容器宽度,scrollWidth为文本完全展示时的实际宽度
isOverflowing(element) {
  return element ? element.scrollWidth > element.clientWidth : false
},

tooltip控制

<!-- 固定渲染tooltip,但手动控制显隐  -->
<a-tooltip
   :title="item.des"
   placement="top"
   :visible="visibleId == item.id">
</a-tooltip>

悬浮计算

<!-- 元素悬浮时才进行宽度计算 -->
<div
  :ref="'textRef_' + item.id"
  class="des"
  @mouseenter="handleMouseEnter(item.id)"
  @mouseleave="handleMouseLeave"
>
  {{ item.des }}
</div>

计算结果存储

// 处理鼠标进入事件
handleMouseEnter(id) {
  // 此处refs返回的是一个数组
  // 若并非绑定在v-for数组内部的子元素上时,refs返回的则是单个元素,需注意区分
  // 不一定需要refs才能获取到元素,通过事件本身传递的event对象也可获取到对应target
  const element = this.$refs['textRef_' + id][0]
  if (this.isOverflowing(element)) {
    this.visibleId = id
  }
},
// 处理鼠标离开事件
handleMouseLeave() {
  this.visibleId = ''
},

完整代码

<template>
  <div
    v-for="(item, index) in list"
    :key="index"
    class="module_item"
  >
    <div class="module_header">
      <div class="module_title">
        <div class="title">{{ item.title }}</div>
        <a-tooltip
          :title="item.des"
          placement="top"
          :visible="visibleId == item.id"
        >
          <div
            :ref="'textRef_' + item.id"
            class="des"
            @mouseenter="handleMouseEnter(item.id)"
            @mouseleave="handleMouseLeave"
          >
            {{ item.des }}
          </div>
        </a-tooltip>
      </div>
    </div>
    <div class="module_content">
      <!-- 内容 -->  
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      visibleId: '',
      list: []
    }
  },
  methods: {
    isOverflowing(element) {
      return element ? element.scrollWidth > element.clientWidth : false
    },
    // 处理鼠标进入事件
    handleMouseEnter(id) {
      const element = this.$refs['textRef_' + id][0]
      if (this.isOverflowing(element)) {
        this.visibleId = id
      }
    },
    // 处理鼠标离开事件
    handleMouseLeave() {
      this.visibleId = ''
    },
  }
}
</script>

<style lang="less" scoped>
.module_item {
  margin-top: 0.12rem;
  &:first-child {
    margin-top: 0;
  }
  .module_header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    .module_title {
      display: flex;
      align-items: center;
      gap: 0.08rem;
      .title {
        color: #000;
        font-size: 0.14rem;
      }
      .des {
        width: 1.83rem;
        color: #999;
        font-size: 0.1rem;
        text-align: left;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
      }
    }
  }
  .modules {
    margin-top: 0.08rem;
    display: flex;
    gap: 0.08rem;
  }
}
</style>

总结

  1. 悬浮时计算,不需要一次性计算所有元素的计算结果,性能良好
  2. 仅存储单个宽度计算结果控制显隐,无需冗余数据
  3. 无需v-if进行判断渲染

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2392126.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux centos 服务器性能排查 vmstat、top等常用指令

背景:项目上经常出现系统运行缓慢,由于数据库服务器是linux服务器,记录下linux服务器性能排查常用指令 vmstat vmstat介绍 vmstat 命令报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。由 vmstat 命令生成的报告可以用于平衡系统负载活动。系统范围内的这…

LiveGBS国标视频平台收流模式:UDP、TCP被动与TCP主动传输模式之差异剖析

LiveGBS国标视频平台收流模式&#xff1a;UDP、TCP被动与TCP主动传输模式之差异剖析 1、背景2、信令传输3、视频流传输3.1、UDP传输模式3.2、TCP被动传输模式3.3、TCP主动传输模式 4、WEB配置流传输模式4.1、编辑模式4.2、下拉切换模式 5、搭建GB28181视频直播平台 1、背景 在…

Tomcat 使用与配置全解

一、 Tomcat简介 Tomcat服务器是Apache的一个开源免费的Web容器。它实现了JavaEE平台下部分技术规范&#xff0c;属于轻量级应用服务器。 1. Tomcat版本 Tomcat版本 JDK版本 Servlet版本 JSP版本 10.0.X 8 and later 5.0 3.0 9.0.x 8 and later 4.0 2.3 8.0.x 7…

aws instance store 的恢复

1: aws instance store 要在launch instance 才可以创建,而且,通过snapshot 恢复后,instance store 里面的数据会丢失。 下面是创建instance store 的过程,和通过两种方式恢复,发现/etc/fstab 不同的写法,有的不能启动: [root@ip-xx ~]# lsblk NAME MAJ:MIN RM …

EasyRTC音视频实时通话助力微信小程序:打造低延迟、高可靠的VoIP端到端呼叫解决方案

一、方案概述​ 在数字化通信浪潮下&#xff0c;端到端实时音视频能力成为刚需。依托庞大用户生态的微信小程序&#xff0c;是实现此类功能的优质载体。基于WebRTC的EasyRTC音视频SDK&#xff0c;为小程序VoIP呼叫提供轻量化解决方案&#xff0c;通过技术优化实现低延迟通信&a…

STM32 SPI通信(软件)

一、SPI简介 SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司开发的一种通用数据总线四根通信线&#xff1a;SCK&#xff08;Serial Clock&#xff09;、MOSI&#xff08;Master Output Slave Input&#xff09;、MISO&#xff08;Master Input Slav…

每日刷题c++

快速幂 #include <iostream> using namespace std; #define int long long int power(int a, int b, int p) {int ans 1;while (b){if (b % 2){ans * a;ans % p; // 随时取模}a * a;a % p; // 随时取模b / 2;}return ans; } signed main() {int a, b, p;cin >> a …

ChemDraw 2023|Win英文|化学结构编辑器|安装教程

软件下载 【名称】&#xff1a;ChemDraw 2023 【大小】&#xff1a;1.34G 【语言】&#xff1a;英文界面 【安装环境】&#xff1a;Win10/Win11 【夸克网盘下载链接】&#xff08;务必手机注册&#xff09;&#xff1a; https://pan.quark.cn/s/320bcb67da80 【网站下载…

4.1.1 Spark SQL概述

Spark SQL是Apache Spark的一个模块&#xff0c;专门用于处理结构化数据。它引入了DataFrame这一编程抽象&#xff0c;DataFrame是带有Schema信息的分布式数据集合&#xff0c;类似于关系型数据库中的表。用户可以通过SQL、DataFrames API和Datasets API三种方式操作结构化数据…

redis五种数据结构详解(java实现对应的案例)

一、简述 Redis是一款高性能的键值对存储数据库&#xff0c;它支持五种基本数据类型&#xff0c;分别是字符串(String)、列表(List)、哈希(Hash)、集合(Set)、有序集合(Sorted Set)。 二、五种基本数据类型 2.1 字符串(String) String是Redis最基本的类型&#xff0c;一个key对…

React 生命周期与 Hook:从原理到实战全解析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…

【机器学习基础】机器学习入门核心算法:逻辑回归(Logistic Regression)

机器学习入门核心算法&#xff1a;逻辑回归&#xff08;Logistic Regression&#xff09; 一、算法逻辑1.1 基本概念1.2 Sigmoid函数1.3 决策边界 二、算法原理与数学推导2.1 概率建模2.2 损失函数推导2.3 梯度下降优化2.4 正则化处理 三、模型评估3.1 常用评估指标3.2 ROC曲线…

智能仓储落地:机器人如何通过自动化减少仓库操作失误?

仓库作业的速度和准确性至关重要&#xff0c;尤其是在当前对无差错、高效作业的要求达到前所未有的环境下。每一个错误&#xff0c;无论是物品放错位置还是库存差异&#xff0c;都会在供应链中产生连锁反应&#xff0c;造成延误、增加成本&#xff0c;并最终影响客户满意度。 …

[低代码表单生成器设计基础]ElementUI中Layout布局属性Form表单属性详解

Layout 布局 ElementUI 的 Layout 布局系统基于 24 栏栅格设计&#xff0c;提供了灵活的响应式布局能力&#xff0c;适用于各种页面结构的构建。(CSDN) &#x1f4d0; 基础布局结构 ElementUI 的布局由 <el-row>&#xff08;行&#xff09;和 <el-col>&#xff0…

从“被动养老”到“主动健康管理”:平台如何重构代际关系?

在老龄化与数字化交织的背景下&#xff0c;代际关系的重构已成为破解养老难题的关键。 传统家庭养老模式中&#xff0c;代际互动多表现为单向的“赡养-被赡养”关系。 而智慧养老平台的介入&#xff0c;通过技术赋能、资源整合与情感连接&#xff0c;正在推动代际关系向“协作…

贪心算法应用:最大匹配问题详解

Java中的贪心算法应用:最大匹配问题详解 贪心算法是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致结果是全局最优的算法策略。在Java中,贪心算法可以应用于多种问题,其中最大匹配问题是一个经典的应用场景。下面我将从基础概念到具体实现,全面详细地讲解贪…

爬虫IP代理效率优化:策略解析与实战案例

目录 一、代理池效率瓶颈的根源分析 二、六大核心优化策略 策略1&#xff1a;智能IP轮换矩阵 策略2&#xff1a;连接复用优化 策略3&#xff1a;动态指纹伪装 策略4&#xff1a;智能重试机制 三、典型场景实战案例 案例1&#xff1a;电商价格监控系统 案例2&#xff1a…

豆瓣电视剧数据工程实践:从爬虫到智能存储的技术演进(含完整代码)

通过网盘分享的文件&#xff1a;资料 链接: https://pan.baidu.com/s/1siOrGmM4n-m3jv95OCea9g?pwd4jir 提取码: 4jir 1. 引言 1.1 选题背景 在影视内容消费升级背景下&#xff0c;豆瓣电视剧榜单作为国内最具影响力的影视评价体系&#xff0c;其数据价值体现在&#xff1a…

基于微信小程序的漫展系统的设计与实现

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

基于Web的分布式图集管理系统架构设计与实践

引言&#xff1a;为什么需要分布式图集管理&#xff1f; 在现代Web图形应用中&#xff0c;纹理图集&#xff08;Texture Atlas&#xff09;技术是优化渲染性能的关键手段。传统的图集制作流程通常需要美术人员使用专业工具&#xff08;如TexturePacker&#xff09;离线制作&am…