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

news2025/2/18 17:59:12

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>

最终效果图

在这里插入图片描述

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

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

相关文章

DeepSeek 助力 Vue 开发:打造丝滑的开关切换(Switch)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

使用Python爬虫实时监控行业新闻案例

目录 背景环境准备请求网页数据解析网页数据定时任务综合代码使用代理IP提升稳定性运行截图与完整代码总结 在互联网时代&#xff0c;新闻的实时性和时效性变得尤为重要。很多行业、技术、商业等领域的新闻都可以为公司或者个人发展提供有价值的信息。如果你有一项需求是要实时…

语言大模型基础概念 一(先了解听说过的名词都是什么)

SFT&#xff08;监督微调&#xff09;和RLHF&#xff08;基于人类反馈的强化学习&#xff09;的区别 STF&#xff08;Supervised Fine-Tuning&#xff09;和RLHF&#xff08;Reinforcement Learning from Human Feedback&#xff09;是两种不同的模型训练方法&#xff0c;分别…

DeepSeek v3 技术报告阅读笔记

注 本文参考 DeepSeek-v3 / v2 / v1 Technical Report 及相关参考模型论文本文不包括基础的知识点讲解&#xff0c;为笔记/大纲性质而非教程&#xff0c;建议阅读技术报告原文交流可发送至邮箱 henryhua0721foxmail.com 架构核心 核心&#xff1a; MLA 高效推理DeepSeekMOE 更…

GESP2024年9月认证C++七级( 第三部分编程题(1)小杨寻宝)

参考程序&#xff1a; #include <bits/stdc.h> using namespace std; const int N 1e510; vector<int> g[N]; // 图的邻接表 int col[N], dep[N], has[N];// 深度优先遍历&#xff0c;计算每个节点的深度 void dfs(int x, int fa) {dep[x] dep[fa] 1; // 计算…

解锁电商数据宝藏:淘宝商品详情API实战指南

在电商蓬勃发展的今天&#xff0c;数据已成为驱动业务增长的核心引擎。对于商家、开发者以及数据分析师而言&#xff0c;获取精准、实时的商品数据至关重要。而淘宝&#xff0c;作为国内最大的电商平台&#xff0c;其海量商品数据更是蕴含着巨大的价值。 本文将带你深入探索淘…

webshell通信流量分析

环境安装 Apatche2 php sudo apt install apache2 -y sudo apt install php libapache2-mod-php php-mysql -y echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php sudo ufw allow Apache Full 如果成功访问info.php&#xff0c;则环境安…

在 rtthread中,rt_list_entry (rt_container_of) 已知结构体成员的地址,反推出结构体的首地址

rt_list_entry (rt_container_of)宏定义&#xff1a; /*** rt_container_of - return the start address of struct type, while ptr is the* member of struct type.*/ #define rt_container_of(ptr, type, member) \((type *)((char *)(ptr) - (unsigned long)(&((type *…

趣味魔法项目 LinuxPDF —— 在 PDF 中启动一个 Linux 操作系统

最近&#xff0c;一位开源爱好者开发了一个LinuxPDF 项目&#xff08;ading2210/linuxpdf: Linux running inside a PDF file via a RISC-V emulator&#xff09;&#xff0c;它的核心功能是在一个 PDF 文件中启动并运行 Linux 操作系统。它通过巧妙地使用 PDF 文件格式中的 Ja…

【Linux】Socket编程—TCP

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…

新数据结构(9)——Java异常体系

异常的种类 程序本身通常无法主动捕获并处理错误&#xff08;Error&#xff09;&#xff0c;因为这些错误通常表示系统级的严重问题&#xff0c;但程序可以捕获并处理异常&#xff08;Excrption&#xff09;&#xff0c;而Error则被视为一种程序无法或不应尝试恢复的异常类型。…

NixHomepage - 简单的个人网站

&#x1f4bb; NixHomepage - 简单的个人网站 推荐下个人的开源项目&#xff0c;演示网站&#xff0c;项目链接 https://github.com/nixgnauhcuy/NixHomepage&#xff0c;喜欢的话可以为我的项目点个 Star~ &#x1f4f7; 预览 ⚙️ 功能特性 多平台适配 明亮/暗黑模式切换 W…

HCIA项目实践---OSPF的知识和原理总结

9.5 OSPF 9.5.1 从哪些角度评判一个动态路由协议的好坏&#xff1f; &#xff08;1&#xff09;选路佳&#xff08;是否会出环&#xff09; OSPF 协议采用链路状态算法&#xff0c;通过收集网络拓扑信息来计算最短路径&#xff0c;从根本上避免了路由环路的产生。 &#xff08…

Calico网络组件本地部署支持IPv6(Kubernetes)

知其然 问题背景 因项目现场的网络正逐步从IPv4向IPv6迁移&#xff0c;这几年现场服务器基本上都配置了双栈&#xff1b;但随着IPv6铺开&#xff0c;出现了很多纯IPv6的服务器&#xff0c;并且要求通信优先使用IPv6。 在项目建设之初&#xff0c;其实就考虑了上述情况&#…

【广州大学主办,发表有保障 | IEEE出版,稳定EI检索,往届见刊后快至1个月检索】第二届电气技术与自动化工程国际学术会议 (ETAE 2025)

第二届电气技术与自动化工程国际学术会议 (ETAE 2025) The 2nd International Conference on Electrical Technology and Automation Engineering 大会官网&#xff1a;http://www.icetae.com/【更多详情】 会议时间&#xff1a;2025年4月25-27日 会议地点&#xff1a…

Python项目31:待办事项列表应用1.0(命令行界面+Json+类+初学者必做)

------------★Python练手项目源码★------------ Python项目27&#xff1a;用Tkinter写日志管理系统&#xff08;中下等难度&#xff09; Python项目26&#xff1a;设计学生成绩管理系统&#xff08;简易版&#xff09; Python项目25&#xff1a;带滚动效果的商场抽奖系统&…

Redis 01 02章——入门概述与安装配置

一、入门概述 &#xff08;1&#xff09;是什么 Redis&#xff1a;REmote Dictionary Server&#xff08;远程字典服务器&#xff09;官网解释&#xff1a;Remote Dictionary Server(远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;是一个高…

Large Language Model Distilling Medication Recommendation Model

摘要&#xff1a;药物推荐是智能医疗系统的一个重要方面&#xff0c;因为它涉及根据患者的特定健康需求开具最合适的药物。不幸的是&#xff0c;目前使用的许多复杂模型往往忽视医疗数据的细微语义&#xff0c;而仅仅严重依赖于标识信息。此外&#xff0c;这些模型在处理首次就…

2025最新版Node.js下载安装~保姆级教程

1. node中文官网地址&#xff1a;http://nodejs.cn/download/ 2.打开node官网下载压缩包&#xff1a; 根据操作系统不同选择不同版本&#xff08;win7系统建议安装v12.x&#xff09; 我这里选择最新版win 64位 3.安装node ①点击对话框中的“Next”&#xff0c;勾选同意后点…

springboot如何将lib和jar分离

遇到一个问题&#xff0c;就是每次maven package或者maven install后target中的jar很大&#xff0c;少的50几MB&#xff0c;大的100多兆 优化前&#xff1a; 优化后&#xff1a; 优化前 优化后压缩率77.2MB4.65MB93% 具体方案&#xff1a; pom.xml中 <build><…