表格-二次封装

67 阅读3分钟

使用Ts来动态配置表格

  • 为什么
  1. 通过json对象的形式传递给table标签去循环遍历,就不用写每一列的标签了,代码简洁
  2. 在ts对象配置了某个属性时,在json对象添加时会有提示,方便开发

插槽来实现编辑单元格

表头拖拽

跨页选中、全选

  • 全选:比较简单,拿到所有的数据进行遍历(data.map),使用toggleRowSelection给每一项设置true就为选中,反之不选,清空所有选中clearSelection
  • 跨页选中:table必须设置row-key,值为数据的唯一标识,然后触发selectionChange(rows),rows为选中的数据

动态合并表头单元格、列:

  • 动态合并表头:使用el-table的header-cell-style属性可以获取每一列、行的信息,以此来动态的隐藏前几列,只留下一列表头
  • 合并列(左右)单元格:通过span-methods属性,同样能获取行列信息,合并单元格和表头的逻辑差不多,都是通过隐藏前几个,最后的单元格通过colspan、rowspan来设置单元格占几行几列(不管是上下、还是左右相邻单元格)
  • =====》遇到的bug:表头拖拽是根据表头的顺序来进行逻辑互换,但是相邻(左右)单元格的合并是动态的去删除某一个单元格,这时拖拽就会出现表格错乱的问题

树形行数据懒加载:

  • 因为数据量比较多,所以使用点击行展示更多的二三级数据,而不是一次性展示全部

  • 实现:

(重点就是hasChildren在数据中设置就代表有子级数据,然后通过load事件来动态的给子级赋值)

image.png

  • ===》遇到的问题:(1)对table数据进行增上改查操作之后,表单视图不刷新,实际数据已经更新

原因:改成懒加载,加载数据很快,但是展开的子菜单数据已被缓存,再次点击就不会重新请求后端

解决思路:====》刚开始想着数据增删改之后,重新对页面进行刷新,但是这样用户体验很不好,重新查看的话还需要用户手动的一层一层点击展开,去找到想看的数据,非常麻烦 ====》所以想着刷新当前修改节点即可,element的文档提供的10几个api都没有提供可以更新节点的方法,在百度查询到 ,可以拿到table的实例(ref)之后,调用 tableRef.value.store.states.lazyTreeNodeMap.value,这个api代表表格的懒加载数据都存放在这,可以对它进行修改,页面就会刷新

  • ===》遇到的问题:(2)筛选按钮联动用户体验不好,有二级数据的,选中时,子级数据的筛选框不选中

原因:elementplus的bug

解决思路:====》首先想通过拿到checkbox实例,看看能不能调用实例里面自带的属性方法来实现勾选,但是没有提供 ====》后来想换ui组件,因为其他网站ui这个树形选中没问题,被领导驳回,而且ui的样式风格也有差异,用户体验不好 ====》只能重写表格的选中逻辑,自带的去掉,重新写完组件插入到第一列

连带的问题: 重写选中框的逻辑之后,导致之前的跨页选中、全选出现了bug