基于Vue?+?ElementUI實現可編輯表格及校驗
更新時間:2023年08月02日 08:52:16 作者:莊周de蝴蝶
這篇文章主要給大家介紹了基于Vue?+?ElementUI?實現可編輯表格及校驗,文中有詳細的代碼講解和實現思路,講解的非常詳細,有需要的朋友可以參考下
效果
實現思路
使用兩個表單分別用于實現修改和新增處理。
通過一個
editIndex
變量判斷是否是編輯狀態(tài)來決定是否展示輸入框,當點擊指定行的修改后進行設置即可:
<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('請先完成修改中的行') return } this.editRow = {...row} this.editIndex = index }
- 通過隱藏表頭實現新增表格和修改表格的合并,同時表格數據只有
addRow
:
<el-table :data="[addRow]" :show-header="false"> ... </el-table>
實現細節(jié)講解
- 當無數據時只展示新增行:
通過設置以下樣式即可:
/deep/ .el-table__empty-block { display: none; }
- 新增或者修改數據行時增加行高用于顯示校驗信息:
行高通過以下樣式進行控制,不處于新增或者修改狀態(tài)時設置為 0 即可:
.add-table /deep/ .el-form-item { margin: 18px 0; }
為了在修改時只設置修改行的行高,只需要只對輸入框綁定樣式即可:
<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="是否確認刪除?" @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 { // 表格數據 tableData: [ { username: '張三', address: '北京' }, { username: '李四', address: '上海' } ], //配置列 columns: [ { label: '用戶名', prop: 'username' }, { label: '地址', prop: 'address' } ], // 規(guī)則 rules: { username: [{required: true, message: '請輸入用戶名', trigger: 'blur'}], address: [{required: true, message: '請輸入地址', trigger: 'blur'}], }, // 當前編輯行下標 editIndex: -1, // 當前編輯行 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('請先完成修改中的行') return } this.editRow = {...row} this.editIndex = index }, add(row) { if (this.editIndex > -1) { this.$message.warning('請先完成修改中的行') 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實現可編輯表格及校驗的詳細內容,更多關于Vue + ElementUI可編輯表格的資料請關注腳本之家其它相關文章!
相關文章
關于在vscode使用webpack指令顯示"因為在此系統(tǒng)中禁止運行腳本"問題(完美解決)
這篇文章主要介紹了解決在vscode使用webpack指令顯示"因為在此系統(tǒng)中禁止運行腳本"問題,本文給大家分享完美解決方法,需要的朋友可以參考下2021-07-07elementUI給el-tabs/el-tab-pane添加圖標效果實例
這篇文章主要給大家介紹了關于elementUI給el-tabs/el-tab-pane添加圖標效果實例的相關資料,文中通過實例代碼介紹的非常詳細,對大家學習或者使用elementUI具有一定的參考學習價值,需要的朋友可以參考下2023-07-07