基于Vue?+?ElementUI實(shí)現(xiàn)可編輯表格及校驗(yàn)
效果
實(shí)現(xiàn)思路
使用兩個(gè)表單分別用于實(shí)現(xiàn)修改和新增處理。
通過一個(gè)
editIndex
變量判斷是否是編輯狀態(tài)來決定是否展示輸入框,當(dāng)點(diǎn)擊指定行的修改后進(jìn)行設(shè)置即可:
<el-table-column v-for="(column, index) in columns" :key="index" :label="column.label" :prop="column.prop" align="center"> <template #default="{ row, $index }"> <div v-if="$index === editIndex" class="validate-info"> <el-form-item :prop="column.prop"> <el-input v-model="editRow[column.prop]"/> </el-form-item> </div> <span v-else> <span>{{ row[column.prop] }}</span> </span> </template> </el-table-column>
edit(row, index) { if (this.editIndex > -1) { this.$message.warning('請(qǐng)先完成修改中的行') return } this.editRow = {...row} this.editIndex = index }
- 通過隱藏表頭實(shí)現(xiàn)新增表格和修改表格的合并,同時(shí)表格數(shù)據(jù)只有
addRow
:
<el-table :data="[addRow]" :show-header="false"> ... </el-table>
實(shí)現(xiàn)細(xì)節(jié)講解
- 當(dāng)無數(shù)據(jù)時(shí)只展示新增行:
通過設(shè)置以下樣式即可:
/deep/ .el-table__empty-block { display: none; }
- 新增或者修改數(shù)據(jù)行時(shí)增加行高用于顯示校驗(yàn)信息:
行高通過以下樣式進(jìn)行控制,不處于新增或者修改狀態(tài)時(shí)設(shè)置為 0 即可:
.add-table /deep/ .el-form-item { margin: 18px 0; }
為了在修改時(shí)只設(shè)置修改行的行高,只需要只對(duì)輸入框綁定樣式即可:
<div v-if="$index === editIndex" class="validate-info"> <el-form-item :prop="column.prop"> <el-input v-model="editRow[column.prop]"/> </el-form-item> </div>
完整代碼
<template> <div class="app"> <el-form ref="editableForm" :model="editRow" :rules="rules" label-width="0" :show-message="true" class="editable-table"> <el-table :data="tableData"> <el-table-column v-for="(column, index) in columns" :key="index" :label="column.label" :prop="column.prop" align="center"> <template #default="{ row, $index }"> <div v-if="$index === editIndex" class="validate-info"> <el-form-item :prop="column.prop"> <el-input v-model="editRow[column.prop]"/> </el-form-item> </div> <span v-else> <span>{{ row[column.prop] }}</span> </span> </template> </el-table-column> <el-table-column label="操作" width="200" align="center"> <template #default="{ row, $index }"> <el-form-item> <template v-if="$index === editIndex"> <el-button type="success" size="mini" plain @click="save">保存</el-button> <el-button type="info" size="mini" plain @click="cancel">取消</el-button> </template> <template v-else> <el-button type="primary" size="mini" plain @click="edit(row, $index)"> 修改 </el-button> <el-popconfirm title="是否確認(rèn)刪除?" @confirm="deleteRow($index)" style="margin-left: 10px;"> <el-button slot="reference" type="danger" size="mini" plain>刪除</el-button> </el-popconfirm> </template> </el-form-item> </template> </el-table-column> </el-table> </el-form> <el-form ref="addForm" :model="addRow" :rules="rules" label-width="0" :show-message="true" class="add-table"> <el-table :data="[addRow]" :show-header="false"> <el-table-column v-for="(column, index) in columns" :key="index" :label="column.label" :prop="column.prop" align="center"> <template #default="{ row }" class="validate-info"> <div class="validate-info"> <el-form-item :prop="column.prop"> <el-input v-model="addRow[column.prop]"/> </el-form-item> </div> </template> </el-table-column> <el-table-column label="操作" width="200px" align="center"> <template #default="{ row }"> <el-form-item> <el-button type="success" size="mini" plain @click="add(row)">新增</el-button> </el-form-item> </template> </el-table-column> </el-table> </el-form> </div> </template> <script> export default { data() { return { // 表格數(shù)據(jù) tableData: [ { username: '張三', address: '北京' }, { username: '李四', address: '上海' } ], //配置列 columns: [ { label: '用戶名', prop: 'username' }, { label: '地址', prop: 'address' } ], // 規(guī)則 rules: { username: [{required: true, message: '請(qǐng)輸入用戶名', trigger: 'blur'}], address: [{required: true, message: '請(qǐng)輸入地址', trigger: 'blur'}], }, // 當(dāng)前編輯行下標(biāo) editIndex: -1, // 當(dāng)前編輯行 editRow: { username: '', address: '' }, // 新增行 addRow: { username: '', address: '' } } }, methods: { save() { this.$refs.editableForm.validate((valid) => { if (valid) { this.tableData.splice(this.editIndex, 1, { ...this.editRow }) this.editIndex = -1 this.$message.success('修改成功') } return valid }) }, cancel() { this.editIndex = -1 }, edit(row, index) { if (this.editIndex > -1) { this.$message.warning('請(qǐng)先完成修改中的行') return } this.editRow = {...row} this.editIndex = index }, add(row) { if (this.editIndex > -1) { this.$message.warning('請(qǐng)先完成修改中的行') return } this.$refs.addForm.validate((valid) => { if (valid) { this.addRow = {} this.tableData.push({ ... row}) this.$message.success('新增成功') } return valid }) }, deleteRow(index) { this.tableData.splice(index, 1) this.$message.success('刪除成功!'); } } } </script> <style scoped lang="less"> .app { padding: 20px; /deep/ .el-form-item { margin-bottom: 0; } } .validate-info { /deep/ .el-form-item { margin: 18px 0; } } .editable-table { /deep/ .el-table__empty-block { display: none; } } .editable-table, .add-table { width: 60%; margin: 0 auto; } </style>
以上就是基于Vue + ElementUI實(shí)現(xiàn)可編輯表格及校驗(yàn)的詳細(xì)內(nèi)容,更多關(guān)于Vue + ElementUI可編輯表格的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue?運(yùn)行高德地圖官方樣例,設(shè)置class無效的解決
這篇文章主要介紹了Vue?運(yùn)行高德地圖官方樣例,設(shè)置class無效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10Vue3超詳細(xì)的ref()用法教程(看這一篇就夠了!)
這篇文章主要給大家介紹了關(guān)于Vue3超詳細(xì)的ref()用法的相關(guān)資料,在Vue3中ref函數(shù)不僅可以用于在組件中獲取DOM元素或子組件的引用,還可以直接訪問組件元素本身,需要的朋友可以參考下2023-07-07Vue實(shí)現(xiàn)模糊查詢的簡(jiǎn)單方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Vue實(shí)現(xiàn)模糊查詢的簡(jiǎn)單方法,在vue中,前端模糊搜索主要是用computed屬性實(shí)現(xiàn),本文通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-08-08關(guān)于在vscode使用webpack指令顯示"因?yàn)樵诖讼到y(tǒng)中禁止運(yùn)行腳本"問題(完美解決)
這篇文章主要介紹了解決在vscode使用webpack指令顯示"因?yàn)樵诖讼到y(tǒng)中禁止運(yùn)行腳本"問題,本文給大家分享完美解決方法,需要的朋友可以參考下2021-07-07源碼分析Vue.js的監(jiān)聽實(shí)現(xiàn)教程
這篇文章主要通過源碼分析介紹了Vue.js的監(jiān)聽實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-04-04vue+element實(shí)現(xiàn)圖片上傳及裁剪功能
這篇文章主要為大家詳細(xì)介紹了vue+element實(shí)現(xiàn)圖片上傳及裁剪功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06elementUI給el-tabs/el-tab-pane添加圖標(biāo)效果實(shí)例
這篇文章主要給大家介紹了關(guān)于elementUI給el-tabs/el-tab-pane添加圖標(biāo)效果實(shí)例的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用elementUI具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-07-07