如何用vue2+element-ui實現(xiàn)多行行內(nèi)表格編輯
效果圖展示
當(dāng)在表格中點擊編輯按鈕時:

點擊的行變成文本框且數(shù)據(jù)回顯可以點擊確定按鈕修改數(shù)據(jù)或者取消修改回退數(shù)據(jù):

具體實現(xiàn)步驟
1. 行數(shù)據(jù)定義編輯標(biāo)記
行數(shù)據(jù)定義編輯標(biāo)記
當(dāng)在組件中獲取到用于表格展示數(shù)據(jù)的方法中,針對每一行數(shù)據(jù)添加一個編輯標(biāo)記
this.list.forEach(item => {
// item.isEdit = false // 添加一個屬性 初始值為false
// 數(shù)據(jù)響應(yīng)式的問題 數(shù)據(jù)變化 視圖更新
// 添加的動態(tài)屬性 不具備響應(yīng)式特點
// this.$set(目標(biāo)對象, 屬性名稱, 初始值) 可以針對目標(biāo)對象 添加的屬性 添加響應(yīng)式
this.$set(item, 'isEdit', false)
})注意:為什么不使用item.isEdit = false , 因為動態(tài)添加的屬性不具備響應(yīng)式的特點,如果想要具備響應(yīng)式,可以使用$set
2. 點擊行編輯標(biāo)記狀態(tài)(isEdit)
點擊編輯時,將當(dāng)前行的標(biāo)記isEdit設(shè)置為true
<el-table-column align="center" label="操作">
<template>
<!-- 非編輯狀態(tài) -->
<el-button size="mini" type="text">分配權(quán)限</el-button>
<el-button size="mini" type="text" @click="btnEditRow(row)">編輯</el-button>
<el-button size="mini" type="text">刪除</el-button>
</template>
</el-table-column>點擊編輯的方法
// 點擊編輯行
btnEditRow(row) {
row.isEdit = true // 改變行的編輯狀態(tài)
}3. 插槽根據(jù)標(biāo)記渲染表單
在el-table-column組件中使用<template v-slot="{ row }">作用域插槽獲取當(dāng)前行的信息
所以在表格列中可以借助當(dāng)前行的信息根據(jù)當(dāng)前的isEdit標(biāo)記-渲染結(jié)構(gòu)
<el-table-column prop="name" align="center" width="200" label="角色">
<template v-slot="{ row }">
<!-- 條件判斷 -->
<el-input v-if="row.isEdit" size="mini" />
<span v-else>{{ row.name }}</span>
</template>
</el-table-column>
<el-table-column prop="state" align="center" width="200" label="啟用">
<!-- 自定義列結(jié)構(gòu) -->
<template v-slot="{ row }">
<el-switch v-if="row.isEdit" />
<span v-else> {{ row.state === 1 ? "已啟用" : row.state === 0 ? "未啟用" : "無" }} </span>
</template>
</el-table-column>$set的應(yīng)用
- this.$set(目標(biāo)對象, 屬性名稱, 初始值 )
- 等價于 Vue.set(目標(biāo)對象, 屬性名稱, 初始值)
- 向響應(yīng)式對象中添加一個屬性,并確保這個新屬性同樣是響應(yīng)式的,且觸發(fā)視圖更新。
行內(nèi)編輯-數(shù)據(jù)緩存
行內(nèi)編輯需要做數(shù)據(jù)緩存
為什么要做數(shù)據(jù)緩存?
因為編輯時,可以取消會滾到之前的狀態(tài),所以編輯時的數(shù)據(jù)是臨時的數(shù)據(jù)。
假設(shè)list數(shù)組中的name,state,description三個屬性是用于表格每列展示的數(shù)據(jù),當(dāng)進行行內(nèi)編輯時需要將這3個屬性進行緩存,因為編輯的數(shù)據(jù)是臨時的

如圖,editRow的數(shù)據(jù)是針對當(dāng)前行的數(shù)據(jù)做了一份拷貝,針對這個拷貝,我們可以隨意修改。
1. 初始化時緩存數(shù)據(jù)
//緩存數(shù)據(jù)
this.list.forEach(item => {
this.$set(item, 'isEdit', false)
this.$set(item, 'editRow', {
name: item.name,
state: item.state,
description: item.description
})
})2. 點擊編輯時更新緩存數(shù)據(jù)
btnEditRow(row) {
row.isEdit = true // 改變行的編輯狀態(tài)
// 更新緩存數(shù)據(jù)
row.editRow.name = row.name
row.editRow.state = row.state
row.editRow.description = row.description
}3. 將編輯時的表單雙向綁定緩存數(shù)據(jù)
<el-table-column prop="name" align="center" width="200" label="角色">
<template v-slot="{ row }">
<!-- 條件判斷 -->
<!-- 編輯狀態(tài) -->
<el-input v-if="row.isEdit" v-model="row.editRow.name" size="mini" />
<!-- 非編輯狀態(tài) -->
<span v-else>{{ row.name }}</span>
</template>
</el-table-column>行內(nèi)編輯-確定取消按鈕
1. 確定按鈕
el-table中不能使用表單所以在確定按鈕的回調(diào)中要進行手動判斷
然后將編輯好的數(shù)據(jù)封裝到一個對象中發(fā)起請求
下方使用Object.assign方法是因為發(fā)送完請求,數(shù)據(jù)庫數(shù)據(jù)已更新,而前端頁面也需要更新
<el-button type="primary" size="mini" @click="btnEditOK(row)">確定</el-button>
// 點擊確定時觸發(fā)
async btnEditOK(row) {
if (row.editRow.name && row.editRow.description) {
// 下一步操作
await updateRole({ ...row.editRow, id: row.id })
// 更新成功
this.$message.success('更新角色成功')
// 更新顯示數(shù)據(jù) 退出編輯狀態(tài)
// row.name = row.editRow.name // eslint的一校驗 誤判
// Object.assign(target, source)
Object.assign(row, {
...row.editRow,
isEdit: false // 退出編輯模式
}) // 規(guī)避eslint的誤判
} else {
this.$message.warning('角色和描述不能為空')
}
}注意: 這里既然更新成功了,要把緩存數(shù)據(jù)回顯到頁面上,并且關(guān)閉編輯模式
2. 取消按鈕
關(guān)閉編輯狀態(tài)即可
<el-button size="mini" @click="row.isEdit = false">取消</el-button>
總結(jié)
到此這篇關(guān)于如何用vue2+element-ui實現(xiàn)多行行內(nèi)表格編輯的文章就介紹到這了,更多相關(guān)vue2+element-ui多行行內(nèi)表格編輯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue.js實現(xiàn)高質(zhì)量翻頁功能的完整開發(fā)指南
當(dāng)我們在網(wǎng)頁中展示大量數(shù)據(jù)時,分頁能幫助用戶快速瀏覽內(nèi)容,提高頁面的加載性能和用戶體驗,本文將從基礎(chǔ)翻頁功能入手,逐步升級至可復(fù)用的分頁組件,并提供性能優(yōu)化和用戶體驗提升的實用建議,需要的朋友可以參考下2025-07-07
laravel-admin 與 vue 結(jié)合使用實例代碼詳解
由于 Laravel-admin 采用的是 pjax 的方式刷新頁面,意味著很多頁面刷新的操作,這篇文章主要介紹了laravel-admin 與 vue 結(jié)合使用,需要的朋友可以參考下2019-06-06
elementUI+Springboot實現(xiàn)導(dǎo)出excel功能的全過程
這篇文章主要介紹了elementUI+Springboot實現(xiàn)導(dǎo)出excel功能,現(xiàn)在也對這個導(dǎo)出功能進行一個匯總整理寫出來,結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09
Vue中的Object.defineProperty全面理解
這篇文章主要介紹了Vue中的Object.defineProperty全面理解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04
Vue項目npm操作npm run serve或npm run dev報錯及二者
這篇文章主要介紹了Vue項目npm操作npm run serve或npm run dev報錯及二者的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10

