【vue+el-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怎么办, 那就只能在按钮中再加一个自定义的类名了,获取按钮最大数量就用自定义的类名.

方法封装全局使用

1, 新建formatBtnWidth.js

// 格式化操作栏按钮宽度
export function formatBtnWidth() {
  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
}

2, 挂载到main.js

import { formatBtnWidth } from '@/util/formatBtnWidth'
Vue.prototype.$formatBtnWidth = formatBtnWidth

3,页面内使用

methods: {
	// 查询表格数据
	search(xxx,xxx){
		....
		xxx().then(res=>{
			//this.tableData = res.data // 表格赋值
			this.$nextTick(() => {
               this.formatBtnWidth = this.$formatBtnWidth()
            })
		})
	}
}

测试demo

测试demo已上传,点击前往下载

暂未解决的问题

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

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

### 回答1: Vue是一种流行的JavaScript框架,而el-tableVue框架中的一个组件,它可以方便地创建表格,并支持各种功能和事件。如果想要用Vueel-table制作岗位排班表,可以按照以下步骤进行操作。 首先,需要在Vue项目中引入element-ui库,它是一个基于Vue的组件库,包含了el-table组件以及许多其他强大的组件。 然后,可以开始构建岗位排班表的界面。可以使用el-table组件创建一个表格,并定义表格和数据。根据岗位排班的需求,可以根据不同的班次和日期来定义表格的行和。可以使用el-table-column组件定义每一的标题、属性和渲染方式。 接下来,需要从后端获取岗位排班表的数据。可以使用Vue的生命周期钩子函数,在组件创建的时候调用后端的API接口获取数据,并将数据存储在组件的data属性中。 然后,将获取到的数据绑定到el-table组件的data属性上,这样就可以动态地渲染岗位排班表的内容。 此外,还可以添加一些其他的功能,例如增删改查,可以使用element-ui提供的组件和方法来实现。也可以使用el-table的事件来监听用户的操作,例如用户对表格进行了排序或筛选等。 最后,可以对表格进行样式的美化,可以使用element-ui提供的样式类或自定义样式来装饰表格。 总结来说,使用Vueel-table组件可以方便地制作岗位排班表。通过定义表格和数据,绑定后端获取到的数据,以及添加其他的功能和样式,我们可以创建一个功能强大且美观的岗位排班表。 ### 回答2: 要使用Vueel-table组件制作岗位排班表,首先需要安装Vueelement-ui,并在项目中引入相关的组件和样式。 接下来,在Vue的模板中创建一个el-table组件,并设置表格和数据源。每一代表一个岗位,每一行代表一个时间段。可以使用一个二维数组来存储岗位排班信息,数组的每一行表示一个时间段,数组的每一表示一个岗位,数组元素表示该时间段该岗位的排班情况。 在el-table中,可以使用slot来自定义每个单元格的内容,根据数组中的元素将单元格渲染为不同的状态,例如上班、休息、请假等。 可以使用computed属性来计算岗位排班表的数据,将二维数组转换为el-table组件可以接受的格式,并绑定到el-table的data属性上。 在el-table的其他配置中,可以设置分页、排序、过滤等功能,以便在排班表数据量较大时进行操作和查找。 除了el-table组件,还可以使用其他element-ui的组件来给排班表添加更多的功能,例如日期选择器来选择排班时间范围、表单输入框来添加排班信息等。 最后,通过样式调整,可以美化岗位排班表的外观,使其更加直观和易于使用。 总结:使用Vueel-table组件可以方便地制作岗位排班表。需要先安装Vueelement-ui,然后创建el-table组件并设置表格和数据源。通过自定义单元格的内容和设置其他功能和样式,可以实现一个功能齐全且美观的岗位排班表。 ### 回答3: Vueel-table组件是一个非常强大的表格工具,可以帮助我们实现各种复杂的数据展示和处理需求,包括制作岗位排班表。 首先,我们需要准备好岗位排班表所需的数据。可以考虑使用一个二维数组来表示表格数据,每一行代表一个岗位,每一代表一个日期。另外,可以再添加一行用于显示日期标签,一用于显示岗位标签。这样,二维数组的第一行和第一就是标签行和标签,剩下的部分就是我们需要填充的岗位排班表数据。 接下来,我们可以在Vue的组件中使用el-table组件来展示和处理岗位排班表数据。首先,创建一个包含el-table组件的父组件,设置好表格的基本样式和配置参数,如行高、宽、边框等。然后,在表格的slot中添加具体的表格内容。在这个示例中,我们可以使用v-for指令来循环渲染表格的每一行和每一。同时,可以使用v-model指令来双向绑定表格中的数据,这样可以方便地对表格数据进行增删改查。 在填充表格数据时,可以通过计算属性来获取实际需要展示的岗位排班表数据。这个计算属性可以根据具体的排班规则和数据来源来计算得到。例如,可以根据员工信息和排班规则,计算每个岗位在每天的排班情况,然后将这些数据填充到岗位排班表中对应的位置。 最后,我们可以在表格中添加一些交互功能以增强用户体验。例如,可以添加一个事件监听函数,来处理用户对表格内容的操作,如添加、删除、修改岗位排班表的数据。同时,可以设置表格的样式和样式类,以便根据不同的数据类型和状态来显示不同的样式,提供更直观的数据展示效果。 总之,使用Vueel-table组件,我们可以很方便地制作出一个功能齐全、交互友好的岗位排班表。通过灵活运用Vue框架的各种特性和功能,我们可以实现对表格数据的快速绑定和处理,提高开发效率,满足不同的业务需求。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨同学*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值