vue3+element-plus中的el-table表头和el-table-column内容全部一行显示完整(hook函数)

hook函数封装

export const useTableColumnWidth = _this => {
  const { refTable } = _this
  const columnWidthObj = ref()

  const getTableColumnWidth = cb => {
    nextTick(() => {
      columnWidthObj.value = {}
      // 获取行rows
      const tableEle = refTable?.refBaseTable?.$el
      if (!tableEle) return
      const rows = tableEle.querySelectorAll(
        '.el-table__body-wrapper .el-table__row'
      )
      if (!rows.length) return
      // 获取props
      const hideRows = tableEle.querySelectorAll('.hidden-columns div')
      // 每一行的列总数
      const cells = rows[0].cells
      Array.from(cells).forEach((cell, i) => {
        // 初始化内容宽度
        let maxVal = 0
        // 获取prop属性
        const prop = hideRows[i].getAttribute('data-prop')
        if (!prop) return
        // 计算一列内容最宽的宽度
        Array.from(rows).forEach(row => {
          // 将表格列的元素转化为行内元素,最大限度的保持一行显示,从而计算内容的宽度
          const cellsEle = row.cells[i]
          cellsEle.style.display = 'inline-block'
          cellsEle.style.width = '100vw'
          const cellEle = cellsEle.querySelector('.cell')
          // 比较一列最长的宽度数值
          cellEle.style.display = 'inline-block'
          maxVal = Math.max(
            cellEle.getBoundingClientRect().width + 1, // 必须用这个方法,否则小数点会被忽略
            maxVal
          )
          // 将表格列的元素恢复为表格布局
          cellsEle.style.display = 'table-cell'
          cellsEle.style.width = 'auto'
          cellEle.style.display = 'block'
        })
        columnWidthObj.value[prop] = Math.ceil(maxVal)
      })
      cb(columnWidthObj.value)
      // console.log('this.columnWidthObj', columnWidthObj.value)
    })
  }

  return {
    columnWidthObj,
    getTableColumnWidth
  }
}

自定义组件封装

  1. BaseTable
<template>
  <el-table
    ref="refBaseTable"
    class="dy-list-table"
    element-loading-background="rgba(0, 0, 0, 0.8)"
    :stripe="stripe"
    border
    :height="height"
    :="$attrs"
  >
    <slot />
  </el-table>
</template>

<script setup>
defineProps({
  height: {
    type: String,
    default: '100%'
  },
  stripe: {
    type: Boolean,
    default: true
  }
})

const refBaseTable = ref(null)

defineExpose({
  refBaseTable
})
</script>
  1. TableColumn
<template>
  <el-table-column
    v-if="hasDefaultSlot"
    :min-width="getMinWidth()"
    :width="cWidth"
    :data-prop="dataProp"
    :="$attrs"
  >
    <template #default="scope">
      <slot v-bind="scope" />
    </template>
  </el-table-column>
  <el-table-column
    v-else
    :min-width="getMinWidth()"
    :width="cWidth"
    :data-prop="dataProp"
    :="$attrs"
  />
</template>

<script setup>
const props = defineProps({
  dataProp: {
    type: String,
    default: ''
  },
  width: {
    type: [String, Number],
    default: ''
  }
})

const $attrs = useAttrs()
const slots = useSlots()
const cWidth = ref(props.width)

const hasDefaultSlot = computed(() => !!slots.default)

const getMinWidth = () => {
  // 表头宽度
  const minWidth = g_utils.calcTextWidth($attrs.label)
  // 表头宽度与展示内容宽度对比出最大值
  let actualWidth = $attrs['column-width']
    ? Math.max(minWidth, $attrs['column-width'])
    : minWidth
  if ($attrs['show-overflow-tooltip'] !== undefined) {
    actualWidth += 2
  }
  if ($attrs['column-type'] === 'width') {
    cWidth.value = actualWidth + 10 // 10为随机数
    return ''
  } else {
    if ($attrs.sortable !== undefined) actualWidth += 24
    return actualWidth
  }
}
</script>
  1. 动态计算文本的宽度
export const calcTextWidth = (
  str = '',
  style = {
    fontSize: '16px',
    fontWeight: 'bold'
  }
) => {
  // 新建一个 span
  const span = document.createElement('span')
  // 设置表头名称
  span.innerText = str
  // 设置表头样式
  span.style.fontSize = style.fontSize
  span.style.fontWeight = style.fontWeight
  // 临时插入 document
  document.body.appendChild(span)
  // 重点:获取 span 最小宽度,设置当前列,注意这里加了 20,字段较多时还是有挤压,且渲染后的 div 内左右 padding 都是 10,所以 +20 。(可能还有边距/边框等值,需要根据实际情况加上)
  const width = span.getBoundingClientRect().width + 25
  // 移除 document 中临时的 span
  document.body.removeChild(span)
  return Math.ceil(width) // 存在宽度为小数的情况
}

使用教程

<BaseTable
  ref="refContentTable"
  v-loading="loading"
  :data="tableData"
  row-key="imei"
  style="margin-top: 10px"
>
  <TableColumn
    align="center"
    prop="imei"
    data-prop="imei"
    :label="$t('public.IMEI')"
    :column-width="columnWidthObj.imei"
  />
</BaseTable>

<script setup>
const loading = ref(false)
const refContentTable = ref(null)
const tableData = ref([])
const columnWidthObj = ref({})

const getDeviceList = () => {
  loading.value = true
  apiDeviceList({
    pageNum: pageNum.value,
    pageSize: pageSize.value,
    ...listParams.value
  })
    .then(({code, data}) => {
      if (code === '200' && data) {
        tableData.value = data.items
        useTableColumnWidth({
          refTable: refContentTable.value
        }).getTableColumnWidth(data => {
          columnWidthObj.value = data
        })
      }
    })
    .finally(() => {
      loading.value = false
    })
}

onMounted(() => {
  getDeviceList()
})
</script>

最终效果图

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Qt 和微信小程序的用户管理系统:WebSocket + SQLite 实现注册与登录

目录 一. 概要 二. 技术栈 三. 系统功能设计 3.1 功能模块 3.2 数据表设计 四. 具体实现 4.1 Qt 服务端 4.1.1 初始化 WebSocket 服务器 4.1.2 用户管理界面 4.2 微信小程序端 4.2.1 注册功能 4.2.2 登录功能 五. 运行效果 六. 源码下载 一. 概要 在物联网和智能设备…

小小小病毒(3)(~_~|)

一分耕耘一分收获 声明&#xff1a; 仅供损害电脑&#xff0c;不得用于非法。损坏电脑&#xff0c;作者一律不负责。此作为作者原创&#xff0c;转载请经过同意。 欢迎来到小小小病毒&#xff08;3&#xff09; 感谢大家的支持 还是那句话&#xff1a;上代码&#xff01; …

java nio 原理 非阻塞IO Netty

一、为什么必须去了解NIO 首先你需要之后Netty的主要实现手段就是Nio,很多人一直学不明白Netty&#xff0c;根本原因是 除了日常开发中很难能够实践&#xff0c;很大一部分原因是不熟悉NIO&#xff0c;事实上真正熟悉了NIO和它背后的原理之后&#xff0c;去查看Netty的源码就有…

非侵入式观测进程里的某个线程的tls数据

一、背景 在之前的 线程局部存储tls的原理和使用_linux tls存放在堆区-CSDN博客 博客里&#xff0c;我们讲到了glibc提供的tls机制及tls的原理及与内核的配合逻辑。在之前的 非gdb方式观察应用程序的运行时的变量状态-CSDN博客 博客里&#xff0c;我们讲到了如何非侵入式观测进…

平面与平面相交算法杂谈

1.前言 空间平面方程&#xff1a; 空间两平面如果不平行&#xff0c;那么一定相交于一条空间直线&#xff0c; 空间平面求交有多种方法&#xff0c;本文进行相关讨论。 2.讨论 可以联立方程组求解&#xff0c;共有3个变量&#xff0c;2个方程&#xff0c;而所求直线有1个变量…

C#(Winform)通过添加AForge添加并使用系统摄像机

先展示效果 AForge介绍 AForge是一个专门为开发者和研究者基于C#框架设计的, 也是NET平台下的开源计算机视觉和人工智能库 它提供了许多常用的图像处理和视频处理算法、机器学习和神经网络模型&#xff0c;并且具有高效、易用、稳定等特点。 AForge主要包括: 计算机视觉与人…

Golang并发编程最佳实践:协程与通道

Golang并发编程最佳实践&#xff1a;协程与通道 本文旨在介绍Golang并发编程的最佳实践&#xff0c;重点讨论协程和通道的使用方法&#xff0c;以及相关的实际案例和代码示例。 一、Golang并发编程简介 又称Go语言&#xff09;是一种由Google开发的编程语言&#xff0c;旨在提供…

Uniapp 短视频去水印解析工具开发实现

最近搞了一个有意思的小工具——短视频去水印解析器&#xff01;这玩意儿可以把短视频中的水印给抹掉&#xff0c;还能提取视频、封面等资源。整个项目用了 Uniapp 开发&#xff0c;做完后体验了一下&#xff0c;发现还挺顺手。今天就来跟大家聊聊实现思路和代码细节~ 需求分析…

LeapMotion第2代 Unity示范代码(桌面开发)

一、官方地址&#xff1a; 官网&#xff1a;https://www.ultraleap.com/ 驱动下载&#xff1a;https://leap2.ultraleap.com/downloads/leap-motion-controller-2/ docs地址&#xff1a;https://docs.ultraleap.com/xr-and-tabletop/tabletop/unity/getting-started/index.html…

【Qt】模型/视图(Model/View)框架详解(一):基本概念

1、简述 1.1 框架 Qt的模型/视图(Model/View)框架 源自 模型-视图-控制器 (MVC) ; 模型 提供从数据集合(比如,数据库)中获取数据;视图 提供显示数据的界面;控制器 提供用户通过界面修改数据的接口;在Qt模型/视图框架中,称之为“委托Delegate”1.2 通信 模型,视图…

如何在Spring Boot中使用Profiles实现环境隔离

文章目录 如何在Spring Boot中使用Profiles实现环境隔离什么是Spring Profiles1.基本概念2.配置管理3.使用场景4.条件化配置5.优点Spring Profiles的基础知识1.Profile的定义2.配置文件3.激活Profiles4.条件化配置5.Profile的优先级与合并6.Profiles的最佳实践配置文件的组织1.…

《pytorch》——优化器的解析和使用

优化器简介 在 PyTorch 中&#xff0c;优化器&#xff08;Optimizer&#xff09;是用于更新模型参数以最小化损失函数的关键组件。在机器学习和深度学习领域&#xff0c;优化器是一个至关重要的工具&#xff0c;主要用于在模型训练过程中更新模型的参数&#xff0c;其目标是最…

应用层优秀的共享民宿物联网框架该怎么选?

有一说一&#xff0c;应用层优秀的物联网框架通常能帮助提升用户体验、提高运营效率、节能减排等等优势&#xff0c;很多老板也很注重这个层面的设计和打磨&#xff0c;那么对于选择应用层优秀的共享民宿物联网框架时&#xff0c;大家可以从哪几个关键因素进行考量呢&#xff1…

DeepSeek自动化写作软件

DeepSeek写作软件的三大核心功能 对于内容创作者来说&#xff0c;写作不仅是表达思想的过程&#xff0c;更是一项需要投入大量时间和精力的任务。面对日益增长的内容需求&#xff0c;写作效率低下、内容质量不高等问题&#xff0c;常常让创作者感到焦虑。而 DeepSeek 写作软件…

CPT205 计算机图形学 OpenGL 3D实践(CW2)

文章目录 1. 介绍2. 设计3. 准备阶段4. 角色构建5. 场景构建6. 交互部分6.1 键盘交互6.2 鼠标交互6.3 鼠标点击出多级菜单进行交互 7. 缺点与问题7.1 程序bug7.2 游戏乐趣不足7.3 画面不够好看 8. 完整代码 1. 介绍 前面已经分享过了关于CPT205的CW1的2D作业&#xff0c;这次C…

Matlab离线安装硬件支持包的方法

想安装支持树莓派的包&#xff0c;但是发现通过matlab安装需要续订维护服务 可以通过离线的方式安装。 1. 下载SupportSoftwareDownloader Support Software Downloader - MATLAB & Simulink 登录账号 选择对应的版本 2. 选择要安装的包 3.将下载的包copy到安装目录下 …

在蓝耘平台使用4090显卡跑一下深度学习算法-教学文章

本次项目展示了如何使用线性回归模型完成房价预测。尽管线性回归简单有效&#xff0c;但在实际问题中&#xff0c;特征与目标变量可能呈现复杂的非线性关系。这时&#xff0c;可以考虑改用其他模型&#xff0c;如决策树、随机森林或深度学习。 文章目录 前言1. 数据集成与管理2…

springboot整合mybatis-plus(保姆教学) 及搭建项目

一、Spring整合MyBatis (1)将MyBatis的DataSource交给Spring IoC容器创建并管理&#xff0c;使用第三方数据库连接池(Druid&#xff0c;C3P0等)代替MyBatis内置的数据库连接池 (2)将MyBatis的SqlSessionFactory交给Spring IoC容器创建并管理&#xff0c;使用spring-mybatis整…

景联文科技:以精准标注赋能AI未来,打造高质量数据基石

在人工智能蓬勃发展的时代&#xff0c;数据已成为驱动技术革新的核心燃料&#xff0c;而高质量的数据标注则是让AI模型从“感知”走向“认知”的关键桥梁。作为深耕数据服务领域的创新者&#xff0c;景联文科技始终以“精准、高效、安全”为核心理念&#xff0c;为全球AI企业提…

云创智城充电系统:基于 SpringCloud 的高可用、可扩展架构详解-多租户、多协议兼容、分账与互联互通功能实现

在新能源汽车越来越普及的今天&#xff0c;充电基础设施的管理和运营变得越来越重要。云创智城充电系统&#xff0c;就像一个超级智能管家&#xff0c;为新能源充电带来了全新的解决方案&#xff0c;让充电这件事变得更方便、更高效、更安全。 一、厉害的技术架构&#xff0c;让…