vue如何实现el

您所在的位置:网站首页 el-table设置列宽 vue如何实现el

vue如何实现el

2023-03-30 04:18| 来源: 网络整理| 查看: 265

vue如何实现el-table列宽自适应 发布时间:2021-05-08 13:31:23 来源:亿速云 阅读:2665 作者:小新 栏目:开发技术

这篇文章给大家分享的是有关vue如何实现el-table列宽自适应的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

vue是什么

Vue是一套用于构建用户界面的渐进式JavaScript框架,Vue与其它大型框架的区别是,使用Vue可以自底向上逐层应用,其核心库只关注视图层,方便与第三方库和项目整合,且使用Vue可以采用单文件组件和Vue生态系统支持的库开发复杂的单页应用。

背景

Element UI 是 PC 端比较流行的 Vue.js UI 框架,它的组件库基本能满足大部分常见的业务需求。但有时候会有一些定制性比较高的需求,组件本身可能没办法满足。最近在项目里就碰到了。

很多页面都需要用到表格组件el-table。如果没有给el-table-column指定宽度,默认情况下会平均分配给剩余的列。在列数比较多的情况,如果el-table宽度限定在容器内,单元格里的内容就会换行。强制不换行,内容要么在单元格内滚动,要么就会溢出或被截断。

产品想要的效果是:内容保持单行显示,列间距保持一致,表格超出容器允许水平滚动。el-table-column是支持设置固定宽度的,在内容宽度可预知的情况下,也能满足这个需求。问题就在于如何让列宽动态适应内容的宽度。在官方文档也没找到这样的选项,应该是组件本身不支持。

技术方案

于是想到了动态计算内容宽度的方案。网上也有人提过这个思路,做法是根据内容字符数来计算宽度。这种方法有几个局限:

内容必须是文本

不同字符宽度不一,结算结果不够准确

需要在渲染前操作数据,不利于解耦

我采用了另一种思路,还是动态计算内容宽度,但是根据实际渲染后的 DOM 元素宽度,这样就能解决上面三个问题。

具体怎么做呢?通过查看渲染后的 DOM 元素发现,el-table 的表头和内容分别用了一个原生table,通过colgroup设置每列的宽度。就从这里入手,col的name属性值和对应的 td的class值是一致的,这样就可以遍历对应列的所有单元格,找出宽度最大的单元格,用它的内容宽度加上一个边距作为该列的宽度。

vue如何实现el-table列宽自适应

具体实现

怎么计算内容宽度呢?这是个比较关键的步骤。渲染后的每个单元格有个.cell类,用white-space: nowrap; overflow: auto;设置为不允许换行,内容超出后可滚动,同时设置display: inline-block;以便计算实际内容宽度。这样,最终的宽度可通过.cell元素的scrollWidth属性得到。

function adjustColumnWidth(table) {   const colgroup = table.querySelector("colgroup");   const colDefs = [...colgroup.querySelectorAll("col")];   colDefs.forEach((col) => {     const clsName = col.getAttribute("name");     const cells = [       ...table.querySelectorAll(`td.${clsName}`),       ...table.querySelectorAll(`th.${clsName}`),     ];     // 忽略加了"leave-alone"类的列     if (cells[0]?.classList?.contains?.("leave-alone")) {       return;     }     const widthList = cells.map((el) => {       return el.querySelector(".cell")?.scrollWidth || 0;     });     const max = Math.max(...widthList);     const padding = 32;     table.querySelectorAll(`col[name=${clsName}]`).forEach((el) => {       el.setAttribute("width", max + padding);     });   }); }

中间的探索过程比较繁琐,但最终的代码实现却非常简洁。在什么时候触发列宽计算呢?自然是组件渲染完成后。为了方便重用,我采用了 Vue 自定义指令的方式。

Vue.directive("fit-columns", {   update() {},   bind() {},   inserted(el) {     setTimeout(() => {       adjustColumnWidth(el);     }, 300);   },   componentUpdated(el) {     el.classList.add("r-table");     setTimeout(() => {       adjustColumnWidth(el);     }, 300);   },   unbind() {}, });

更进一步,我封装了一个 Vue 插件叫v-fit-columns,已经发布到 npm 仓库,直接安装即可使用。安装:

npm install v-fit-columns --save

引入:

import Vue from 'vue'; import Plugin from 'v-fit-columns'; Vue.use(Plugin);

使用:

        

感谢各位的阅读!关于“vue如何实现el-table列宽自适应”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

推荐阅读: Bootstrap Table列宽拖动的方法 详解C#设置Excel数据自适应行高、列宽的2种情况

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:[email protected]进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

vue eltable 上一篇新闻:MySQL中数据丢失排查的方法 下一篇新闻:python文件目录操作之os模块的示例分析 猜你喜欢 如何编写显示农历的VBS代码 如何实现右键添加打开MS-DOS的批处理 如何使用批处理实现MaxDOS V6系统备份查看器 如何实现防arp欺骗和自动绑定网关的批处理 VBS中怎么把二进制数据转换为字符串 如何实现清除3389远程桌面连接记录的批处理 如何实现记录每次进入3389远程桌面IP的批处理bat 批处理中如何直接执行vbs 如何利用vbs类实现css按钮 如何编写IP地址设置切换批处理


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3