从零实现Vue的组件库(十二)- Table 实现
基于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)
,通知父组件需要添加当前 label
到Table组件的 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 提供的一些插槽属性以及 provide
、 inject
来实现 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 实现相关推荐
- 从零实现Vue的组件库(十)- Select 实现
当选项过多时,使用下拉菜单展示并选择内容. Select 组件主要特点在于: 数据双向绑定,下拉列表变动时,选中项如何回显: 单选.多选的区分,以及对应处理. 1. 实例 代码 <fat-sel ...
- 从零实现Vue的组件库(零)- 基本结构以及构建工具
今年三月份入职以来,一直在做后台运营系统,其中重复性工作有很多,其中组件库就是一项.尽管现阶段有很多优秀的开源组件库,但是为了适应产品奇奇怪怪的需求,还是要手动实现一些组件.将其沉淀下来,积累一些自己 ...
- 【Vue学习】—Vue UI组件库(二十八)
[Vue学习]-Vue UI组件库(二十八) 一.移动端常用的UI组件库 二.PC端常用的UI组件库 三.具体使用自行查看文档,这里就不做概述了
- 用vue搭建组件库的流程
目录 一.项目介绍 二.用脚手架生成vue项目 三.修正项目结构 四.跑通一个demo 五.卡片组件的设计与代码编写 六.测试组件的功能 七.前端模块化 八.webpack打包js文件 九.Gulp打 ...
- 创建, 发布自己的 Vue UI 组件库
创建, 发布自己的 Vue UI 组件库 前言 在使用 Vue 进行日常开发时, 我们经常会用到一些开源的 UI 库, 如: Element-UI_, _Vuetify 等. 只需一行命令, 即可方便 ...
- 16款优秀的Vue UI组件库推荐
16款优秀的Vue UI组件库推荐 Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可. 在公司的Web前端项目开发中,多个项目采用 ...
- ajax插件库,03.vue-ajax、vue UI 组件库
vue-ajax vue 项目中常用的 2 个 ajax 库 vue-resource: vue 插件, 非官方库, vue1.x 使用广泛 axios: 通用的 ajax 请求库, 官方推荐, vu ...
- vant引入组件报错_强烈推荐优秀的Vue UI组件库
在我们实际开发中常常因为项目周期短不得不引入一些UI框架来辅助开发 那常见的比较好的UI框架有那些呢(基于VUE) Element UI组件库 (pc端) Element,一套为开发者.设计师和产品经 ...
- 17款优秀的Vue UI组件库汇总
17款优秀的Vue UI组件库推荐 Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可. 在公司的Web前端项目开发中,多个项目采用 ...
最新文章
- 道路游戏(洛谷 P1070)
- HoughCircles 函数
- 魔方机器人需要特制魔方吗_解魔方的机器人攻略18 – 魔方快速算法
- ActiveMQ结合Spring收发消息
- linux curl 多线程,CURL多线程不执行一直在请求
- 刪除github上的一個repository
- php 正则匹配unicode,PHP中正则表达式对UNICODE字符码的匹配方法
- linux shell 获取参数 $,Linux - Shell - 参数获取
- 一般程序句柄多少linux,一个进程能够打开最大文件句柄数设到多大才合适(Linux)...
- 如何迁移outlook邮件到另一个硬盘_猎头如何有效的搜寻与筛选简历
- linux系统如何切换语言环境变量,Linux系统中如何修改某用户语言环境变量
- 第六届蓝桥杯试题c/c++B组5
- DC-DC转换器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- android引用aar中的字体,android.mk引用aar
- 使用Fiona创建Shapefile矢量数据
- 消息称苹果最快将于2022年推出折叠屏iPhone
- 测试面试题集-性能测试
- python374安装教程_Centos7.6安装工具(5)--编译安装python374
- 乐信、趣店同源“异路”
- Vimeo 开启VR内容付费模式,真的能让消费者主动掏钱包吗?