首页 > 其他分享 >【vue+el-table】表格操作列宽度跟随按钮个数自适应, 方法封装全局使用

【vue+el-table】表格操作列宽度跟随按钮个数自适应, 方法封装全局使用

时间:2024-09-10 08:55:17浏览次数:3  
标签:el vue btnCount btnDom width 宽度 按钮 table

在这里插入图片描述
效果图
在这里插入图片描述
权限a用户所看到的页面
权限b用户所看到的页面
权限c用户所看到的页面
以上图片分别代表不同用户权限下所能看到的按钮个数, 操作列宽度也会自适应宽度, 就不会一直处于最大宽度, 导致其他权限用户看到的页面出现大量留白问题.

目录

解决方法

1, 获取操作栏按钮容器, 拿到所有按钮的list
2, 遍历按钮, 获取某条数据中按钮list最大宽度
3, 返回所有按钮宽度+间隙宽度

...
 <el-table-column label="操作" :width="formatBtnWidth">
    //<template slot-scope="{ row }">
       <div class="btnList">
           //<el-button @click="openDialog(1, row)" type="primary" size="small" icon="el-icon-edit-outline">编 辑</el-button>
           //<el-button....
           .....
       </div>
    // </template>
 </el-table-column>
...
data(){
  return{
     formatBtnWidth: 120, // 也可以填0, 120是默认一个按钮的宽度
  }
}
....
methods: {
	// 查询表格数据
	search(xxx,xxx){
		....
		xxx().then(res=>{
			//this.tableData = res.data // 表格赋值
			this.$nextTick(() => {
               this.formatBtnWidth = this.getFormatBtnWidth()
            })
		})
	}
	// 自适应计算操作栏宽度
	getFormatBtnWidth(){
		 let width = 120 // 默认宽度
 		 let paddingSpacing = 5 // 默认边距
  		 let btnCount = 0 // 按钮数量
	     let btnDom = document.getElementsByClassName('btnList') // 获取操作栏按钮容器
	     if (btnDom.length) {
		    // [...btnDom]转数组
		    var btnDomArray = [...btnDom]
		    btnDomArray.forEach((v) => {
		      // 最大宽度
		      if (width < v.offsetWidth) width = v.offsetWidth
		      // 最大按钮数量
		      const buttons = v.getElementsByClassName('el-button--small').length
		      if (btnCount < buttons) btnCount = buttons
		    })
		    // 如果按钮数量大于2,宽度要加上边距
		    if (btnCount > 1) {
		      width += paddingSpacing * btnCount * 2 + 1
		    }
	   	}
	    return width
	}
}
...

.btnList {
  white-space: nowrap;
  display: inline-block;
}

解决过程中可能出现的问题

width赋值时为什么不放update()中

我感觉放表格赋值之后也可以, 因为如果你放update()里面调用, 无聊你在页面操作什么, 比如点击一下模态框之类的和表格无关的事情, 这个方法都会被执行, 感觉有点浪费, 所以放在了赋值之后, 当然, 这都是我的个人猜想.

btnDom为什么不能直接调用forEach

可以自己试一下, 调了会报错
打印btnDom出来看看
在这里插入图片描述
可以看到他是HTMLCollection格式的数组, 不清楚这是什么格式的, 百度一下看看, 解释如下:
在这里插入图片描述

解决方法如下:

第一种, 不转数组,不用forEach, 直接改为用for循环
for (let i = 0; i < btnDom.length; i++) {}

第二种, 使用es6方法转成数组后再使用forEach, 三种任选其一都可以
var btnDomArray = Array.prototype.slice.call(btnDom)
var btnDomArray = Array.from(btnDom)
var btnDomArray = [...btnDom]

为什么width += paddingSpacing * btnCount * 2 + 1最后要加1

加1是为了部分情况下, 按钮宽度计算不准确导致操作栏出现省略号…的问题. 看如下情况:
在这里插入图片描述
①是鼠标移到按钮容器中可以看到显示的宽度是193.34px
②是控制台打印的按钮容器宽度是193px, 与①相差了一点点, 但就是这一点点像素导致操作栏总宽度超出设定的宽度,从而出现③省略号…的问题
所以在width += paddingSpacing * btnCount * 2 + 1 多加1px,就不会出现省略号了.可能有更好的方法 ,但我目前只能想到这种方法.

获取按钮最大数量为什么是找类名为’el-button–small’而不是’el-button’

因为类名为el-button的按钮会夹杂其他的按钮,比如下图:
操作栏的删除按钮中还有一个模态框, 里面有两个按钮, 如果用el-button,会把这里面的按钮也算作操作栏按钮中, 实际上是不需要计算的
在这里插入图片描述
因为外层的三个按钮都有el-buttn-small类名,而且小弹窗中的按钮没有这个类名, 所以就可以 以el-buttn-small来区分是否为操作栏的按钮了
如果小弹窗中的按钮也有el-buttn-small怎么办, 那就只能在按钮中再加一个自定义的类名了,获取按钮最大数量就用自定义的类名.

方法封装全局使用

暂未解决的问题

首次进入页面, 表格会抖动一下

这就formatBtnWidth的初始值问题了,
默认填一个按钮的宽度(120px), 如果表格恰好是一个按钮, 就不会抖动,
如果表格是多个按钮,就会抖动一下
如果默认填0, 无论几个按钮都会抖动
所以我就不知道该怎么搞了, 有知道的大佬可以发表一下意见, 不过我感觉这也不算什么大问题哈.

标签:el,vue,btnCount,btnDom,width,宽度,按钮,table
From: https://blog.csdn.net/m0_52539553/article/details/141929160

相关文章

  • 【开源dcluster】Seatunnel数据同步之MySQL同步到doris
    源码Gitee地址:https://gitee.com/zhenglv123456/dcluster在线文档:https://47.121.127.33:8090/在线体验:http://36.155.14.171:12345/dolphinscheduler/ui/login账号密码:test/test123 创建同步任务操作步骤:1.点击创建任务 2.配置同步脚本 3.设置同步时间......
  • 中文关键字检索分析-导出到csv或者excel-多文件或文件夹-使用python和asyncio和pandas
    1.02版本把原来的tab一个个拼接成文件输出,改成pandas的dataframe使用asyncio库来使用协程,但是测试下来速度好像是差不多的。可能速度太快了,没能很好的测出来差异。原来的最初的代码是java版本的,现在用python重写一遍java版本使用completableFuture来异步IO,主要是文件输......
  • 216基于Springboot + vue实现的校园管理系统(含论文+答辩PPT)
    作者主页:夜未央5788 简介:Java领域优质创作者、Java项目、学习资料、技术互助文末获取源码项目介绍基于Springboot+vue实现的校园管理系统(含论文+答辩PPT)本系统包含管理员、用户、院校管理员三个角色。管理员角色:用户管理、院校管理、单位类别管理、院校管理员管......
  • 前端登录注册页面springboot+vue2全开发!
    需求目标:有“登录界面”和“注册界面”以及“功能操作界面”:我们打开程序会自动进入“登录界面”,如果密码输入正确则直接进入“功能操作界面”,在“登录界面”我们可以点击注册进入“注册页面”,注册好了可以再跳回到“登录界面”进行登录。代码实现:(1)登录操作后端开发见我博......
  • VUE: vscode中vue代码ctrl+左键点击不跳转
    引用依赖,js等代码ctrl+左键点击不跳转主要说法是@解析不到的问题,导致找不到安装插件Vetur和Vue-Official工程跟路径下添加jsconfig.json{//ThisfileisrequiredforVSCodetounderstandwebpackaliases"compilerOptions":{//Thismustbespecifiedi......
  • 使用 Parallel 类进行多线程编码(下)
    2.Parallel.ForEach()的使用 从ForEach()这个名字可以看出该方法是用来遍历泛型集合的,新建一个ASP.NETCore Web应用的项目,如下:         在Index.cshtml.cs文件中增加一个UserInfo.cs的类,代码如下:publicclassUserInfo{publicint......
  • [开题报告]flask框架基于Vue的电商管理系统(python+程序+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,电子商务已成为全球经济的重要组成部分,极大地改变了人们的消费习惯和商业运营模式。电商平台的兴起,不仅为消费者......
  • IIS:部署VUE前后端分离,重写URL
    启用IIS路由和ULR重写功能  详细过程:“IIS:URLrewrite转发请求-le.li-博客园(cnblogs.com)”配置URL重写后,与网站同级别路径有个web.config <?xmlversion="1.0"encoding="UTF-8"?><configuration><system.webServer><rewrite>......
  • Linux:多路转接 select、poll、epoll
    1:select#include<sys/select.h>intselect(intnfds,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout);   select函数是POSIX标准定义的一个系统调用,用于监视多个文件描述符(filedescriptors),以确定它们是否具有可读、可写或异常......
  • vue3生命周期(钩子函数)
    在Vue3中,生命周期钩子被重命名并分为了不同的阶段,以更好地描述它们的用途。这些新的生命周期钩子包括:setup():这是一个新的入口点,在beforeCreate和created之前调用。onBeforeMount/onMounted:组件挂载前/后的生命周期钩子。onBeforeUpdate/onUpdated:组件更新前/后的生命......