|
|
@@ -0,0 +1,81 @@
|
|
|
+
|
|
|
+class AutoTable{
|
|
|
+ constructor(){
|
|
|
+ this.timerHandle = null; //计时器手柄
|
|
|
+ }
|
|
|
+ // 开始重新计算表格宽度
|
|
|
+ start(el, binding){
|
|
|
+ // 如果值为false, 则不进行计算处理
|
|
|
+ if(!binding.value.table) return;
|
|
|
+ const headerDOM = el.querySelector('.el-table__header-wrapper'), // 头部DOM
|
|
|
+ bodyDOM = el.querySelector('.el-table__body-wrapper'); // 内容DOM
|
|
|
+ // 先清除旧计时器
|
|
|
+ // 开始计时
|
|
|
+ this.timerHandle = setInterval(() => {
|
|
|
+ const tds = bodyDOM.querySelectorAll('table tbody tr'), // 获取内容行数
|
|
|
+ ths = headerDOM.querySelectorAll('table thead th .cell'), // 获取头部列元素
|
|
|
+ emptyDOM = el.querySelector('.el-table__empty-text'); // 获取空DOM节点
|
|
|
+ // 如果满足条件,结束计时器
|
|
|
+ if(null != emptyDOM || ths.length>0) {
|
|
|
+ clearInterval(this.timerHandle);
|
|
|
+ }
|
|
|
+ if(tds.length == 0 && ths.length == 0) return;
|
|
|
+
|
|
|
+ // 定义变量 存储每列的宽度数据
|
|
|
+ const widths = [];
|
|
|
+ // 获取标题中的单元格宽度
|
|
|
+ ths.forEach((item, i) => widths[i] = [item.offsetWidth+20]);
|
|
|
+
|
|
|
+ // const realWidth = widths.reduce((total, value) => total + value, 0) + (widths.length * 10);
|
|
|
+ // 修改表格宽度
|
|
|
+ // if(realWidth>0) el.style.width = realWidth + 'px';
|
|
|
+ // 获取colgroup
|
|
|
+ const headerColGroup = headerDOM.querySelectorAll('colgroup col'),
|
|
|
+ bodyColGroup = bodyDOM.querySelectorAll('colgroup col');
|
|
|
+ // 修改每列宽度
|
|
|
+ widths.forEach((val, i) => {
|
|
|
+ //排除序号列
|
|
|
+ if (i == 0) {
|
|
|
+ headerColGroup[i].style.width = val + 'px';
|
|
|
+ bodyColGroup[i].style.width = val + 'px';
|
|
|
+ } else {
|
|
|
+ headerColGroup[i].style.width = (binding.value.layout[i-1].width === 0 ? val < 150 ? 150 : val : binding.value.layout[i-1].width) + 'px';
|
|
|
+ bodyColGroup[i].style.width = (binding.value.layout[i-1].width === 0 ? val < 150 ? 150 : val : binding.value.layout[i-1].width) + 'px';
|
|
|
+
|
|
|
+ headerColGroup[i].setAttribute('width',binding.value.layout[i-1].width === 0 ? val < 150 ? 150 : val : binding.value.layout[i-1].width)
|
|
|
+ bodyColGroup[i].setAttribute('width',binding.value.layout[i-1].width === 0 ? val < 150 ? 150 : val : binding.value.layout[i-1].width)
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ binding.value.table.doLayout()
|
|
|
+ clearInterval(this.timerHandle);
|
|
|
+ });
|
|
|
+ }
|
|
|
+}
|
|
|
+// binding.value.layout[i-1].width === 0 ? val < 150 ? 150 : val : binding.value.layout[i-1].width
|
|
|
+ export default {
|
|
|
+ install (Vue) {
|
|
|
+ /* table懒加载 */
|
|
|
+ Vue.directive('tableLoad',{
|
|
|
+ bind (el,binding) {
|
|
|
+ let tableWarp = el.querySelector('.el-table__body-wrapper')
|
|
|
+ function handleFun (e) {
|
|
|
+ if (tableWarp.scrollTop + tableWarp.clientHeight >= tableWarp.scrollHeight) {
|
|
|
+ binding.value()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ tableWarp.addEventListener('scroll',handleFun)
|
|
|
+ el.tableWarp = tableWarp
|
|
|
+ el.handleFun = handleFun
|
|
|
+ },
|
|
|
+ unbind (el,binding) {
|
|
|
+ /* 解绑 */
|
|
|
+ el.tableWarp.removeEventListener('scroll',el.handleFun)
|
|
|
+ }
|
|
|
+ }),
|
|
|
+ Vue.directive('autoColWidth',{
|
|
|
+ componentUpdated: (el, binding) => new AutoTable().start(el, binding)
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|