vue2.x?el-table二次封裝實(shí)現(xiàn)編輯修改
最近開發(fā)新業(yè)務(wù),看到有些功能一樣的表格,想著封裝一個組件,記錄一下:
最終實(shí)現(xiàn)效果

大概實(shí)現(xiàn)是:
- 封裝一個通用的表格
- 接收兩個數(shù)組, 一個控制行數(shù),一個控制列數(shù)
- 表格可進(jìn)行編輯操作

圖中我們可以看到:
- :data="tableData"中 傳入的tableData用來控制表格行數(shù)
- el-table-column用來控制列數(shù),有幾個el-table-column, 表格就有幾列
- 因此我們再定義一個數(shù)組,去對應(yīng)tableData中的要顯示的項(xiàng),用來產(chǎn)生需要的列
comTable代碼如下:
//data是從后端獲取到的數(shù)據(jù),控制行數(shù)
<el-table :data="data" class="com_table" :border="true" style="wdith:100%">?
? ?? ??? ??? ??? ??? ?//colData是我們要傳入組件的數(shù)據(jù),控制列數(shù)
? ? ? ? ? ? <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">
? ? ? ? ? ? ? ? ? //點(diǎn)擊編輯時顯示這個
? ? ? ? ? ? ? ? ? ? <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]">
? ? ? ? ? ? ? ? ? ? ? ? ? ? <!-- 模板中訪問不到實(shí)例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>
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//默認(rèn)狀態(tài)下是這個,因?yàn)閕sEdit在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
? ? ? ? }
? ? },
?接收以下參數(shù)
props:{
data:{
type:Array,
require:true,
default(){
return []
}
},
//select綁定的值,需要幾個就傳幾個
selectOptions:{
type:Array,
default(){
return []
}
},
colData:{
type:Array,
require:ttrue
default(){
return []
}
}
},colData 控制列數(shù)的數(shù)組
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:'機(jī)電評定等級',
editAble:true, //editAble為true代表可編輯,沒有這個值的項(xiàng) 為undefined,即不可編輯
isSelect:true, //表示編輯方式為select, 沒有就是輸入框
selectValue:'evaluateLevel' //編輯是綁定的值
options:'selectOptions', //遍歷產(chǎn)生的option對應(yīng)的選項(xiàng)
value:'value' //綁定options中對應(yīng)的鍵
},
{
prop:'powerRate',
label:'供配電設(shè)施完好率(%)',
editAble:true
},
{
prop:'lightRate',
label:'照明設(shè)施完好率(%)',
editAble:true
},
{
prop:'ventilateRate',
label:'通風(fēng)設(shè)施完好率(%)',
editAble:true
},
{
prop:'fireControlRate',
label:'消防設(shè)施完好率(%)',
editAble:true
},
{
prop:'monitorRate',
label:'監(jiān)控與通訊設(shè)施完好率(%)',
editAble:true
}
]后端返回的數(shù)據(jù)是這樣的:

當(dāng)然,這些都是測試用的假數(shù)據(jù),切記不要泄露公司數(shù)據(jù)哦
表格可編輯
<template v-slot:header="{ click, btn_edit }">
? ? ? ? ? ? ? ? <div class="table_title_container">
? ? ? ? ? ? ? ? ? ? <h3>歷史技術(shù)狀況評定</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中的每一項(xiàng)添加 'isEdit'屬性為true
按鈕為完成:設(shè)置data中的每一項(xiàng) 'isEdit'屬性為null
select綁定相關(guān)
一般我們select都是會 對應(yīng)兩個字段
- 客戶端顯示的內(nèi)容
- 傳給服務(wù)端的內(nèi)容
//在comTable中是這樣寫的
<el-select @change="changeSelect(scope.row,scope.row[item.prop],item.selectValue)" v-if="item.isSelect" v-model="scope.row[item.prop]">
<!-- 模板中訪問不到實(shí)例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中相關(guān)配置:
{
prop:'evaluateLevelName',
label:'機(jī)電評定等級',
editAble:true,
isSelect:true, //編輯時類型為 select
selectValue:'evaluateLevel', //編輯時綁定的值
options:'selectOptions', //遍歷產(chǎn)生的option對應(yīng)的選項(xiàng)
value:'value' //綁定options中對應(yīng)的鍵
},selectOptions:
[
{
key:1,
value:'一類'
},
{
key:2,
value:'二類'
},
{
key:3,
value:'三類'
}
]select的change事件處理函數(shù)
//傳入三個參數(shù),分別是:
// 當(dāng)前這一行的scope.row
//當(dāng)前這一行特定屬性對應(yīng)的值
//要傳給服務(wù)端的 scope.row中對應(yīng)的字段名
changeSelect(obj, value, key){
let val = this.selectOptions.find(item => item.value == value).key
this.$set(obj, key, val)
},到此這篇關(guān)于vue2.x el-table二次封裝實(shí)現(xiàn)編輯修改的文章就介紹到這了,更多相關(guān)vue2.x el-table 編輯修改內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue @vuelidate父子組件綁定注意事項(xiàng)
Vue@vuelidate父子組件驗(yàn)證時,不能直接綁定,需在子組件驗(yàn)證方法內(nèi)部進(jìn)行綁定,以避免父組件驗(yàn)證時包含子組件的驗(yàn)證2025-02-02
vuex實(shí)現(xiàn)及簡略解析(小結(jié))
這篇文章主要介紹了vuex實(shí)現(xiàn)及簡略解析(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03
使用Vue3+PDF.js實(shí)現(xiàn)PDF預(yù)覽功能
項(xiàng)目中有一個需要預(yù)覽下載pdf的需求,網(wǎng)上找了很久,決定使用 pdf.js 完成,下面這篇文章主要給大家介紹了關(guān)于使用Vue3+PDF.js實(shí)現(xiàn)PDF預(yù)覽功能的相關(guān)資料,需要的朋友可以參考下2022-12-12
vue-video-player 解決微信自動全屏播放問題(橫豎屏導(dǎo)致樣式錯亂問題)
這篇文章主要介紹了vue-video-player 解決微信自動全屏播放問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
Ant Design Vue如何生成動態(tài)菜單a-menu
這篇文章主要介紹了Ant Design Vue如何生成動態(tài)菜單a-menu問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
通過GASP讓vue實(shí)現(xiàn)動態(tài)效果實(shí)例代碼詳解
GASP是一個JavaScript動畫庫,它支持快速開發(fā)高性能的 Web 動畫。GASP 使我們能夠輕松輕松快速的將動畫串在一起,來創(chuàng)造一個高內(nèi)聚的流暢動畫序列。這篇文章主要介紹了通過GASP讓vue實(shí)現(xiàn)動態(tài)效果,需要的朋友可以參考下2019-11-11
vue或css動畫實(shí)現(xiàn)列表向上無縫滾動
這篇文章主要為大家詳細(xì)介紹了vue或css動畫實(shí)現(xiàn)列表向上無縫滾動,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04

