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

摘要:
最近,我们需要在不使用UI框架的情况下封装一个简单的表。因为我们熟悉antd-vue,所以我们以antd-vu的形式编写了一个表组件的简化版本。有关组件的源代码,请参阅另一篇博客。使用过antd-vue的技术堆栈:VUE3和SCSS应该知道表组件的主要参数是两个:列和dataSource,它们分别对应于头信息和表数据信息。

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

组件源码见另一篇博客

用到的技术栈:VUE3、SCSS

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

1.表头数据columns

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

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

子组件-表头的遍历:

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

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

2.表格数据dataSource

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

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

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

对应源代码如下:

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

 主要思路是先遍历每一行的数据,再在每一行的数据中根据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的内容

接下来贴上使用代码:

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

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

4.其他功能

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

免责声明:文章转载自《vue3 封装仿antd-vue的Table组件基本实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Halcon 学习笔记--颜色识别(7)DevExpress源码编译总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Element-ui el-date-picker 时间范围只能选择1天

<template> <div class="container"> <div class="searchMar"> <el-input class="handleInput" v-model="query.stnm" placeholder="站名" @input="handleInp...

html5中不再支持table的cellspacing和cellpadding属性

如果你现在开始用html5的声明来写页面时,你会发现在定义table的cellspacing和cellpadding时被提示该属性已过时或者提示非法属性。具体原因是在html5中table标签的这两个属性已经被移除,需要定义边框之类的时应该使用css的写法。 具体实现如下: <!DOCTYPE html> <html xmlns="htt...

table 隐藏某一个td时,显示错乱问题

1、当表格为多列的情况下,属性为”display:block”行的内容宽度仅与第一列宽度相同,也就是说无论你使colspan的属性值为多少,剩余列的空间都不进行解析。2、同一行反复的在”display:none;”与”display:block;”两个状态间切换时,表格的底部会持续的产生多余的空白空间以至于造成页面布局的扭曲。 解决方法:1、用displa...

ngx_lua 随笔

--[[ test--]]ngx.header.content_type = "text/plain"; --输出头部local user = ngx.var.arg_user -- 定义user变量并获取url中的参数 http://localhost?user=hellolocal sys = ngx.var.server_name -- 获取ngi...

elementUI的table表头与内容错位的解决方案

elementUI的table表头与内容错位的解决方案,只需要在app.vue中添加一行样式就可以解决了 body .el-table th.gutter{display:table-cell!important; } 希望本篇文章可以帮助到你!...

HTML标签CSS默认值研究

   最近写css的时候,发现在div元素里面添加ul元素后发现,ul列表在div里面距离最上方总是有一段空行,当时很奇怪,以为是哪个css出了问题,就把css去掉了,发现问题依旧,然后就查了一下发现html标签在不同浏览器里面是有默认的css样式的,要去掉默认样式,在样式表里添加 *{margin:0;padding:0;}即可,同时找到一个很有用的文档...