elementUI中el-table表头和内容全部一行显示完整的方法

 更新时间:2023年06月06日 11:44:01   作者:GhostPaints  
最近参与web开发时,让我解决一个elementui控制内容单行显示,下面这篇文章主要给大家介绍了关于elementUI中el-table表头和内容全部一行显示完整的方法,需要的朋友可以参考下

项目上有一个需求,需要用el-table来显示数据,有一个要求就是不能换行。表头不能换行,表格里面的内容也不能换行。

同事写的页面使用的是vue3,自定义了一个事件来动态变化每一列的参数。我将其挪用到vue2中完全没法使用。只能在网上查找资料来实现它。

表格通过接口来获取,接口中将表头标题和表格内容分开来的。

基本思路就是:表格内容限制不换行,不使用缩略符号。

首先从表头开始,在el-table-column中有一个render-header

    // 表头部重新渲染
		renderHeader(h, { column, $index }) {
			// 新建一个 span
			let span = document.createElement('span');
			// 设置表头名称
			span.innerText = column.label;
			// 临时插入 document
			document.body.appendChild(span);
			// 重点:获取 span 最小宽度,设置当前列,注意这里加了 20,字段较多时还是有挤压,且渲染后的 div 内左右 padding 都是 10,所以 +20 。(可能还有边距/边框等值,需要根据实际情况加上)
			column.minWidth = (span.getBoundingClientRect().width) + 40;
            this.headerLableWidth[column.property] = column.minWidth;
			// 移除 document 中临时的 span
			document.body.removeChild(span);
			return h('span', column.label);
		},

column中有这些标题文字信息, 创建一个span标签,添加到文档流中,然后拿到它的宽度,为了多加点宽度,可以额外多加些数值。代码中多加了40宽度。为表头设置最小宽度。

记录这一列的最小宽度,当表格内容动态设置宽度的时候,至少要给定成表头的宽度。不然表头会因为没有内容宽度变成0.

    flexColumnWidth(str, arr1, flag = 'max'){
      // str为该列的字段名(传字符串);tableData为该表格的数据源(传变量);
      // flag为可选值,可不传该参数,传参时可选'max'或'equal',默认为'max'
      // flag为'max'则设置列宽适配该列中最长的内容,flag为'equal'则设置列宽适配该列中第一行内容的长度。
      str = str + ''
      let columnContent = ''
      if (!arr1 || !arr1.length || arr1.length === 0 || arr1 === undefined) {
        return
      }
      if (!str || !str.length || str.length === 0 || str === undefined) {
        return
      }
      if (flag === 'equal') {
        // 获取该列中第一个不为空的数据(内容)
        for (let i = 0; i < arr1.length; i++) {
          if (arr1[i][str].length > 0) {
            // console.log('该列数据[0]:', arr1[0][str])
            columnContent = arr1[i][str]
            break
          }
        }
      } else {
        // 获取该列中最长的数据(内容)
        let index = 0
        for (let i = 0; i < arr1.length; i++) {
          if (arr1[i][str] === null) {
            return
          }
          const now_temp = arr1[i][str] + ''
          const max_temp = arr1[index][str] + ''
          if (now_temp.length > max_temp.length) {
            index = i
          }
        }
        columnContent = arr1[index][str]
      }
      // console.log('该列数据[i]:', columnContent)
      // 以下分配的单位长度可根据实际需求进行调整
      let flexWidth = 0
      for (const char of String(columnContent)) {
        if ((char >= 'A' && char <= 'Z') || (char >= 'a' && char <= 'z')) {
          // 如果是英文字符,为字符分配8个单位宽度
          flexWidth += 10
        } else if (char >= '\u4e00' && char <= '\u9fa5') {
          // 如果是中文字符,为字符分配15个单位宽度
          flexWidth += 18
        } else {
          // 其他种类字符,为字符分配8个单位宽度
          flexWidth += 10
        }
      }
      if (flexWidth < this.headerLableWidth[str]) {
        // 设置最小宽度
        flexWidth = this.headerLableWidth[str]
      }
      // if (flexWidth > 250) {
      //   // 设置最大宽度
      //   flexWidth = 250
      // }
      // console.log(flexWidth)
      return flexWidth + 'px'
    }
  }

el-table-column标签中的width使用函数方法来代替。

完整的el-table如下

        <el-table 
          :ref='tableRef'
          :data="certRecordInfos"
          border
          :fit="true"
          style="width: 100%">
          <el-table-column
            align="center"
            :render-header="renderHeader"
            :width="flexColumnWidth(item.key,certRecordInfos)"
            :key="item.key" 
            :prop="item.key"  
            :label="item.value" >
          </el-table-column>
        </el-table>

因为需要先获取到表头的最小宽度,因此需要先加载表头,才能确保后面加载表格内容的时候,能正确的设置宽度。

在watch中,观察这两个数组,当发现变化的时候,去重新刷新这个table

    certHeaderList: {
      deep: true,
      handler: function (val) {
        this.$nextTick(() => {
          this.$refs[`${this.tableRef}`].doLayout();
        })
      }
    },
    certRecordInfos: {
      deep: true,
      handler: function (val) {
        this.$nextTick(() => {
          this.$refs[this.tableRef].doLayout();
        })
      }
    }
        this.certHeaderList.splice(0)
        this.certRecordInfos.splice(0)
        const resultHeader = val[0].header
        resultHeader.forEach((header)=>{
          let map = {key:header.columnName,value:header.columnDesc};
          this.certHeaderList.push(map);
        });
        setTimeout(() => {
          const resultList = val[0].list
          this.certRecordInfos.push(...resultList)
        }, 1000);

要实现效果,必须要确保已经拿到了表格每一列表头的最小宽度。并使用headerLableWidth记录下来。

另外,需要为表格内容进行设置,确保内容不会进行换行和使用缩略符号。

/deep/ .el-table th, .el-table td {
  white-space: nowrap;
}
/deep/ .el-table .cell {
  display: inline-block;
  white-space: nowrap;
  width: auto;
  overflow: auto;
}
/deep/ .el-table .el-table__body-wrapper {
  overflow-x: auto;
}

总结

到此这篇关于elementUI中el-table表头和内容全部一行显示完整的文章就介绍到这了,更多相关el-table表头和内容一行显示内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue-cli监听组件加载完成的方法

    vue-cli监听组件加载完成的方法

    今天小编就为大家分享一篇vue-cli监听组件加载完成的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • Vue中引入bootstrap.min.css的正确姿势分享

    Vue中引入bootstrap.min.css的正确姿势分享

    这篇文章主要介绍了Vue中引入bootstrap.min.css的正确姿势,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • vue实现把页面导出成word文件的方法

    vue实现把页面导出成word文件的方法

    这篇文章主要为大家详细介绍了vue实现把页面导出成word文件的方法,文中的实现步骤讲解详细,并且有详细的代码示例,需要的小伙伴可以参考一下
    2023-10-10
  • vue项目中form data形式传参方式

    vue项目中form data形式传参方式

    这篇文章主要介绍了vue项目中form data形式传参方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • vue3.x:报错清单及解决记录

    vue3.x:报错清单及解决记录

    这篇文章主要为大家介绍了vue3.x:报错清单及解决记录详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 浅析vue3的setup的使用和原理

    浅析vue3的setup的使用和原理

    setup是Vue3中引入的一个新的组件选项,是Vue3中函数式组件的核心部分,它提供了一种新的方式来编写组件逻辑,下面就来和大家讲讲它的使用和原理
    2023-08-08
  • 如何使用yarn创建vite+vue3&&electron多端运行

    如何使用yarn创建vite+vue3&&electron多端运行

    这篇文章主要介绍了如何使用yarn创建vite+vue3&&electron多端运行,本文分步骤给大家介绍的非常详细,包括使用yarn创建vite+vue3项目会遇到哪些问题,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • vue + element-ui 季度选择器组件 el-quarter-picker示例详解

    vue + element-ui 季度选择器组件 el-quarter-picker示例详解

    本文介绍如何在Vue项目中使用基于Element-UI的季度选择器组件ElQuarterPicker,通过引用并调用ElQuarterPicker.vue组件来实现季度选择功能,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果

    vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果

    这篇文章主要介绍了vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • vue中对象数组去重的实现

    vue中对象数组去重的实现

    这篇文章主要介绍了vue中对象数组去重的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02

最新评论