这篇文章给大家分享的是有关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的类值是一致的,这样就可以遍历对应列的所有单元格,找出宽度最大的单元格,用它的内容宽度加上一个边距作为该列的宽度。
具体实现
怎么计算内容宽度呢?这是个比较关键的步骤。渲染后的每个单元格有个。细胞类,用空白: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列宽自适应