el-table操作列动态自适应设置(根据操作项个数动态设置宽度)

一、目的

  • 目的:表格操作列宽度,根据操作项多少,自动调节宽度
  • 背景:用el-table组件开发时,对于表格的操作列的自适应宽度是一个问题,如果不设置,操作按钮多时会有换行问题。如果设置最小宽度或宽度时,又会出现当条件不满足时,按钮显示的少,但操作列的宽度太宽,显示多余的空白。尤其对于字段较多,操作列固定情况下,现得特别浪费空间。

二、重发的原因

之前写过一个vue2版本的,但我看评论大家都说不起作用。

  • 原因:操作列宽度设置后,没有刷新el-table的布局,所以导致无法响应。
  • 自带方法doLayout:理论上这个方法是可以的,但可能是我本人操作的问题,试了一下并没有生效。
  • 使用Key触发:在el-table上增加了:key="Math.random()"属性,让数据变化时重新刷新表格,测试有效

三、示例效果如下

四、示例代码

1、演示代码说明

  • el-table版本:Element Plus Table
  • vue版本:Vue3.3.4(vue3.2+)

2、代码

js 复制代码
<template>
  <el-radio-group v-model="type">
    <el-radio :label="0">2列</el-radio>
    <el-radio :label="1">3列</el-radio>
    <el-radio :label="2">4列</el-radio>
  </el-radio-group>

  <el-table ref="eltable" :data="tableData" border style="width: 100%" :key="Math.random()">
    <el-table-column type="index" width="50" label="No" fixed> </el-table-column>
    <el-table-column prop="date" label="日期" width="150" fixed> </el-table-column>
    <el-table-column prop="name" label="姓名" width="120"> </el-table-column>
    <el-table-column prop="province" label="省份" width="120"> </el-table-column>
    <el-table-column prop="address" label="地址" minWidth="260"> </el-table-column>
    <el-table-column prop="zip" label="邮编" minWidth="120"> </el-table-column>

    <el-table-column label="操作" fixed="right" :render-header="renderHeader">
      <template #default="scope">
        <div class="optionDiv" style="white-space: nowrap; display: inline-block">
          <el-button type="primary" size="small"> 新增 </el-button>
          <el-button type="primary" size="small"> 编辑 </el-button>
          <el-button v-if="scope.row.type == type" type="primary" size="small"> 移除 </el-button>
          <el-button v-if="scope.row.type == type && type == 2" type="primary" size="small">
            详情
          </el-button>
        </div>
      </template>
    </el-table-column>
  </el-table>
</template>

<script lang="ts" setup>
import { ref } from 'vue'
const type = ref(0)

const tableData = [
  {
    date: '2016-05-03',
    name: '王小虎',
    province: '上海',
    address: '上海市普陀区金沙江路 1518 弄',
    zip: 200333,
    type: 1
  },
  {
    date: '2016-05-02',
    name: '王小虎',
    province: '上海',
    address: '上海市普陀区金沙江路 1518 弄',
    zip: 200333,
    type: 2
  },
  {
    date: '2016-05-02',
    name: '王小虎',
    province: '上海',
    address: '上海市普陀区金沙江路 1518 弄',
    zip: 200333,
    type: 2
  }
]

// 表头部重新渲染
function renderHeader({ column }) {
  // 获取操作按钮组的元素
  const opts = document.getElementsByClassName('optionDiv')
  let widthArr: any = []
  // 取操作组的最大宽度
  Array.prototype.forEach.call(opts, function (item) {
    if (item.innerText) {
      widthArr.push(item.offsetWidth)
    }
  })
  // 重新设置列标题及宽度属性
  if (widthArr.length > 0) {
    column.width = Math.max(...widthArr) + 30
    return column.label
  } else {
    column.width = 0
    return column.label
  }
}
</script>
相关推荐
Java后端的Ai之路1 小时前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁
程序员大阳4 小时前
副队长JavaScript教程(50)-DOM:网页开发的起点
javascript·dom·es·节点·概念·document·关系
香芋芋圆8 小时前
iD-editor 详解|OSM官方在线编辑器,基于D3.js的轻量地图编辑器
开发语言·javascript·编辑器
晗夜未央10 小时前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript
jktantan11 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
我命由我1234511 小时前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
程序员大阳12 小时前
副队长JavaScript教程(65)-详解JSON:轻量级数据交换格式
javascript·json·序列化·反序列化·stringify·parse
小大宇13 小时前
Vue知识点-ElementPlus-06 单选+多选+下拉+日期选择
前端·vue.js·elementui
paopaokaka_luck14 小时前
基于springboot+vue的益暖微光公益服务平台(DeepSeek公益助手、善款信息追溯、志愿服务积分闭环、ECharts运营分析、活动状态自动流转)
java·前端·javascript·spring boot·mysql·架构·echarts
栀椩14 小时前
Electron 内嵌页面跨域问题(CORS/PNA)解决全记录
前端·javascript·electron