element-ul二次封装table表格
在项目中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表格的更多相关文章
- 原生js封装table表格操作,获取任意行列td,任意单行单列方法
V1.001更新增加findTable-min.js 本次更新,优化了代码性能方面,增加了部分新功能,可以获取多个table表格批量操作. 考虑到本人后面的项目中可能涉及到大量的表格操作,提前先封了 ...
- vue+iview中的table表格导出excel表格
一.iveiw框架中table中有exportCsv()方法可以导出.csv后缀文件,类似于excel文件,但是并不是excel文件. 二.实现table表格导出excel文件利用Blob.js 和 ...
- element el-table表格的vue组件二次封装(附表格高度自适应)
基于vue的el-table表格二次封装组件方法 前言 在公司实习使用vue+element-ui框架进行前端开发,使用表格el-table较为多,有些业务逻辑比较相似,有些地方使用的重复性高,如果多 ...
- 封装Vue Element的可编辑table表格组件
前一段时间,有博友在我那篇封装Vue Element的table表格组件的博文下边留言说有没有那种"表格行内编辑"的封装组件,我当时说我没有封装过这样的组件,因为一直以来在实际开发 ...
- 封装Vue Element的table表格组件
上周分享了几篇关于React组件封装方面的博文,这周就来分享几篇关于Vue组件封装方面的博文,也好让大家能更好地了解React和Vue在组件封装方面的区别. 在封装Vue组件时,我依旧会交叉使用函数式 ...
- java:HTML(table表格,ul列表)和CSS(导入.css文件,三种定义颜色方式,三种样式选择器,a标签属性顺序,)
1.重点掌握: html: 1.form表单:input,checkbox,seelct,radio,button,submit 2.table表格:thead-->tr-->th;tbo ...
- Vue + Element-ui实现后台管理系统(5)---封装一个Form表单组件和Table表格组件
封装一个Form表单组件和Table组件 有关后台管理系统之前写过四遍博客,看这篇之前最好先看下这四篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-syste ...
- 封装Vue纵向表头左右结构的table表格
我们前端开发人员在使用表格的过程中,大概率碰到的都是表格头部在表格的最上边,然后呈一行展示,紧接着就是表格的每一行的每一个单元格来展示具体内容的场景,很少会遇到表格的头部呈纵向一行展示,也就是说表格的 ...
- 对element-ui的table组件的二次封装
首先,使用过element-ui的table组建的同学都知道,每次使用的时候表头字段都要一个一个的去写,写起来很麻烦,既不美观又浪费时间,基于以上原因,对table组件进行二次封装,使我们在使用的时候 ...
随机推荐
- Skill 脚本演示 ycCommonCenterMos.skl
https://www.cnblogs.com/yeungchie/ ycCommonCenterMos.skl 自动生成一个共质心差分对 Mos ,可以自定布局类型. 回到目录
- C/C++编程笔记:inline函数的总结!C/C++新手值得收藏!
在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间. 在系统下, ...
- luogu P4726 【模板】多项式指数函数 多项式 exp 牛顿迭代 泰勒展开
LINK:多项式 exp 做多项式的题 简直在嗑药. 前置只是 泰勒展开 这个东西用于 对于一个函数f(x) 我们不好得到 其在x处的取值. 所以另外设一个函数g(x) 来在x点处无限逼近f(x). ...
- Lambda表达式运行原理
目录 一.创建测试样例 二.利用Java命令编译分析 三.文末 JDK8引入了Lambda表达式以后,对我们写代码提供了很大的便利,那么Lambda表达式是如何运用简单表示来达到运行效果的呢?今天,我 ...
- Guava基本工具--常见Object方法
在Java中Object类是所有类的父类,其中有几个需要override的方法比如equals,hashCode和toString等方法.每次写这几个方法都要做很多重复性的判断, 很多类库提供了覆写这 ...
- IDEA-Translation最优秀的翻译插件
IDEA最优秀的翻译插件 效果 特性 多翻译引擎 Google翻译 有道翻译 百度翻译 多语言互译 文档翻译 语音朗读 自动选词 自动单词拆分 单词本 使用 申请有道智云翻译服务(可选): 注册有道智 ...
- 微信小程序通过二维码获取参数运行
小程序开发过程中会遇到参数id会通过二维码获取,然后执行接口获取数据,但是难免会遇到带过来的参数出现乱码,这样就需要解码,多个参数时就需要进行处理取我们需要的字段值:小程序开发过程中会遇到参数id会通 ...
- 一篇夯实一个知识点系列--python实现十大排序算法
写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 干货儿 排序算法从不同维度可 ...
- 四种方法求Capacitated Facility Location Problem问题
问题详情 1. 贪心算法 1.1 算法框架 此题可以利用贪心算法来求解, 可以假设只关注顾客的cost, 当仓库满了就在下一个仓库里 具体解决方案: 将每个顾客到工厂的cost 由小到大进行排序 从第 ...
- 清晰详细、可测量、可达到、目标导向、有时间限定,SMART目标定制原则
设定目标的时候需要考虑的问题,可以对已经设定的目标进行完善 S 目标是清晰的,明确的 M 目标可以衡量的,可以用来评估的 A 目标是可以达到的,但是达到的过程有难度 R 目标导向,设定的目标对大目标具 ...