在项目中el的表格使用的地方太多了,若不进行封装,使用的时候页面会显得非常的冗余且难以维护,有时表格样式还不能做到一致;今天分享一个在工作中封装的表格

由于大多代码都在页面有介绍,就不在外面解释了

一、表格的基本配置 tableConfig/homeTab.js (由于配置项数据比较多,就单独拿出来写)

/**
* 首页表格配置项
*
* 完整配置
* prop 单元格数据(非特殊类型必填)
label 单元格标题(非特殊类型必填)
isImg 是否是图片类型
type 类型
width 宽度
fixed 固定位置
header-align 表头位置
align 内容位置
*/
export const homeTabOpt = [
{
type: "selection", //单元格类型
width: "60", //单元格宽度
fixed: "left", //单元格固定的地方
headerAlign: "center", //表头是否居中
align: "center", //内容是否居中
},
{
type: "expand", //单元格类型
label: "折叠", //单元格标题
width: "60", //单元格宽度
},
{
type: "index", //单元格类型
label: "索引", //单元格标题
width: "60", //单元格宽度
},
{
prop: "img", //单元格数据
label: "头像", //单元格标题
isImg: true,
},
{
prop: "name", //单元格数据
label: "姓名", //单元格标题
},
{
prop: "date", //单元格数据
label: "时间", //单元格标题
},
{
prop: "address", //单元格数据
label: "地址", //单元格标题
},
];

二、表格封装 components/Table.js

封装时用到了作用于插槽,若没了解过的请先前往https://cn.vuejs.org/v2/guide/components-slots.html#%E4%BD%9C%E7%94%A8%E5%9F%9F%E6%8F%92%E6%A7%BD

<template>
<div class="container">
<!-- 操作按钮组 可包括搜索或其他操作-->
<div class="btns">
<el-button type="danger" @click="handleDeleteSel()">删除所选</el-button>
</div>
<!--
表格 这里只封装了三种特殊情况
1、图片类型
2、文字类型
3、有子列表
...超链接 或其他情况根据项目自行封装
-->
<el-table
:data="tableData.data"
:stripe="tableOpt.stripe"
:border="tableOpt.border"
ref="multipleTable"
@selection-change="handleSelectionChange"
:header-cell-style="tableOpt.tabStyle"
style="width: 100%"
:tree-props="{children: 'list'}"
>
<div v-for="(item,index) in tableColumnOpt" :key="index">
<!-- 图片类型 item.isImg => true-->
<el-table-column
v-if="item.isImg && item.type !== 'expand'"
:type="item.type"
:prop="item.prop"
:label="item.label"
:width="item.width"
:fixed="item.fixed"
:header-align="item.headerAlign || 'center'"
:align="item.align || 'center'"
show-overflow-tooltip
>
<template slot-scope="scope">
<el-image style="width: 120px; height: 100px" :src="scope.row[item.prop]" fit="contain"></el-image>
</template>
</el-table-column> <!-- 非图片类型 item.isImg => false-->
<el-table-column
v-if="!item.isImg && item.type !== 'expand'"
:type="item.type"
:prop="item.prop"
:label="item.label"
:width="item.width"
:fixed="item.fixed"
:header-align="item.headerAlign || 'center'"
:align="item.align || 'center'"
show-overflow-tooltip
></el-table-column> <!-- 有子列表 -->
<el-table-column
v-if="item.type === 'expand'"
:type="item.type"
:prop="item.prop"
:label="item.label"
:width="item.width"
:fixed="item.fixed"
:header-align="item.headerAlign || 'center'"
:align="item.align || 'center'"
show-overflow-tooltip
>
<template slot-scope="scope">
<slot name="expand" :child="scope.row"></slot>
</template>
</el-table-column>
</div> <!-- 操作 -->
<el-table-column width="130" align="center" fixed="right" label="操作">
<!-- 这里把操作的部分写在父组件 原因是可能有的表格需要的操作不一样 方便自定义 -->
<template slot-scope="scope">
<slot name="handle" :handleData="scope.row"></slot>
</template>
</el-table-column>
</el-table> <!-- 分页 数据大于等于5条时使用分页-->
<Pagination
:total="tableData.total"
v-if="tableData.total >= 5"
@handleSizeChange="handleSizeChange"
@handlePageChange="handlePageChange"
/>
</div>
</template> <script>
import Pagination from "@/components/element/Pagination"; //分页 (这里的分页也是经过二次封装的)
export default {
name: "mytable",
props: {
//表格参数(为统一表格样式 这里一般使用默认配置 非特殊情况该项不用传参)
tableOpt: {
type: Object,
default: function () {
return {
border: true, //是否需要边框
stripe: false, //是否需要斑马纹
tabStyle: { background: "#eef1f6", color: "#606266" }, //表格样式
};
},
},
//表格数据
tableData: {
type: [Array, Object],
default: function () {
return [];
},
},
//表格配置参数
tableColumnOpt: {
type: Array,
default: function () {
return [
{
type: "selection", //单元格类型
prop: "name", //单元格数据
label: "", //单元格标题
width: "60", //单元格宽度
fixed: "left", //单元格固定的地方
headerAlign: "center", //表头是否居中
align: "center", //内容是否居中
},
];
},
},
},
data() {
return {
//选择的列表
selectList: null,
};
},
components: {
Pagination,
},
methods: {
//选择的表格项
handleSelectionChange(e) {
this.selectList = e;
this.$emit("handleSelection", e);
},
//删除所选
handleDeleteSel() {
if (this.selectList && this.selectList.length > 0) {
this.$emit("handleDeleteSel");
} else {
this.$notify({
title: "警告",
message: "请选择需要操作的数据",
type: "warning",
});
}
},
//分页 每页展示多少条数据
handleSizeChange(opt) {
this.$emit("handleSizeChange", opt);
},
//分页 当前页
handlePageChange(opt) {
this.$emit("handlePageChange", opt);
},
},
};
</script> <style lang="less" scoped>
.container {
padding: 0.2rem;
.btns {
margin-bottom: 0.1rem;
}
}
</style>

三、页面使用

<template>
<div class="animated bounceInDown">
<!-- 我是首页 在座的各位都是辣鸡 -->
<Table
:tableData="tableData"
:tableColumnOpt="tableColumnOpt"
@handleSelection="handleSelection"
@handlePageChange="handlePageChange"
@handleSizeChange="handleSizeChange"
>
<!-- 子列表内容 -->
<template slot="expand" slot-scope="child">{{child}}</template>
<!-- 表格操作部分的内容 -->
<template slot="handle" slot-scope="handleData">
<el-dropdown>
<el-button type="primary">
操作
<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="handleAdd(handleData.handleData)">添加</el-dropdown-item>
<el-dropdown-item @click.native="handleChange(handleData.handleData)">修改</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</Table>
</div>
</template> <script>
import Table from "@/components/element/Table";
import { tableData } from "@/utils/datas"; //模拟数据
import { homeTabOpt } from "../../tableConfig/homeTab"; //表格配置
export default {
name: "home",
data() {
return {
//表格配置
tableColumnOpt: homeTabOpt,
//表格数据
tableData: tableData,
//分页配置
PagObj: { Index: 0, Count: 5 },
};
},
components: {
Table,
},
methods: {
//选择的列表项
handleSelection(opt) {
console.log(opt);
},
//添加
handleAdd(opt) {
console.log(opt);
},
//修改
handleChange(opt) {
console.log(opt);
},
//分页 当前页
handlePageChange(opt) {
this.PagObj.Index = opt - 1;
this.getDataList();
},
//分页 每页多少条数据
handleSizeChange(opt) {
this.PagObj.Count = opt;
this.getDataList();
}
},
};
</script> <style>
</style>

四、封装的分页也呈上

<template>
<div class="container">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[5, 10, 15, 20,30]"
:page-size="100"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
></el-pagination>
</div>
</template> <script>
export default {
name: "mypagination",
props: {
//数据总数
total: {
type: Number,
default: 100,
},
//当前页
currentPage: {
type: Number,
default: 1,
},
},
data() {
return {};
},
methods: {
//每页展示多少条数据
handleSizeChange(val) {
this.$emit("handleSizeChange", val);
},
//当前页数
handleCurrentChange(val) {
this.$emit("handlePageChange", val);
},
},
};
</script> <style lang="less" scoped>
.container {
text-align: center;
}
</style>

element-ul二次封装table表格的更多相关文章

  1. 原生js封装table表格操作,获取任意行列td,任意单行单列方法

    V1.001更新增加findTable-min.js 本次更新,优化了代码性能方面,增加了部分新功能,可以获取多个table表格批量操作. 考虑到本人后面的项目中可能涉及到大量的表格操作,提前先封了 ...

  2. vue+iview中的table表格导出excel表格

    一.iveiw框架中table中有exportCsv()方法可以导出.csv后缀文件,类似于excel文件,但是并不是excel文件. 二.实现table表格导出excel文件利用Blob.js 和 ...

  3. element el-table表格的vue组件二次封装(附表格高度自适应)

    基于vue的el-table表格二次封装组件方法 前言 在公司实习使用vue+element-ui框架进行前端开发,使用表格el-table较为多,有些业务逻辑比较相似,有些地方使用的重复性高,如果多 ...

  4. 封装Vue Element的可编辑table表格组件

    前一段时间,有博友在我那篇封装Vue Element的table表格组件的博文下边留言说有没有那种"表格行内编辑"的封装组件,我当时说我没有封装过这样的组件,因为一直以来在实际开发 ...

  5. 封装Vue Element的table表格组件

    上周分享了几篇关于React组件封装方面的博文,这周就来分享几篇关于Vue组件封装方面的博文,也好让大家能更好地了解React和Vue在组件封装方面的区别. 在封装Vue组件时,我依旧会交叉使用函数式 ...

  6. java:HTML(table表格,ul列表)和CSS(导入.css文件,三种定义颜色方式,三种样式选择器,a标签属性顺序,)

    1.重点掌握: html: 1.form表单:input,checkbox,seelct,radio,button,submit 2.table表格:thead-->tr-->th;tbo ...

  7. Vue + Element-ui实现后台管理系统(5)---封装一个Form表单组件和Table表格组件

    封装一个Form表单组件和Table组件 有关后台管理系统之前写过四遍博客,看这篇之前最好先看下这四篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-syste ...

  8. 封装Vue纵向表头左右结构的table表格

    我们前端开发人员在使用表格的过程中,大概率碰到的都是表格头部在表格的最上边,然后呈一行展示,紧接着就是表格的每一行的每一个单元格来展示具体内容的场景,很少会遇到表格的头部呈纵向一行展示,也就是说表格的 ...

  9. 对element-ui的table组件的二次封装

    首先,使用过element-ui的table组建的同学都知道,每次使用的时候表头字段都要一个一个的去写,写起来很麻烦,既不美观又浪费时间,基于以上原因,对table组件进行二次封装,使我们在使用的时候 ...

随机推荐

  1. 畅购商城(五):Elasticsearch实现商品搜索

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 畅购商城(一):环境搭建 畅购商 ...

  2. 排查JVM内存泄漏的命令

    1. jps 使用 jps -l -m 获取到当前jvm进程的pid,通过上述命令获取到了服务的进程号 jps(JVM Process Status Tool):显示指定系统内所有的HotSpot虚拟 ...

  3. Swift Alamofire

    转载:https://www.jianshu.com/p/07b1ec36a689最近AFNetworking的作者Matt Thompson 提出了一个新的类似AFNetworking的网络基础库, ...

  4. MySQL--->存储引擎及图形化工具

    本章目标: 掌握MySQL存储引擎的特点 掌握Navicat图形化工具的使用 了解其他的一些图形化管理工具 1.存储引擎种类: 2. 表级锁和行级锁: 3.常见的引擎: InnoDB 存储引擎 MyI ...

  5. JS 弹出框拖拽

    css代码 body { margin:; text-align: center; } .box { display: none; background-color: #fff !important; ...

  6. Docker 快速搭建 MySQL 5.6 开发环境

    使用 Docker 快速搭建一个 MySQL 5.6 开发环境 步骤 获取镜像 docker pull mysql:5.6 启动容器,密码 123456,映射 3306 端口 docker run - ...

  7. 01-java实现动态数组

    01-手撸动态数组 本篇是恋上数据结构第一季个人总结 借鉴https://juejin.im/post/6844904001478066183#heading-0 本人git https://gith ...

  8. SPP、ASPP、RFB、CBAM

    SPP:ASPP:将pooling 改为了 空洞卷积RFB:不同大小的卷积核和空洞卷积进行组合,认为大的卷积应该有更大的感受野. CBAM:空间和通道的注意力机制 SPP: Spatial Pyram ...

  9. 2020-07-29:从 innodb 的索引结构分析,为什么索引的 key 长度不能太长?

    福哥答案2020-07-29: key 太长会导致一个页当中能够存放的 key 的数目变少,间接导致索引树的页数目变多,索引层次增加,从而影响整体查询变更的效率. 索引字段大小限制关于innodb_l ...

  10. Flutter 打包程序 build android apk

    Step-1 Java 路径 找到java路径, 可使用[flutter doctor -v] Step-2: 进入目录 找到路径后 C:\Program Files\Java\jre1.8.0_23 ...