vue2.x el-table二次封装实现编辑修改
作者:小铁匠在门外 发布时间:2023-07-02 16:29:17
标签:vue2.x,el-table,编辑修改
最近开发新业务,看到有些功能一样的表格,想着封装一个组件,记录一下:
最终实现效果
大概实现是:
封装一个通用的表格
接收两个数组, 一个控制行数,一个控制列数
表格可进行编辑操作
官方文档
图中我们可以看到:
:data="tableData"中 传入的tableData用来控制表格行数
el-table-column用来控制列数,有几个el-table-column, 表格就有几列
因此我们再定义一个数组,去对应tableData中的要显示的项,用来产生需要的列
comTable代码如下:
//data是从后端获取到的数据,控制行数
<el-table :data="data" class="com_table" :border="true" style="wdith:100%">
//colData是我们要传入组件的数据,控制列数
<el-table-column
v-for="(item,index) of colData"
:key="index"
:prop="item.prop"
:label="item.label"
:width="item.width || 'auto'"
>
<template slot-scope="scope">
//点击编辑时显示这个
<template v-if="scope.row.isEdit">
//可编辑显示这个
<template v-if="item.editAble">
<el-select @change="changeSelect(scope.row,scope.row[item.prop],item.selectValue)" v-if="item.isSelect" v-model="scope.row[item.prop]">
<!-- 模板中访问不到实例this,因此在computed中使用_this返回 -->
<el-option
v-for="item_ of _this[item.options]"
:key="item_.key"
:label="item_[item.value]"
:value="item_[item.value]"
>
</el-option>
</el-select>n>
</el-select>
<el-input v-else v-model="scope.row[item.prop]"></el-input>
</template>
//如果不可编辑依旧显示这个
<span v-if="!item.editAble">{{scope.row[item.prop]}}</span>
</template>
//默认状态下是这个,因为isEdit在scope.row里并没有,为undefined
<span v-if="!scope.row.isEdit">{{scope.row[item.prop]}}</span>
</template>
</el-table-column>
</el-table>
computed中
computed:{
_this(){
return this
}
},
接收以下参数
props:{
data:{
type:Array,
require:true,
default(){
return []
}
},
//select绑定的值,需要几个就传几个
selectOptions:{
type:Array,
default(){
return []
}
},
colData:{
type:Array,
require:ttrue
default(){
return []
}
}
},
colData 控制列数的数组
export const colData = [
{
prop:'indexNum',
label:'序号',
width:'120px',
},
{
prop:'roadName',
label:'路段名称'
},
{
prop:'tunnelName',
label:'隧道名称'
},
{
prop:'tunnelLength',
label:'隧道长度(m)'
},
{
prop:'completeYear',
label:'建成时间'
},
{
prop:'evaluateYear',
label:'评定年份'
},
{
prop:'evaluateScore',
label:'评定评分'
},
{
prop:'evaluateLevelName',
label:'机电评定等级',
editAble:true, //editAble为true代表可编辑,没有这个值的项 为undefined,即不可编辑
isSelect:true, //表示编辑方式为select, 没有就是输入框
selectValue:'evaluateLevel' //编辑是绑定的值
options:'selectOptions', //遍历产生的option对应的选项
value:'value' //绑定options中对应的键
},
{
prop:'powerRate',
label:'供配电设施完好率(%)',
editAble:true
},
{
prop:'lightRate',
label:'照明设施完好率(%)',
editAble:true
},
{
prop:'ventilateRate',
label:'通风设施完好率(%)',
editAble:true
},
{
prop:'fireControlRate',
label:'消防设施完好率(%)',
editAble:true
},
{
prop:'monitorRate',
label:'监控与通讯设施完好率(%)',
editAble:true
}
]
后端返回的数据是这样的:
当然,这些都是测试用的假数据,切记不要泄露公司数据哦
表格可编辑
<template v-slot:header="{ click, btn_edit }">
<div class="table_title_container">
<h3>历史技术状况评定</h3>
<el-button v-if="btn_edit" class="table_title_btn el-icon-edit" size="small" @click="click">修改</el-button>
<el-button v-else class="table_title_btn el-icon-check" type="primary" size="small" plain @click="click">完成</el-button>
</div>
</template>
if(this.btn_edit){
this.data.forEach(item => {
this.$set(item, 'isEdit', true)
})
}else{
this.data.forEach(item => {
this.$set(item, 'isEdit', null)
})
}
this.btn_edit = !this.btn_edit
按钮为编辑:给data中的每一项添加 'isEdit'属性为true
按钮为完成:设置data中的每一项 'isEdit'属性为null
select绑定相关
一般我们select都是会 对应两个字段
客户端显示的内容
传给服务端的内容
//在comTable中是这样写的
<el-select @change="changeSelect(scope.row,scope.row[item.prop],item.selectValue)" v-if="item.isSelect" v-model="scope.row[item.prop]">
<!-- 模板中访问不到实例this,因此在computed中使用_this返回 -->
<el-option
v-for="item_ of _this[item.options]"
:key="item_.key"
:label="item_[item.value]"
:value="item_[item.value]"
>
</el-option>
</el-select>
colData中相关配置:
{
prop:'evaluateLevelName',
label:'机电评定等级',
editAble:true,
isSelect:true, //编辑时类型为 select
selectValue:'evaluateLevel', //编辑时绑定的值
options:'selectOptions', //遍历产生的option对应的选项
value:'value' //绑定options中对应的键
},
selectOptions:
[
{
key:1,
value:'一类'
},
{
key:2,
value:'二类'
},
{
key:3,
value:'三类'
}
]
select的change事件处理函数
//传入三个参数,分别是:
// 当前这一行的scope.row
//当前这一行特定属性对应的值
//要传给服务端的 scope.row中对应的字段名
changeSelect(obj, value, key){
let val = this.selectOptions.find(item => item.value == value).key
this.$set(obj, key, val)
},
来源:https://juejin.cn/post/7077972024307482660
0
投稿
猜你喜欢
- 假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的:create table SUser( ID bigint unsig
- 问:把数据从MySQL迁移到Oracle需要注意些什么?答:以下是MySQL迁到Oracle需要掌握的注意事项,希望对你有所帮助。1.自动增
- 前言:谈到Update 语句大家可能不会陌生,很多情况下我们都会使用它来更新table中的记录。一般而言我们会使用innodb 的存储引擎,
- 本文实例为大家分享了Virginia无密钥解密的具体代码,供大家参考,具体内容如下加密virginia加密是一种多表替换加密方法,通过这种方
- Pycharm是大多数程序员都会使用的一款编程软件,可是对于新手小白对说,英文界面十分头晕。Pycharm最新版本2020.3汉化、解除汉化
- PHP PDO 事务与自动提交现在通过 PDO 连接上了,在开始进行查询前,必须先理解 PDO 是如何管理事务的。事务支持四大特性(ACID
- 本文实例讲述了python中list常用操作。分享给大家供大家参考。具体分析如下:1.定义list>>> li = [&q
- 使用pyaudio录音和格式转化环境pip3 install pyaudiopip3 install wavepip3 install nu
- 我们将研究一种判别式分类方法,其中直接学习评估 g(x)所需的 w 参数。我们将使用感知器学习算法。感知器学习算法很容易实现,但为了节省时间
- 1.视频分解图片我们使用cv2.VideoCapture来读取视频import cv2cap = cv2.VideoCapture('
- 1 递归函数的特点特点一个函数 内部 调用自己函数内部可以调用其他函数,当然在函数内部也可以调用自己代码特点函数内部的 代码 是相同的,只是
- Python是支持可视化编程,即编写gui程序,你可以用它来编写自己喜欢的桌面程序。使用wxPython来做界面非常的简单,只是不能像C#一
- 本人python新手小白,记录学习过程中遇到的一些小问题。python 爬虫获取网页资源之前,联网是必须的,作为 python 中最常用的
- 1、Librosaimport librosa filepath = "/Users/birenjianmo/Desktop/le
- 本文实例讲述了Python使用Pandas库常见操作。分享给大家供大家参考,具体如下:1、概述Pandas 是Python的核心数据分析支持
- 前言:在做一个商城项目的时候,需要实现商品搜索功能。说到搜索,第一时间想到的是数据库的 select * from tb_sku where
- 使用if…elif…elif…else 实现switch/case可以使用if…elif…elif..else序列来代替switch/cas
- 在windows7下安装SQL2005时会提示不兼容,需要安装SQL2005 SP3或更高的版本,不用管它,一路安装下去,等装完在开始菜单没
- 本文实例为大家分享了Python银行系统的具体代码,供大家参考,具体内容如下import timeimport randomimport p
- JS代码:function showFlash(src,w,h){ html&nbs