vue3 封装仿antd-vue的Table组件基本实现

最近需要在不使用UI框架的情况下封装一个简单的表格,由于对antd-vue比较熟悉,所以仿照了antd-vue的样子写了个简化版的Table组件。

组件源码见另一篇博客

用到的技术栈:VUE3、SCSS

用过antd-vue的都应该知道table组件主要的传参是两个:columns和dataSource,分别对应表头信息和表格的数据信息。

1.表头数据columns

表头的传参数据结构如下:

[
{ label: '姓名', key: 'name' }, { label: '年龄', key: 'age' }
]
  • key:必须,用来标志当前行
  • label:非必须,当前列的列头显示内容

子组件-表头的遍历:

 这部分代码基本都能看懂,简单的v-for遍历。

2.表格数据dataSource

表格数据传参的数据结构如下:

[
  {name: '张三', age: 24},
  {name: '李四', age: 45}   
]

可以看到dataSource里面的key都是columns里面的key字段对应的值

对应源代码如下:

 主要思路是先遍历每一行的数据,再在每一行的数据中根据columns遍历当前列的数据

做到这里不加66行的代码的话,整个表格显示功能就已经实现了。

但是如果当前行有操作(编辑/删除)的话,就需要使用插槽来实现了。

 3.当前行的操作功能

其实整个功能做起来比较简单,现在回想起来,还是自己对vue3的slot使用不太熟悉。

slot的基本使用见官网

这里能实现这个功能主要看的是作用域插槽的部分

代码还是看上面那张图的65、66两行。

但是columns的传参需要有变化:

[
  { label: '姓名', key: 'name' },
  { label: '年龄', key: 'age' },
  { label: '操作', key: 'operate', slots: 'operate'}   
]

 slots参数表示当前列需要使用插槽

父组件使用table组件:

<template #operate="record">
     <a @click="handleOperate(record.rowData)">详情</a>
</template>

注意:

  • #operate是v-slot的简化写法
  • record是子组件内的slot插槽传过来的参数
  • rowData与Table组件的:rowData对应,即当前tr的内容

接下来贴上使用代码:

 可以看到使用基本和antd-vue差别不大了

4.其他功能

目前已经实现了表头固定table可滚动、宽度等基本功能、如果需要添加其他功能的话可以在此基础上添加各种传参即可

原文地址:https://www.cnblogs.com/codexlx/p/15476277.html