基于Table标签的展示数据组件。

Table 组件主要特点在于:

  • 组件 data 的解耦,减少重复代码;
  • 良好的扩展性,可以通过自定义列模板来适应不同的业务场景。

1. 实例

代码

<fat-table :data="tableData"><template slot-scope="{ item }"><fat-table-column label="姓名">{{ item.name }}</fat-table-column><fat-table-column label="日期">{{ item.date }}</fat-table-column><fat-table-column label="地址">{{ item.address }}</fat-table-column></template>
</fat-table>
<!-- 自定义列模板 -->
<fat-table :data="tableData"><template slot-scope="{ item }"><fat-table-column label="头像"><fat-hover-tip type="right-center"><template slot="hover-part">{{ item.name }}</template><template slot="tip-part"><img src="/static/img/gakki.jpg" alt="示意图"></template></fat-hover-tip></fat-table-column><fat-table-column label="地址">{{ item.address }}</fat-table-column><fat-table-column label="操作"><fat-button class="btn" type="primary" size="mini" @click="$message({ content: '编辑' })">编辑</fat-button><fat-button class="btn" type="primary" size="mini" @click="$message({ content: '删除' })">删除</fat-button></fat-table-column></template>
</fat-table>
复制代码

实例地址:Table 实例

代码地址:Github UI-Library

2. 原理

Table 组件的基本结构如下

主要可分为两个部分:

  • 表格头(Table-head):包裹在 <thead> 标签内,用于定义了一组定义表格的列头;
  • 表格内容(Table-body):包裹在 <tbody> 标签内,用于定义表格的内容。

首先实现Table-body,再依据其对应 label 来生成Table-head。

Table-body 表格内容

<template><table :class="['table-wrapper', { 'is-stripe': stripe }]"><thead>...</thead><!-- Table-body --><tbody class="table-body-wrapper"><tr v-for="(item, index) in data" :key="index" :data-index="index" class="tr-wrapper"><slot v-bind:item="item"></slot></tr></tbody></table>
</template><script>
export default {props: {data: { type: Array, default: () => [] },align: { type: String, default: "left" },stripe: { type: Boolean, default: false }},provide() {return {fatTable: this};},...
};
</script>
复制代码

组件的 prop 中包含所需数据 data ,利用 v-for="(item, index) in data" 指令生成每一行 tr,再通过 slot-scope 来生成每一项的内容,此时的数据流变为

具体使用时,只需要利用 slot-scope 来传递这个数据即可

<fat-table :data="tableData"><template slot-scope="{ item }"><fat-table-column label="姓名">{{ item.name }}</fat-table-column></template>
</fat-table>
复制代码

这样使得每一个 table-column 都可以被自定义,然后可以拓展成为模板。

Table-head 表格头

由于每个 fat-table-column 都有 label 属性,利用这个 prop 来生成 Table-head,在Table组件中 provide 当前组件用于子组件的访问

provide() {return {fatTable: this};
}
复制代码

同时 fat-table-column 组件的实现

<template><td class="td-wrapper c-size-m"><slot>无</slot></td>
</template>
<script>
export default {props: {label: { type: String, required: true }},inject: ["fatTable"],created() {this.$nextTick(() => {let dom = this.$el.parentNode;let index = null;while (dom.tagName !== "TR") {dom = dom.parentNode;}index = dom.getAttribute("data-index");if (index === "0") {this.fatTable.addLabel(this.label);this.$destroy = () => {this.fatTable.delLabel(this.label);};}});}
};
</script>
复制代码

当组件 create 时,判断是否为第一行,如果是,则调用 this.fatTable.addLabel(this.label) ,通知父组件需要添加当前 labelTable组件的 head 中,同时定义当组件 destroy 时, 删除对应 label

this.$destroy = () => {this.fatTable.delLabel(this.label);
};
复制代码

Table组件中,定义 addLable 以及 delLabel 的处理方法

addLabel(label) {const { labels } = this;const existItem = labels.find(item => item.label === label);// 利用 colspan 来处理合并表头的情况if (existItem) {existItem.colspan += 1;} else {labels.push({label,colspan: 1});}
},
delLabel(label) {this.labels = this.labels.filter(item => item.label !== label);
}
复制代码

3. 结论

利用 Vue 提供的一些插槽属性以及 provideinject 来实现 Table 组件,虽然功能不够强大,但是具备良好地可扩展性,可进一步封装所需组件。

往期文章:

  • 从零实现Vue的组件库(零)- 基本结构以及构建工具
  • 从零实现Vue的组件库(一)- Toast 实现
  • 从零实现Vue的组件库(二)- Slider 实现
  • 从零实现Vue的组件库(三)- Tabs 实现
  • 从零实现Vue的组件库(四)- File-Reader 实现
  • 从零实现Vue的组件库(五)- Breadcrumb 实现
  • 从零实现Vue的组件库(六)- Hover-Tip 实现
  • 从零实现Vue的组件库(七)- Message-Box 实现
  • 从零实现Vue的组件库(八)- Input 实现
  • 从零实现Vue的组件库(九)- InputNumber 实现
  • 从零实现Vue的组件库(十)- Select 实现
  • 从零实现Vue的组件库(十一)- Date-picker 实现
  • 从零实现Vue的组件库(十二)- Table 实现
  • 从零实现Vue的组件库(十三)- Pagination 实现
  • 从零实现Vue的组件库(十四)- RadioGroup 实现
  • 从零实现Vue的组件库(十五)- CheckboxGroup 实现

原创声明: 该文章为原创文章,转载请注明出处。

从零实现Vue的组件库(十二)- Table 实现相关推荐

  1. 从零实现Vue的组件库(十)- Select 实现

    当选项过多时,使用下拉菜单展示并选择内容. Select 组件主要特点在于: 数据双向绑定,下拉列表变动时,选中项如何回显: 单选.多选的区分,以及对应处理. 1. 实例 代码 <fat-sel ...

  2. 从零实现Vue的组件库(零)- 基本结构以及构建工具

    今年三月份入职以来,一直在做后台运营系统,其中重复性工作有很多,其中组件库就是一项.尽管现阶段有很多优秀的开源组件库,但是为了适应产品奇奇怪怪的需求,还是要手动实现一些组件.将其沉淀下来,积累一些自己 ...

  3. 【Vue学习】—Vue UI组件库(二十八)

    [Vue学习]-Vue UI组件库(二十八) 一.移动端常用的UI组件库 二.PC端常用的UI组件库 三.具体使用自行查看文档,这里就不做概述了

  4. 用vue搭建组件库的流程

    目录 一.项目介绍 二.用脚手架生成vue项目 三.修正项目结构 四.跑通一个demo 五.卡片组件的设计与代码编写 六.测试组件的功能 七.前端模块化 八.webpack打包js文件 九.Gulp打 ...

  5. 创建, 发布自己的 Vue UI 组件库

    创建, 发布自己的 Vue UI 组件库 前言 在使用 Vue 进行日常开发时, 我们经常会用到一些开源的 UI 库, 如: Element-UI_, _Vuetify 等. 只需一行命令, 即可方便 ...

  6. 16款优秀的Vue UI组件库推荐

    16款优秀的Vue UI组件库推荐 Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可. 在公司的Web前端项目开发中,多个项目采用 ...

  7. ajax插件库,03.vue-ajax、vue UI 组件库

    vue-ajax vue 项目中常用的 2 个 ajax 库 vue-resource: vue 插件, 非官方库, vue1.x 使用广泛 axios: 通用的 ajax 请求库, 官方推荐, vu ...

  8. vant引入组件报错_强烈推荐优秀的Vue UI组件库

    在我们实际开发中常常因为项目周期短不得不引入一些UI框架来辅助开发 那常见的比较好的UI框架有那些呢(基于VUE) Element UI组件库 (pc端) Element,一套为开发者.设计师和产品经 ...

  9. 17款优秀的Vue UI组件库汇总

    17款优秀的Vue UI组件库推荐 Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可. 在公司的Web前端项目开发中,多个项目采用 ...

最新文章

  1. 道路游戏(洛谷 P1070)
  2. HoughCircles 函数
  3. 魔方机器人需要特制魔方吗_解魔方的机器人攻略18 – 魔方快速算法
  4. ActiveMQ结合Spring收发消息
  5. linux curl 多线程,CURL多线程不执行一直在请求
  6. 刪除github上的一個repository
  7. php 正则匹配unicode,PHP中正则表达式对UNICODE字符码的匹配方法
  8. linux shell 获取参数 $,Linux - Shell - 参数获取
  9. 一般程序句柄多少linux,一个进程能够打开最大文件句柄数设到多大才合适(Linux)...
  10. 如何迁移outlook邮件到另一个硬盘_猎头如何有效的搜寻与筛选简历
  11. linux系统如何切换语言环境变量,Linux系统中如何修改某用户语言环境变量
  12. 第六届蓝桥杯试题c/c++B组5
  13. DC-DC转换器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  14. android引用aar中的字体,android.mk引用aar
  15. 使用Fiona创建Shapefile矢量数据
  16. 消息称苹果最快将于2022年推出折叠屏iPhone
  17. 测试面试题集-性能测试
  18. python374安装教程_Centos7.6安装工具(5)--编译安装python374
  19. 乐信、趣店同源“异路”
  20. Vimeo 开启VR内容付费模式,真的能让消费者主动掏钱包吗?

热门文章

  1. 怎么给PPT文档加密
  2. PDR (Pedestrian Dead Reckoning)行人航位推算基本原理及实现
  3. P4094 [HEOI2016/TJOI2016]字符串 [SA + 主席树]
  4. 生产制造企业用的ERP系统——流程管理
  5. gammatone 滤波器详解及其MATLAB代码实现
  6. QQ邮箱不显示图片解决方案
  7. 如何获客:3招做好触客营销实现高效获
  8. 进程创建-终止-等待-替换
  9. 安装pocoui报错
  10. 查看世界编程语言排行榜