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

  介绍

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

vue是什么

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

背景

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

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

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

技术方案

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

<李>

内容必须是文本

<李>

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

<李>

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

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

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

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

具体实现

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

function  adjustColumnWidth(表),{   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 (细胞[0].classList ? .contains ?。(“leave-alone")), {   ,,,,,返回;   ,,,}   ,,,const  widthList =, cells.map ((el),=祝辞,{   ,,,,,return  el.querySelector (“.cell") ? .scrollWidth  | |, 0;   ,,,});   ,,,const  max =, Math.max (…widthList);   ,,,const  padding =, 32;   ,,,table.querySelectorAll(“坳[name=$ {clsName}] ') .forEach ((el),=祝辞,{   ,,,,,el.setAttribute (“width",, max  +,填充);   ,,,});   ,,});   }

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

Vue.directive (“fit-columns",, {   更新才能(),{},   bind(),才能{},   插入才能(el), {   ,,,setTimeout((),=祝辞,{   ,,,,,adjustColumnWidth (el);   ,,,},,300);   ,,},   componentUpdated才能(el), {   ,,,el.classList.add (“r-table");   ,,,setTimeout((),=祝辞,{   ,,,,,adjustColumnWidth (el);   ,,,},,300);   ,,},   解开才能(),{},   });

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

npm  install  v-fit-columns ——保存

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