在项目中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. BSGS 学习笔记

    问题:求$a^x\equiv b\ (mod\ p)$的最小正整数解. 这时候就要用到BSGS(拔山盖世)算法.直接进入正题: 设$x=im-n$, 则原式等于$a^{im-n}\equiv b\ ( ...

  2. Linux集群配置离线ntp时间同步服务

    集群中时间不同步有可能会让大数据的应用程序运行混乱,造成不可预知的问题,比如Hbase.mongodb副本集等,Hbase当时间差别过大时就会挂掉,mongodb如果副本时间过快,会出现时间栈帧溢出提 ...

  3. 小谢第50问:vuex的五个属性-使用-介绍

    一.Vuex 是什么? 官网:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 关键词:状态 ...

  4. 聊聊WindowServer那些事!

    前言说明 使用工具:VS2019 思考为什么要使用WindowServer,它能做什么了?(后面解答) 一:什么是WindowServer?(我们做的是一个什么东西?)         Microso ...

  5. Django记录数据库创建、更新、删除操作开源插件推荐

    github: django-simple-history - 安装 $ pip install django-simple-history - 配置 在Settings中添加 INSTALLED_A ...

  6. 数据结构C++实现邻接矩阵存储图

    定义邻接矩阵存储的图类.[实验要求] 1. 创建一个邻接矩阵存储的图: 2. 返回图中指定边的权值: 3. 查找图中某顶点的第一个邻接顶点.某顶点关于另一个顶点的下一个邻接顶点序号: 4. 图的深度优 ...

  7. keil 5.29 无法找到 flash的算法文件

    安装5.29之后,发现编译文件可以,但是Debuger下的flash download找不到对应的flash文件 解决, 重新 安装keil5.29时,PACK的目录选择安装在Keil同级目录下的AR ...

  8. 针对VM从挂机-启动后,docker相关服务的无法使用问题!

    使用软件 :VMware  WorkStation 使用系统:linux  centOS 7 windows远程调用软件:xshell 挂机-启动状态后 先使用  service network re ...

  9. 谈谈对volatile关键字的理解

    1. volatile的特性 volatile是Java语言提供的一种轻量级的同步机制,用来确保将变量得更新操作通知到其它线程.具备三种特性: 保证变量的可见性: 对于volatile修饰的变量进行单 ...

  10. vue自定义可输入的选择框组件

    vue自定义可输入的选择框组件 props: 属性 说明 类型 默认值 selectDataList 下拉框中的内容 Array 空数组([]) value 输入框中的内容 String 空字符串(& ...