位置: IT常识 - 正文

Element Plus二次封装el-table、可编辑表格(element组件的二次封装注册)

编辑:rootadmin
Element Plus二次封装el-table、可编辑表格 一、需求

推荐整理分享Element Plus二次封装el-table、可编辑表格(element组件的二次封装注册),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:element二次开发,elementplus二次封装input,element plus二次封装,el-table二次封装,element组件的二次封装注册,element组件的二次封装注册,element plus二次封装,elementplus二次封装input,内容如对您有帮助,希望把文章链接给更多的朋友!

在后台管理项目中,可以显而易见的见到表格组件,为了方便我们会把表格组件进行二次封装,即方便了开发,也方便了维护。

Element Plus二次封装el-table、可编辑表格(element组件的二次封装注册)

2023年04月01日更新单元格编辑功能

注意事项

2023年4月25号

// LTable.vue组件中// 在修改某一行数据的时候切记删除添加的 index 字段// 否则会报这样的一个错误:caught (in promise) ER_BAD_FIELD_ERROR: Unknown column 'index' in 'field list'// 就是这里这个index导致的,在你去请求接口把这个字段删除掉就可以了,// 例子:delete form.index下面接着去请求接口就行了// 为每一行返回固定的classNamefunction tableRowClassName({ row, rowIndex }) { row.index = rowIndex;}// 为所有单元格设置一个固定的 classNamefunction tableCellClassName({ column, columnIndex }) { column.index = columnIndex;}二、组件功能1、基础表格2、表格分页3、单条数据操作4、表格中图片展示5、根据需要格式化时间6、单条数据操作 启用/禁用7、根据数据状态展示不同样式三、准备工作

在 components 下创建 LTable.vue 文件 接下来是我们的页面 分别需要一个 index.vue 和 table.ts 文件 接下来我们直接上代码

四、LTable.vue 完整代码

这里需要吧 LTable.vue 该组件全局组册 或者使用时单独引入(根据自己需求)

<template> <div class="l-table"> <!-- 表格 --> <el-table :data="props.tableModule.dataList" border height="100%" style="width: 100%; overflow-y: scroll" v-loading="props.tableModule.loading" @selection-change="props.tableModule.selectChange" :row-class-name="tableRowClassName" :cell-class-name="tableCellClassName" @cell-dblclick="cellDblClick"> <el-table-column type="selection" width="50" align="center" /> <template v-if="tableChildren == '1'"> <el-table-column v-for="(item, index) in props.tableModule.columns" :key="item.prop" :prop="item.prop" :label="item.label" :align="item.align || 'left'" :width="item.width" :min-width="item.min_width" :fixed="item.fixed"> <template slot-scope="scope" #default="scope"> <div v-if="item.type == 'switch'"> <el-switch v-model="scope.row[item.prop]" :active-value="item.activeValue" :inactive-value="item.inactiveValue" @change="props.tableModule.switchChange(scope.row)"> </el-switch> </div> <div v-else-if="item.type == 'status'"> <el-tag :type="item.color ? item.color[scope.row[item.prop]] : ''">{{ props.tableModule.fieldChange(scope.row[item.prop], item.option) }}</el-tag> </div> <div v-else-if="item.type == 'image'"> <el-image style="width: 60px; height: 60px" :src="scope.row[item.prop]" :preview-src-list="[scope.row[item.prop]]"> </el-image> </div> <div v-else-if="item.type == 'time'">{{ formatDate(scope.row[item.prop]) }}</div> <div v-else-if="item.isEdit"> <el-input v-model="scope.row[item.prop]" :placeholder="'请输入' + item.label" @blur="inputBlur(scope.row)" autofocus ref="inputRef" v-if="scope.row['index'] == rowIndex && scope.column['index'] == columnIndex" /> <div v-else>{{ scope.row[item.prop] }}</div> </div> <div v-else>{{ scope.row[item.prop] }}</div> </template> </el-table-column> </template> <template v-else-if="tableChildren == '2'"> <el-table-column v-for="(one, index) in props.tableModule.columns" :key="index" :label="one.label"> <el-table-column v-for="item in props.tableModule.columns[index].children" :key="item.prop" :prop="item.prop" :label="item.label" :align="item.align || 'left'" :width="item.width" :min-width="item.min_width" :fixed="item.fixed"> <template slot-scope="scope" #default="scope"> <div v-if="item.type == 'switch'"> <el-switch v-model="scope.row[item.prop]" :active-value="item.activeValue" :inactive-value="item.inactiveValue" @change="props.tableModule.switchChange(scope.row)"> </el-switch> </div> <div v-else-if="item.type == 'status'"> <el-tag :type="item.color ? item.color[scope.row[item.prop]] : ''">{{ props.tableModule.fieldChange(scope.row[item.prop], item.option) }}</el-tag> </div> <div v-else-if="item.type == 'image'"> <el-image style="width: 60px; height: 60px" :src="scope.row[item.prop]" :preview-src-list="[scope.row[item.prop]]"> </el-image> </div> <div v-else-if="item.type == 'time'">{{ formatDate(scope.row[item.prop]) }}</div> <div v-else-if="item.isEdit"> <el-input v-model="scope.row[item.prop]" :placeholder="'请输入' + item.label" @blur="inputBlur(scope.row)" autofocus ref="inputRef" v-if="scope.row['index'] == rowIndex && scope.column['index'] == columnIndex" /> <div v-else>{{ scope.row[item.prop] }}</div> </div> <div v-else>{{ scope.row[item.prop] }}</div> </template> </el-table-column> </el-table-column> </template> <slot name="event"></slot> </el-table> <div class="l-pages"> <!-- 分页 --> <el-pagination :current-page="props.tableModule.pages.page" :page-size.sync="props.tableModule.pages.limit" :page-sizes="pageSizes" :layout="layout" :total="props.tableModule.pages.total" @size-change="props.tableModule.sizeChange" @current-change="props.tableModule.currentChange" /> </div> </div></template><script setup>import { defineProps, onMounted, reactive, toRefs } from 'vue'import { formatDate } from '@/utils/index'const props = defineProps({ tableModule: Object, layout: { type: String, default: "total, sizes, prev, pager, next, jumper", }, pageSizes: { type: Array, default() { return [10, 20, 30, 50]; }, }, tableChildren: { type: String, default: '1' }})const state = reactive({ rowIndex: 0, columnIndex: 0})const { rowIndex, columnIndex } = toRefs(state)onMounted(() => { })// 编辑单元格// 为每一行返回固定的classNamefunction tableRowClassName({ row, rowIndex }) { row.index = rowIndex;}// 为所有单元格设置一个固定的 classNamefunction tableCellClassName({ column, columnIndex }) { column.index = columnIndex;}// el-table单元格双击事件function cellDblClick(row, column, cell, event) { state.rowIndex = row.index state.columnIndex = column.index}// input失去焦点function inputBlur(row) { state.rowIndex = 0 state.columnIndex = 0 props.tableModule.editInputBlur()}</script><style scoped lang="scss">.l-table { height: calc(100% - 32px); padding-bottom: 10px; .el-table { height: calc(100% - 42px) !important; } .l-pages { margin-top: 10px; }}</style>index.vue 完整代码<template> <div class="role"> <!-- :tableChildren="2" 开启二级表头 普通表格不穿 --> <LTable :tableModule="tableModule" :tableChildren="2"> <template #event> <el-table-column align="center" fixed="right" label="操作" width="120"> <template slot-scope="scope" #default="scope"> <el-button @click="userDelete(scope)">删除</el-button> </template> </el-table-column> </template> </LTable> </div></template><script setup lang="ts">import { reactive, toRefs, ref, onMounted } from 'vue'import { columnsData } from './table'import { ElMessage, ElMessageBox } from 'element-plus'const state = reactive({ columns: columnsData, selections: [], loading: false, dataList: [ { username: '张三', phone: '16688889999', createDate: 1679489616000, avatar: 'https://img1.baidu.com/it/u=2427424503,947601508&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500', userStatus: 1, } ], pages: { total: 0, limit: 20, page: 1, }})const { loading, dataList, columns, pages } = toRefs(state)onMounted(() => { getDataList()})function getDataList() {}function userDelete(row: any) { console.log(row)}// 表格分页相关const tableModule = ref<Object>({ currentChange: currentChange, selectChange: selectChange, fieldChange: fieldChange, sizeChange: sizeChange, editInputBlur: editInputBlur, columns: columns, dataList: dataList, loading: loading, pages: pages})function selectChange(selection: any) { state.selections = selection}function fieldChange(row: any, option: any) { if (option[row]) { return option[row] }}function sizeChange(item: any) { state.pages.limit = item getDataList()}function currentChange(item: any) { state.pages.page = item getDataList()}function editInputBlur() { console.log('可编辑单元格失去焦点')}</script><style scoped lang="scss"></style>table.ts 完整代码talbe.ts文件介绍该文件是控制我们表格的列展示的const columnsData: any = [ { prop: 'username', // 数据字段对应 label: '姓名', // 列名称 min_width: 120,// 最小长度(这里建议每一个表格中最少有一个字段设置最小长度)设置这个就不用设置 widht 了,大家可以自己摸索 fixed: true // 固定表头(注意:二级表头时不可用) }, { prop: 'phone', label: '手机号', isEdit: true, // isEdit为 true 开启单元格编辑(可编辑的单元格由自己控制) align: 'center', // 控制列对其方式(默认左对齐) width: 150, }, { prop: 'createDate', label: ' 创建时间', align: 'center', type: 'time', // 针对字段需要时间格式化 width: 180, }, { prop: 'avatar', label: '头像', align: 'center', type: 'image', // 设置字段以图片展示 width: 80 }, { prop: 'userStatus', label: '用户状态', align: 'center', type: 'switch', // 编辑用户状态 activeValue: 1, // switch为打开时的值 inactiveValue: 2,// switch为关闭时的值 width: 100 }, { prop: 'userStatus', label: '用户状态', align: 'center', width: 100, type: 'status', // 与 type 为 switch 不同(status主要是看的而不是对数据的操作) option: { '1': '启用', '2': '禁用', }, color: { '1': 'success', '2': 'info', } },]export { columnsData}// 二级表头写法const columnsData: any = [ { label: '用户信息', // 表头名称 children: [ // 子级表头 { prop: 'username', label: '姓名', min_width: 120 } ] }, // 依次向下添加即可]export { columnsData}

这里附上一张效果图 二级表头效果图 可编辑单元格

表格增删改查请移步至 el-table表格查询封装

本文链接地址:https://www.jiuchutong.com/zhishi/287937.html 转载请保留说明!

上一篇:巨大的冰柱悬挂在Abiqua瀑布周围的玄武岩石墙上,俄勒冈 (© Joshua Meador/Tandem Stills + Motion)(巨大的冰柱造句)

下一篇:slappasswd命令 设置LDAP管理员密码(sload命令)

  • 红米note10pro怎么插sd卡(红米note10pro怎么关闭今日推荐)

    红米note10pro怎么插sd卡(红米note10pro怎么关闭今日推荐)

  • 小度如何改唤醒名字(小度唤醒怎么设置方法)

    小度如何改唤醒名字(小度唤醒怎么设置方法)

  • 网络计算属于计算机网络吗(网络计算是一种什么计算)

    网络计算属于计算机网络吗(网络计算是一种什么计算)

  • appstore图片加载不出来怎么办(apple store图片加载不出来)

    appstore图片加载不出来怎么办(apple store图片加载不出来)

  • 苹果13.2.2值得更新吗(苹果13.2值得升级么)

    苹果13.2.2值得更新吗(苹果13.2值得升级么)

  • 华为有4k屏手机吗(华为有没有4k屏幕)

    华为有4k屏手机吗(华为有没有4k屏幕)

  • 钉钉视频会议主持人录制是什么意思(钉钉视频会议主持人可以强制开麦吗)

    钉钉视频会议主持人录制是什么意思(钉钉视频会议主持人可以强制开麦吗)

  • outlook是一款什么应用程序(outlook叫什么)

    outlook是一款什么应用程序(outlook叫什么)

  • 制冷片原理(制冷片原理材料)

    制冷片原理(制冷片原理材料)

  • 苹果丢失了要不要抹掉(iphone丢了之后怎么办)

    苹果丢失了要不要抹掉(iphone丢了之后怎么办)

  • 华为mate30微信指纹支付怎么设置(华为mate30微信指纹怎么开)

    华为mate30微信指纹支付怎么设置(华为mate30微信指纹怎么开)

  • 笔记本屏蔽核显的好处(笔记本屏蔽核显只用独显)

    笔记本屏蔽核显的好处(笔记本屏蔽核显只用独显)

  • 华为手环多久充一次电(华为手环充电多久能充满)

    华为手环多久充一次电(华为手环充电多久能充满)

  • 腾讯微云的用途(腾讯微云的用处)

    腾讯微云的用途(腾讯微云的用处)

  • 戴尔i5与i7的区别(戴尔i7和i5有什么区别)

    戴尔i5与i7的区别(戴尔i7和i5有什么区别)

  • 智能卡系统由哪些部分构成(智能卡应用系统)

    智能卡系统由哪些部分构成(智能卡应用系统)

  • ipad充电多久充满正常(ipad充电多久充一次)

    ipad充电多久充满正常(ipad充电多久充一次)

  • iphone11关机后闹钟会响吗(iphone11关机后闹钟响吗)

    iphone11关机后闹钟会响吗(iphone11关机后闹钟响吗)

  • 苹果11处理器多少(苹果11处理器多少核)

    苹果11处理器多少(苹果11处理器多少核)

  • iphone6应用密码锁怎么弄(苹果手机6应用锁怎么设置密码)

    iphone6应用密码锁怎么弄(苹果手机6应用锁怎么设置密码)

  • 手机防尘贴怎么用(手机防尘贴怎么用视频)

    手机防尘贴怎么用(手机防尘贴怎么用视频)

  • 爱奇艺电影券怎么领取(爱奇艺劵)

    爱奇艺电影券怎么领取(爱奇艺劵)

  • 荣耀9x什么屏幕(荣耀9x的屏幕是什么屏)

    荣耀9x什么屏幕(荣耀9x的屏幕是什么屏)

  • 主机开关线怎么接(主机开关线怎么接图解)

    主机开关线怎么接(主机开关线怎么接图解)

  • 手机电池不行怎么办(手机电池不太好了 怎么办)

    手机电池不行怎么办(手机电池不太好了 怎么办)

  • 苹果xs屏幕亮度自动调节(苹果xs屏幕亮度突然变暗)

    苹果xs屏幕亮度自动调节(苹果xs屏幕亮度突然变暗)

  • 旺旺号降权多久能恢复(旺旺号降权多久恢复可以查到是哪单被降了?)

    旺旺号降权多久能恢复(旺旺号降权多久恢复可以查到是哪单被降了?)

  • 头条怎么不显示访客(头条怎么不显示抖音粉丝)

    头条怎么不显示访客(头条怎么不显示抖音粉丝)

  • 最新2021win10专业版激活秘钥序列号推荐 附激活工具(最新w10系统专业版)

    最新2021win10专业版激活秘钥序列号推荐 附激活工具(最新w10系统专业版)

  • 座头鲸妈妈将她熟睡的幼鲸推到水面,夏威夷毛伊岛 (© Ralph Pace/Minden Pictures)(座头鲸救人)

    座头鲸妈妈将她熟睡的幼鲸推到水面,夏威夷毛伊岛 (© Ralph Pace/Minden Pictures)(座头鲸救人)

  • 学习使用vue实现一个简单的轮播图(vue使用教程)

    学习使用vue实现一个简单的轮播图(vue使用教程)

  • 转让股份缴纳什么税
  • 增值税专用发票抵扣期限
  • 1号没有抄税可以补税吗
  • 服务费发票的税率是多少
  • 免征企业所得税的有
  • 财务章备案和不备份区别
  • 提取的应交增值税怎么算
  • 小规模变更为一般纳税人流程
  • 一般纳税人劳务税率是多少2023
  • 装修辅材行业辅材现状
  • 企业作为二房东要交什么税
  • 人工材料成本怎么分配
  • 补缴企业所得税滞纳金账务处理
  • 小规模纳税人物流服务税率
  • 增值税多缴纳0.03怎么算
  • 纳税申报意思
  • 增值税进项销项怎么算
  • abs应付债券
  • 记账凭证领用材料如何填写
  • 固定资产改良被替换怎么处理
  • 返还工资保证金的书面申请
  • 基建管理费如何进行结转?
  • 收到一张免税发票能抵税吗
  • 子公司之间固定资产划转 增值税会计处理
  • 技术转让减免所得额
  • 没有走公户的发票费用怎么做账
  • 原材料座椅报废怎么处理
  • 怎么证明公司的存在
  • 不合格原材料
  • fodhelper.exe是什么程序
  • php开启pdo
  • 销售折扣增值税如何处理
  • vue3props用法
  • 运动目标检测算法
  • 职工教育经费可以以后年度结转吗
  • 第二季度企业所得税怎么计提
  • php判断文件后缀
  • od输出结构
  • 固定资产加速折旧是什么意思
  • 事业结余是事业单位当年全部收支相抵后的余额
  • 财务报表年报和汇算清缴的顺序
  • virtono搭建教程
  • 年会服装费属于什么费用
  • 上月结余金额是什么的
  • 进项税额不得抵扣的情况
  • 印花税会计处理办法
  • 非预算类专用账户
  • 财政拨款的事业单位工资
  • 支付政协扶贫款怎么做账
  • 固定资产出售的收入属于收入吗
  • 代扣税是啥
  • 股票股利应该何时分摊
  • 资产负债表日后非调整事项应当在附注中披露
  • k3凭证模板
  • 股东分红按利润表的净利润计算
  • 超市被盗怎么办
  • 装修公司购买材料,工程施工账务处理会计分录
  • 进口货物的库存商品金额依据
  • 企业要建账需留什么资料
  • mysql查询结果是什么类型
  • Windows下System Volume Information文件夹是干嘛用的?
  • window系统怎么用
  • windows xp cmd
  • freebsd怎么样
  • linux根文件系统直接解压到硬盘
  • win10升级版本后还要激活吗
  • linux时区问题
  • python accdb
  • 谈一谈js消息机制的理解
  • opencv人脸识别模型训练
  • unity飞机大战游戏毕业论文
  • JavaScript中的方法名不区分大小写
  • jquery中的css方法
  • 简单的智能家居
  • unity3d有什么用
  • python 字符串
  • javascript面向对象编程指南 pdf
  • 北京市国家税务局网站官网
  • 小规模纳税人公司买车能抵多少税
  • 财政部国家税务总局2021年40号
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设