el-table表头自适应表格内容宽度方法
一、问题引入
表格内容不一致,需要自适应宽度展示
二、方案一
场景:直接根据表格内容,动态设置宽度,适用于不同权限,内容减少
代码如下
<el-table-column label="操作" class-name="handle-column" :width="autoWidth" align="left" fixed="right">
</el-table-column>
获取列表数据的时候,自适应调整宽度
getTableList(data) { this.tableList = data; this.$nextTick(() => { const tds = document.querySelectorAll('td.handle-column>.cell') if (tds && tds.length) { this.autoWidth = Math.max(...[...tds].map(v => v.offsetWidth)) this.$refs.tableBox1.doLayout() } }); },
三、方案二
场景:直接根据内容字符串长度,动态设置宽度。需根据不同类型字符串字符,设置不同宽度。
定义字符宽度并计算每行内容最大宽度
/** * @description: 自适应表格列宽 * @param {*} prop 列字段名(字符串) * @param {*} label 表头名(字符串) * @param {*} tableData tableData 表格数据源(变量) * @param {*} flag 'max'或'equal',默认为'max' * @param {*} flag flag为'max'则设置列宽适配该列中最长的内容,flag为'equal'则设置列宽适配该列中第一行内容的长度 * @return {*} */ function flexColumnWidth(prop, label, tableData, flag = 'max') { let columnWidth = 0 let minWidth = 80 if (label && label.length) { minWidth = label.split('').reduce((pre, cur) => { pre += getChrtSize(cur) return pre; }, 0) } if (tableData && tableData.length && prop && prop.length) { if (flag === 'equal') { // 获取该列中第一个不为空的数据(内容) const columnContent = tableData.find(v => v[prop]) || '' columnWidth = columnContent.split('').reduce((pre, cur) => { pre += getChrtSize(cur) return pre; }, 0) } else { // 获取该列中最长的数据(内容) const contentList = tableData.map(v => { if (v[prop]) { const length = v[prop].split('').reduce((pre, cur) => { pre += getChrtSize(cur) return pre; }, 0) return length; } return 0; }) console.log('contentList', contentList); columnWidth = Math.max(...contentList) } } console.log('label', label, minWidth, prop, columnWidth, tableData); const width = (columnWidth < minWidth) ? minWidth : columnWidth return ((width + 20) + 'px'); } function getChrtSize(char) { if (char >= 'a' && char <= 'z') { // 小写英文字符,分配8个单位宽度 return 8 } else if (char >= 'A' && char <= 'Z') { // 小写英文字符,分配12个单位宽度 return 12 } else if (char >= '\u4e00' && char <= '\u9fa5') { // 中文字符,分配15个单位宽度 return 15 } else if ((char > 0 && char < 9) || char == '0') { // 数字字符,分配8个单位宽度 return 10 } else { // 其他种类字符,分配10个单位宽度 return 8 } }
页面上使用
1 2 | <el-table-column resizable v- for = "(v, i) in selectFieldDetail" :key= "i" :label= "v.chnField" :prop= "v.field" :width= "$flexColumnWidth(v.field, v.chnField, detailData)" :show-overflow-tooltip= "true" > </el-table-column> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!