解决ant-design-vue Column添加fixed属性,高度不自动适应的问题

300 阅读1分钟

最近使用antdv时涉及到一个表格可编辑的需求,鼠标点击单元格可输入内容,在左侧设置fixed: 'left'固定位置后,出现了固定列不跟随右侧内容高度改变,导致显示无法对齐的情况,如图:

QQ_1721979099982.png‘ 看了antdv表格结构后,发现左侧固定为单独一个表格层,完整的结构为: QQ_1721978628151.png

所以需要通过js实现右侧输入内容或有变化时,调整左侧高度。实现思路,通过ResizeObserver对象监听右侧表格高度的变化,计算左侧dom,感觉会经常用到,随便记一下,分享一部分代码段:

  // 创建元素监听器
  const resizeObserver = null;
  // 监听表格高度变化,同步修改左侧fixed高度
  function tableHeightObserver() {
    if (typeof ResizeObserver === 'undefined') return;
    resizeObserver = new ResizeObserver((entries) => {
      for (const entry of entries) {
        const { height } = entry.contentRect;
        // 更新fixed表行高
        this.tableHeightUpdate();
      }
    });
    // 监听表格DOM元素(注意使用ant-table-tbody,只监听table会有出现滚动条时无高度变化的问题)
    const element = document.querySelector('#table .ant-table-scroll .ant-table-tbody');
    if (element) {
      resizeObserver.observe(element);
    }
  }
  
  function tableHeightUpdate() {
    const element = document.querySelector('#table');
    if (!element) return;
    const scrollEl = element.querySelector('.ant-table-scroll > .ant-table-body');
    const leftFixedEl = element.querySelector('.ant-table-fixed-left .ant-table-tbody');
    // 遍历scroll表的高度,赋值左侧
    scrollEl.querySelectorAll('tr').forEach((item, index) => {
      leftFixedEl.querySelectorAll('tr')[index].style.height = `${item.offsetHeight}px`;
    });
  }
  

注意:离开组件或页面需结束监听,使用disconnect方法 resizeObserver.disconnect();

修复后: QQ_1721979186474.png