如何用vue2+element-ui實(shí)現(xiàn)多行行內(nèi)表格編輯
效果圖展示
當(dāng)在表格中點(diǎn)擊編輯按鈕時(shí):
點(diǎn)擊的行變成文本框且數(shù)據(jù)回顯可以點(diǎn)擊確定按鈕修改數(shù)據(jù)或者取消修改回退數(shù)據(jù):
具體實(shí)現(xiàn)步驟
1. 行數(shù)據(jù)定義編輯標(biāo)記
行數(shù)據(jù)定義編輯標(biāo)記
當(dāng)在組件中獲取到用于表格展示數(shù)據(jù)的方法中,針對每一行數(shù)據(jù)添加一個(gè)編輯標(biāo)記
this.list.forEach(item => { // item.isEdit = false // 添加一個(gè)屬性 初始值為false // 數(shù)據(jù)響應(yīng)式的問題 數(shù)據(jù)變化 視圖更新 // 添加的動(dòng)態(tài)屬性 不具備響應(yīng)式特點(diǎn) // this.$set(目標(biāo)對象, 屬性名稱, 初始值) 可以針對目標(biāo)對象 添加的屬性 添加響應(yīng)式 this.$set(item, 'isEdit', false) })
注意:為什么不使用item.isEdit = false , 因?yàn)閯?dòng)態(tài)添加的屬性不具備響應(yīng)式的特點(diǎn),如果想要具備響應(yīng)式,可以使用$set
2. 點(diǎn)擊行編輯標(biāo)記狀態(tài)(isEdit)
點(diǎn)擊編輯時(shí),將當(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>
點(diǎn)擊編輯的方法
// 點(diǎn)擊編輯行 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)對象, 屬性名稱, 初始值 )
- 等價(jià)于 Vue.set(目標(biāo)對象, 屬性名稱, 初始值)
- 向響應(yīng)式對象中添加一個(gè)屬性,并確保這個(gè)新屬性同樣是響應(yīng)式的,且觸發(fā)視圖更新。
行內(nèi)編輯-數(shù)據(jù)緩存
行內(nèi)編輯需要做數(shù)據(jù)緩存
為什么要做數(shù)據(jù)緩存?
因?yàn)榫庉嫊r(shí),可以取消會(huì)滾到之前的狀態(tài),所以編輯時(shí)的數(shù)據(jù)是臨時(shí)的數(shù)據(jù)。
假設(shè)list
數(shù)組中的name
,state
,description
三個(gè)屬性是用于表格每列展示的數(shù)據(jù),當(dāng)進(jìn)行行內(nèi)編輯時(shí)需要將這3個(gè)屬性進(jìn)行緩存,因?yàn)榫庉嫷臄?shù)據(jù)是臨時(shí)的
如圖,editRow的數(shù)據(jù)是針對當(dāng)前行的數(shù)據(jù)做了一份拷貝,針對這個(gè)拷貝,我們可以隨意修改。
1. 初始化時(shí)緩存數(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. 點(diǎn)擊編輯時(shí)更新緩存數(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í)的表單雙向綁定緩存數(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)中要進(jìn)行手動(dòng)判斷
然后將編輯好的數(shù)據(jù)封裝到一個(gè)對象中發(fā)起請求
下方使用Object.assign
方法是因?yàn)榘l(fā)送完請求,數(shù)據(jù)庫數(shù)據(jù)已更新,而前端頁面也需要更新
<el-button type="primary" size="mini" @click="btnEditOK(row)">確定</el-button> // 點(diǎn)擊確定時(shí)觸發(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的一校驗(yàn) 誤判 // 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實(shí)現(xiàn)多行行內(nèi)表格編輯的文章就介紹到這了,更多相關(guān)vue2+element-ui多行行內(nèi)表格編輯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue中對象數(shù)組改變其對象內(nèi)容值數(shù)組沒變化的原因與解決方案
最近開發(fā)遇到一個(gè)問題,修改對象某一個(gè)索引對象時(shí),直接將對象賦值給數(shù)組的某一索引對象,該數(shù)組沒變化,在 Vue 中,直接修改對象數(shù)組中某個(gè)對象的屬性值時(shí),數(shù)組的引用本身未改變,本文介紹了詳細(xì)的原理分析和解決方案,需要的朋友可以參考下2025-03-03vue3引入uview-plus3.0移動(dòng)組件庫的流程
這篇文章主要介紹了vue3引入uview-plus3.0移動(dòng)組件庫的流程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06vue項(xiàng)目使用luckyexcel預(yù)覽excel表格功能(心路歷程)
這篇文章主要介紹了vue項(xiàng)目使用luckyexcel預(yù)覽excel表格,我總共嘗試了2種方法預(yù)覽excel,均可實(shí)現(xiàn),還發(fā)現(xiàn)一種方法可以實(shí)現(xiàn),需要后端配合,叫做KKfileview,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10VUE3+mqtt封裝解決多頁面使用需重復(fù)連接等問題(附實(shí)例)
最近了解到mqtt這樣一個(gè)協(xié)議,可以在web上達(dá)到即時(shí)通訊的效果,下面這篇文章主要給大家介紹了關(guān)于VUE3+mqtt封裝解決多頁面使用需重復(fù)連接等問題的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04vue項(xiàng)目打包自動(dòng)更新版本號(hào)且自動(dòng)刷新緩存的方法示例
這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目打包自動(dòng)更新版本號(hào)且自動(dòng)刷新緩存的相關(guān)資料,文中通過代碼及圖文介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用vue具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-11-11Vue+scss白天和夜間模式切換功能的實(shí)現(xiàn)方法
這篇文章主要介紹了Vue+scss白天和夜間模式切換功能的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01VUE2響應(yīng)式原理使用Object.defineProperty缺點(diǎn)
這篇文章主要為大家介紹了VUE2響應(yīng)式原理使用Object.defineProperty缺點(diǎn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-085分鐘學(xué)會(huì)Vue動(dòng)畫效果(小結(jié))
這篇文章主要介紹了5分鐘學(xué)會(huì)Vue動(dòng)畫效果(小結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07