位置: 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命令)

  • 粉丝流失,原因出在哪里(为什么我的粉丝掉粉)

    粉丝流失,原因出在哪里(为什么我的粉丝掉粉)

  • 怎么退出登录微信国家政务平台(怎么退出登录微信小程序同程的账号)

    怎么退出登录微信国家政务平台(怎么退出登录微信小程序同程的账号)

  • 苹果xr怎么截屏(苹果xr怎么截屏语音)

    苹果xr怎么截屏(苹果xr怎么截屏语音)

  • 华为nove7跟nove7pro的区别是什么(华为nove7跟nove7se的区别)

    华为nove7跟nove7pro的区别是什么(华为nove7跟nove7se的区别)

  • 华为mate8电池寿命(华为mate8电池可以用几年)

    华为mate8电池寿命(华为mate8电池可以用几年)

  • 小米手机无线网络连接上但上不了网怎么办(小米手机无线网络连接不上怎么办)

    小米手机无线网络连接上但上不了网怎么办(小米手机无线网络连接不上怎么办)

  • 剪映怎么搜索模版(剪映怎么搜索模板内容)

    剪映怎么搜索模版(剪映怎么搜索模板内容)

  • 小米8怎么隐藏app图标(小米8怎么隐藏刘海)

    小米8怎么隐藏app图标(小米8怎么隐藏刘海)

  • 幻灯片切换效果怎么设置(幻灯片切换效果为推进怎么设置)

    幻灯片切换效果怎么设置(幻灯片切换效果为推进怎么设置)

  • 荣耀9x屏幕尺寸长宽(荣耀9x手机屏幕尺寸)

    荣耀9x屏幕尺寸长宽(荣耀9x手机屏幕尺寸)

  • 抖音拉黑和移除的区别(抖音拉黑和移除还能搜到对方吗)

    抖音拉黑和移除的区别(抖音拉黑和移除还能搜到对方吗)

  • 苹果7支持电信卡吗(苹果7支持电信5g吗)

    苹果7支持电信卡吗(苹果7支持电信5g吗)

  • r31200相当于什么i5(r31200相当于什么cpu)

    r31200相当于什么i5(r31200相当于什么cpu)

  • win100x80070002无法上网(win100x80070002无法开机)

    win100x80070002无法上网(win100x80070002无法开机)

  • 手机qq怎样查看特别关心(手机qq怎样查看q龄)

    手机qq怎样查看特别关心(手机qq怎样查看q龄)

  • 苹果手机抬头灯显示在哪里设置(苹果手机抬头灯怎么关)

    苹果手机抬头灯显示在哪里设置(苹果手机抬头灯怎么关)

  • 华为荣耀20怎么插耳机(华为荣耀20怎么刷机)

    华为荣耀20怎么插耳机(华为荣耀20怎么刷机)

  • 京东商品销量哪里看(京东的销量排行是真的吗)

    京东商品销量哪里看(京东的销量排行是真的吗)

  • 索尼xperia1无线充电怎么用

    索尼xperia1无线充电怎么用

  • 手机软件安装包在哪里(手机软件安装包在哪找到)

    手机软件安装包在哪里(手机软件安装包在哪找到)

  • cad怎么添加花草树木(cad2014怎么添加花草树木)

    cad怎么添加花草树木(cad2014怎么添加花草树木)

  • 无线网络连接上但手机上不了网(无线网络连接上但无法访问互联网)

    无线网络连接上但手机上不了网(无线网络连接上但无法访问互联网)

  • 解决Element-ui的el-table出现的表格错位问题(element-ui dialog)

    解决Element-ui的el-table出现的表格错位问题(element-ui dialog)

  • php文件怎么解压(php压缩文件怎么打开)

    php文件怎么解压(php压缩文件怎么打开)

  • 一般纳税人资格证明
  • 材料费用发票的记账凭证
  • 关税完税价格是到岸价吗
  • 税收保全措施适用于
  • 残疾人就业保障金会计分录怎么做
  • 房地产预售啥意思
  • 增值税开票内容货物及应税劳务服务名称都有哪些
  • 赠送车子需要过户吗
  • 固定资产评估减值后如何入账
  • 汇票和支票的区别是什么
  • 费用票据包括哪些
  • 有限合伙企业中有限合伙人承担责任的方式为
  • 预缴增值税销售额
  • 事业编制公考
  • 购置税交了发票能作废吗
  • 增值税一般纳税人税率
  • 增值税如何进行抵扣
  • 以土地,房屋用地为主
  • 购进原材料没有发票怎么办
  • 办理对公账户手续流程
  • 电子商务企业类别有哪些
  • 存货质押融资的银行
  • 设备修理费
  • adv举例
  • win10打开第二个桌面快捷键
  • 网络连接错误是什么意思啊
  • 专有技术应当得到
  • 年终奖并入综合所得
  • 注意力机制工作原理
  • gmt微调
  • 人工智能大模型体验报告3.0
  • echarts快速上手
  • axios是干嘛的
  • 人工智能怎么做出来的
  • python进行数学建模
  • 残保金缴纳需要计提吗
  • 收款收据可以盖业务章吗
  • 银行手续费需要开发票吗
  • 当月没有发放工资是不是就不用申报个税
  • 同时安装vs2005团队开发版和sql 2005企业版的方法(downmoon原作)
  • 使用mysql命令
  • 汽车维修公司做账基本流程
  • 购销合同上没有金额,怎么写比较好
  • 公司收到个人转账收入
  • 自己公司刷自己的信用卡
  • 研发部门房租计入研发费吗
  • 未开票收入是否代表可以不开发票
  • 低值易耗品怎么做账务处理
  • 建账前应该考虑哪些问题
  • windows2008 iis7如何取消目录执行权限的详细图文介绍
  • mac安装路径选择
  • 怎样开启bios
  • linux下32位机与64位机基本数据类型长度区别介绍
  • Win10技巧:如何开启隐藏的锁屏时间设置项
  • 电脑图片打印不出来怎么办
  • 如何查看激活日期苹果
  • opengl纹理错误变成条纹
  • 每天看30分钟手机可以吗
  • 注释标签的内容会显示在浏览器窗口中
  • jquery选择器的使用
  • Node.js中的事件循环是什么
  • python数据可视化课后题答案
  • python ftps
  • unity 3d代码
  • shell实现自动ssh
  • 3ds 俄罗斯方块
  • 置顶语句子
  • javascript初级教程
  • jquery 动态添加列表元素
  • 如何设置python
  • jquery鼠标移入
  • 利用html css javascript做一个网页
  • python数据类型有
  • 安卓中px,dp,sp的区别
  • 重庆国税12366电子税务局官网入口
  • 河北电子税务局开票流程
  • 外资企业怎样
  • 树叶加树叶等于几
  • 深圳税务局完税证明
  • 对于批发企业和零售连锁企业的质量验收,错误的是( )
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设