elementui table列宽自适应,el-table高度自适应

  elementui table列宽自适应,el-table高度自适应

  本文主要介绍vue对el-table列宽适配的完美实现。对vue感兴趣的同学可以参考一下。

  

目录

  背景技术方案具体实施概要

  

背景

  Element UI是PC上比较流行的Vue.js UI框架,其组件库基本可以满足大多数常见的业务需求。但是有时会有一些高度定制化的需求,组件本身可能无法满足。最近在项目里遇到的。

  许多页面需要使用表格组件el-table。如果没有指定el-table-column的宽度,默认情况下,它将平均分布到其余的列。在大量列的情况下,如果el-table的宽度被限制在容器内,则单元格中的内容将换行。如果不强制换行,内容将在单元格内滚动或溢出或被截断。

  产品的预期效果是内容显示在一行中,列间距一致,允许表格水平滚动到容器之外。El-table-column支持设置固定宽度,在内容宽度可预测的情况下,也可以满足这个需求。问题是如何动态调整列宽以适应内容宽度。我在官方文档中也没有找到这样的选项,因为组件本身不支持。

  

技术方案

  为此,提出了一种动态计算内容宽度的方案。网上也有人提到过这个思路,就是根据内容中的字符数来计算宽度。这种方法有几个局限性:

  内容必须是文本。

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

  渲染前需要对数据进行操作,不利于解耦。

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

  具体怎么做?通过查看渲染的DOM元素,发现el-table的表头和内容分别使用了一个原生表格,每列的宽度由colgroup设置。从这里开始,col的name属性的值与相应的td的class值一致,这样就可以遍历相应列中的所有单元格,找到宽度最大的单元格,并使用其内容宽度加上一个边距作为列的宽度。

  

具体实现

  内容宽度怎么算?这是关键的一步。呈现后,每个单元格都有一个. cell类,使用空白:nowrap溢出:自动;设置为不允许换行,内容超过时滚动,设置display:inline-block;以便计算实际内容宽度。这样,就可以通过。细胞元素。

  函数adjustColumnWidth(table) {

  const colgroup=table . query selector( colgroup );

  const colDefs=[.colgroup . queryselectorall( col )];

  colDefs.forEach((col)={

  const cls name=col . get attribute( name );

  常量单元格=[

  .table.querySelectorAll(`td。${clsName} `),

  .table.querySelectorAll(`th。${clsName} `),

  ];

  //忽略添加了“leave-alone”类的列。

  if(单元格[0]?classList?包含?(不要管){

  返回;

  }

  const width list=cells . map((El)={

  返回el.querySelector(。单元格’)?scroll width 0;

  });

  const max=Math.max(.width list);

  const padding=32

  table . query selector all(` col[name=$ { clsName }]`)。forEach((el)={

  el.setAttribute(width ,最大填充);

  });

  });

  }

  中间的探索过程比较复杂,但是最终的代码实现非常简洁。何时触发列宽计算?自然组件渲染完成后。为了便于重用,我采用了Vue自定义指令的方法。

  Vue.directive(fit-columns ,{

  update() {},

  bind() {},

  已插入(el) {

  setTimeout(()={

  adjustColumnWidth(El);

  }, 300);

  },

  componentUpdated(el) {

  El . class list . add( r-table );

  setTimeout(()={

  adjustColumnWidth(El);

  }, 300);

  },

  unbind() {},

  });

  再者,我打包了一个叫v-fit-columns的Vue插件,已经发布到npm仓库,安装后可以直接使用。

  安装:

  npm安装v-fit-列-保存

  简介:

  从“Vue”导入Vue;

  从“v-fit-columns”导入插件;

  Vue.use(插件);

  使用:

  El-表v-适合-列

  El-table-column label= no . type= index class-name= leave-alone /El-table-column

  el-table-column标签=Name 属性=name/el-table-column

  el-table-column标签=年龄属性=年龄/el-table-column

  /el-table

  源代码在这里:https://github.com/kaysonli/v-fit-columns,欢迎您的评论和星级!

  

总结

  这个方案有点黑,只着眼于要求,其他方面可能会有一些瑕疵,比如渲染后会有轻微的闪光(因为宽度会重新调整,会出现回流)。不过从最后的效果来看,还是比较满意的。

  以上就是vue完美实现el-table列宽适配的细节。更多关于vue实现el-table列宽适配的信息,请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: