Commit 86a49e4b8e35e8a7ee2d17a1d14a4dd72f871cac
1 parent
6ea31861
Exists in
master
and in
1 other branch
优化新式表格编辑事件
Showing
2 changed files
with
73 additions
and
36 deletions
Show diff stats
examples/views/page/other.vue
| @@ -13,8 +13,9 @@ | @@ -13,8 +13,9 @@ | ||
| 13 | <template> | 13 | <template> |
| 14 | <div> | 14 | <div> |
| 15 | <pre>{{ tableData }}</pre> | 15 | <pre>{{ tableData }}</pre> |
| 16 | - <eg-table v-model="tableData" :list="option.list" :tableProps="{ border: true }" editable @cell-edit="onCellEdit"> | ||
| 17 | - <el-table-column type="selection"></el-table-column> | 16 | + <eg-table v-model="tableData" :list="option.list" :tableProps="{ border: true }" editable |
| 17 | + @cell-edit="onCellEdit" @row-new="onRowNew" @row-edit="onRowEdit" @row-delete="onRowDelete" | ||
| 18 | + > | ||
| 18 | <template #value-location-locationMin="{ value }"> | 19 | <template #value-location-locationMin="{ value }"> |
| 19 | <el-tag v-if="value" size="mini" disable-transitions>{{ value }}</el-tag> | 20 | <el-tag v-if="value" size="mini" disable-transitions>{{ value }}</el-tag> |
| 20 | </template> | 21 | </template> |
| @@ -161,8 +162,17 @@ export default { | @@ -161,8 +162,17 @@ export default { | ||
| 161 | handleGetValue() { | 162 | handleGetValue() { |
| 162 | this.$refs.form.validate(); | 163 | this.$refs.form.validate(); |
| 163 | }, | 164 | }, |
| 164 | - onCellEdit(e) { | ||
| 165 | - console.log(e) | 165 | + onCellEdit(data) { |
| 166 | + console.log('cell-edit', data); | ||
| 167 | + }, | ||
| 168 | + onRowNew(data) { | ||
| 169 | + console.log('row-new', data); | ||
| 170 | + }, | ||
| 171 | + onRowEdit(data) { | ||
| 172 | + console.log('row-edit', data); | ||
| 173 | + }, | ||
| 174 | + onRowDelete(data) { | ||
| 175 | + console.log('row-delete', data); | ||
| 166 | } | 176 | } |
| 167 | } | 177 | } |
| 168 | } | 178 | } |
examples/views/page/table-new/index.vue
| @@ -7,14 +7,16 @@ | @@ -7,14 +7,16 @@ | ||
| 7 | <template> | 7 | <template> |
| 8 | <div @keyup.enter="tableEditCell = {}"> | 8 | <div @keyup.enter="tableEditCell = {}"> |
| 9 | <div style="padding-bottom: 10px;"> | 9 | <div style="padding-bottom: 10px;"> |
| 10 | - <el-button @click="handleNew" size="mini">新增</el-button> | 10 | + <el-button @click="handleNew" size="mini" v-if="!rowEdit">新增</el-button> |
| 11 | <el-button @click="handleEdit" size="mini" v-if="!rowEditable && tableSelection.length > 0">编辑</el-button> | 11 | <el-button @click="handleEdit" size="mini" v-if="!rowEditable && tableSelection.length > 0">编辑</el-button> |
| 12 | <el-button @click="handleSave" size="mini" type="primary" v-if="rowEditable">完成</el-button> | 12 | <el-button @click="handleSave" size="mini" type="primary" v-if="rowEditable">完成</el-button> |
| 13 | - <el-button @click="handleCancel" size="mini" type="plain" v-if="rowNew">取消</el-button> | 13 | + <el-button @click="handleCancel" size="mini" type="plain" v-if="rowNew && !rowEdit">取消</el-button> |
| 14 | + <el-button @click="handleDelete" size="mini" type="danger" v-if="tableSelection.length > 0">删除</el-button> | ||
| 14 | </div> | 15 | </div> |
| 15 | <el-table class="eagle-table" ref="table" :data="tableData" v-bind="{ size: 'small', ...tableProps }" | 16 | <el-table class="eagle-table" ref="table" :data="tableData" v-bind="{ size: 'small', ...tableProps }" |
| 16 | v-on="tableEvents" @cell-dblclick="onCellDblclick" @selection-change="onSelectionChange" | 17 | v-on="tableEvents" @cell-dblclick="onCellDblclick" @selection-change="onSelectionChange" |
| 17 | > | 18 | > |
| 19 | + <el-table-column type="selection" :selectable="r => rowNew ? r.$new : true"></el-table-column> | ||
| 18 | <!-- 默认表格插槽 --> | 20 | <!-- 默认表格插槽 --> |
| 19 | <slot name="default"></slot> | 21 | <slot name="default"></slot> |
| 20 | <!-- 根据配置列表生成表格列 --> | 22 | <!-- 根据配置列表生成表格列 --> |
| @@ -57,6 +59,17 @@ | @@ -57,6 +59,17 @@ | ||
| 57 | import { cloneDeep, get, set } from '../form-new/util'; | 59 | import { cloneDeep, get, set } from '../form-new/util'; |
| 58 | import CellEditable from './cell-editable'; | 60 | import CellEditable from './cell-editable'; |
| 59 | 61 | ||
| 62 | +const listHasKey = (list, name) => { | ||
| 63 | + let result = false; | ||
| 64 | + for (const row of list) { | ||
| 65 | + if (row[name]) { | ||
| 66 | + result = true; | ||
| 67 | + break; | ||
| 68 | + } | ||
| 69 | + } | ||
| 70 | + return result; | ||
| 71 | +} | ||
| 72 | + | ||
| 60 | export default { | 73 | export default { |
| 61 | name: 'TableNew', | 74 | name: 'TableNew', |
| 62 | components: { CellEditable }, | 75 | components: { CellEditable }, |
| @@ -92,37 +105,27 @@ export default { | @@ -92,37 +105,27 @@ export default { | ||
| 92 | computed: { | 105 | computed: { |
| 93 | // 表格实体 | 106 | // 表格实体 |
| 94 | instance: { | 107 | instance: { |
| 95 | - get() { | ||
| 96 | - return this.$refs.table; | ||
| 97 | - } | 108 | + get() { return this.$refs.table; } |
| 98 | }, | 109 | }, |
| 99 | // 行编辑状态 | 110 | // 行编辑状态 |
| 100 | rowEditable() { | 111 | rowEditable() { |
| 101 | - let result = false; | ||
| 102 | - for (const row of this.tableData) { | ||
| 103 | - if (row.$editable) { | ||
| 104 | - result = true; | ||
| 105 | - break; | ||
| 106 | - } | ||
| 107 | - } | ||
| 108 | - return result; | 112 | + return listHasKey(this.tableData, '$editable'); |
| 109 | }, | 113 | }, |
| 110 | // 存在新行 | 114 | // 存在新行 |
| 111 | rowNew() { | 115 | rowNew() { |
| 112 | - let result = false; | ||
| 113 | - for (const row of this.tableData) { | ||
| 114 | - if (row.$new) { | ||
| 115 | - result = true; | ||
| 116 | - break; | ||
| 117 | - } | ||
| 118 | - } | ||
| 119 | - return result; | 116 | + return listHasKey(this.tableData, '$new'); |
| 117 | + }, | ||
| 118 | + // 存在编辑行 | ||
| 119 | + rowEdit() { | ||
| 120 | + return listHasKey(this.tableData, '$edit'); | ||
| 120 | } | 121 | } |
| 121 | }, | 122 | }, |
| 122 | watch: { | 123 | watch: { |
| 123 | value: { | 124 | value: { |
| 124 | handler(val = []) { | 125 | handler(val = []) { |
| 125 | - this.tableData = val.map((o, i) => ({ ...o, $index: i })); | 126 | + this.tableData = val.map((o, i) => { |
| 127 | + return { ...o, $index: i, $editable: undefined, $new: undefined }; | ||
| 128 | + }); | ||
| 126 | }, | 129 | }, |
| 127 | immediate: true | 130 | immediate: true |
| 128 | }, | 131 | }, |
| @@ -171,41 +174,65 @@ export default { | @@ -171,41 +174,65 @@ export default { | ||
| 171 | }, | 174 | }, |
| 172 | methods: { | 175 | methods: { |
| 173 | $_get: get, | 176 | $_get: get, |
| 177 | + // 处理新增逻辑 | ||
| 174 | handleNew() { | 178 | handleNew() { |
| 175 | const tableData = cloneDeep(this.tableData); | 179 | const tableData = cloneDeep(this.tableData); |
| 176 | tableData.push({ ...this.tableRowTemplate, $new: true }); | 180 | tableData.push({ ...this.tableRowTemplate, $new: true }); |
| 177 | this.tableEditCell = {}; | 181 | this.tableEditCell = {}; |
| 178 | - this.emitTableData(tableData); | 182 | + this.tableData = tableData.map((o, i) => ({ ...o, $index: i })); |
| 179 | }, | 183 | }, |
| 184 | + // 处理编辑逻辑 | ||
| 180 | handleEdit() { | 185 | handleEdit() { |
| 181 | const tableData = cloneDeep(this.tableData); | 186 | const tableData = cloneDeep(this.tableData); |
| 182 | const selectionIndexArr = this.tableSelection.map(i => i.$index); | 187 | const selectionIndexArr = this.tableSelection.map(i => i.$index); |
| 183 | tableData.forEach((r, i) => { | 188 | tableData.forEach((r, i) => { |
| 184 | if (selectionIndexArr.includes(r.$index)) { | 189 | if (selectionIndexArr.includes(r.$index)) { |
| 185 | tableData[i].$editable = true; | 190 | tableData[i].$editable = true; |
| 191 | + tableData[i].$edit = true; | ||
| 192 | + tableData[i].$new = true; | ||
| 186 | } | 193 | } |
| 187 | }); | 194 | }); |
| 188 | this.tableEditCell = {}; | 195 | this.tableEditCell = {}; |
| 189 | - this.emitTableData(tableData); | 196 | + this.tableData = tableData.map((o, i) => ({ ...o, $index: i })); |
| 190 | }, | 197 | }, |
| 198 | + // 处理保存逻辑 | ||
| 191 | handleSave() { | 199 | handleSave() { |
| 192 | const tableData = cloneDeep(this.tableData); | 200 | const tableData = cloneDeep(this.tableData); |
| 193 | tableData.forEach((r, i) => { | 201 | tableData.forEach((r, i) => { |
| 194 | delete tableData[i].$editable; | 202 | delete tableData[i].$editable; |
| 195 | - delete tableData[i].$new; | ||
| 196 | }); | 203 | }); |
| 197 | this.tableEditCell = {}; | 204 | this.tableEditCell = {}; |
| 198 | - this.emitTableData(tableData); | 205 | + this.tableData = tableData.map((o, i) => ({ ...o, $index: i })); |
| 206 | + this.$nextTick(() => { | ||
| 207 | + this.emitTableData(this.tableData); | ||
| 208 | + this.$emit(this.rowEdit ? 'row-edit' : 'row-new', this.tableData.filter(d => d.$new).map(d => { | ||
| 209 | + delete d.$new; | ||
| 210 | + return d; | ||
| 211 | + })); | ||
| 212 | + }); | ||
| 199 | }, | 213 | }, |
| 214 | + // 处理取消逻辑 | ||
| 200 | handleCancel() { | 215 | handleCancel() { |
| 201 | let tableData = cloneDeep(this.tableData); | 216 | let tableData = cloneDeep(this.tableData); |
| 202 | tableData = tableData.filter(row => !row.$new); | 217 | tableData = tableData.filter(row => !row.$new); |
| 203 | this.emitTableData(tableData); | 218 | this.emitTableData(tableData); |
| 204 | }, | 219 | }, |
| 220 | + // 处理删除逻辑 | ||
| 221 | + handleDelete() { | ||
| 222 | + const tableData = cloneDeep(this.tableData); | ||
| 223 | + const selectionIndexArr = this.tableSelection.map(i => i.$index); | ||
| 224 | + if (!this.rowNew && !this.rowEdit) { | ||
| 225 | + this.$emit('row-delete', this.tableSelection); | ||
| 226 | + } | ||
| 227 | + this.tableEditCell = {}; | ||
| 228 | + this.tableData = tableData.filter((d, i) => !selectionIndexArr.includes(i)).map((o, i) => ({ ...o, $index: i })); | ||
| 229 | + }, | ||
| 205 | // 更新表格数据 | 230 | // 更新表格数据 |
| 206 | emitTableData(tableData) { | 231 | emitTableData(tableData) { |
| 207 | if (this.$listeners['input']) { | 232 | if (this.$listeners['input']) { |
| 208 | - this.$emit('input', tableData); | 233 | + this.$emit('input', tableData.map((o, i) => { |
| 234 | + return { ...o, $index: i, $editable: undefined, $new: undefined, $edit: undefined }; | ||
| 235 | + })); | ||
| 209 | } else { | 236 | } else { |
| 210 | this.tableData = tableData; | 237 | this.tableData = tableData; |
| 211 | } | 238 | } |
| @@ -224,7 +251,7 @@ export default { | @@ -224,7 +251,7 @@ export default { | ||
| 224 | }, | 251 | }, |
| 225 | // 双击单元格 | 252 | // 双击单元格 |
| 226 | onCellDblclick(row, column, cell, event) { | 253 | onCellDblclick(row, column, cell, event) { |
| 227 | - if (this.editable) { | 254 | + if (this.editable && !this.rowNew) { |
| 228 | this.tableEditCell = { index: row.$index, key: column.property }; | 255 | this.tableEditCell = { index: row.$index, key: column.property }; |
| 229 | } | 256 | } |
| 230 | }, | 257 | }, |
| @@ -237,15 +264,15 @@ export default { | @@ -237,15 +264,15 @@ export default { | ||
| 237 | this.tableEditCell = {}; | 264 | this.tableEditCell = {}; |
| 238 | if (this.$listeners['cell-edit']) { | 265 | if (this.$listeners['cell-edit']) { |
| 239 | const { tableData } = this.setCellValue({ value, row, key, fullKey }); | 266 | const { tableData } = this.setCellValue({ value, row, key, fullKey }); |
| 240 | - if (this.$listeners['input']) { | ||
| 241 | - this.$emit('input', tableData); | ||
| 242 | - } | 267 | + this.emitTableData(tableData); |
| 243 | this.$emit('cell-edit', { row, key, fullKey, value }); | 268 | this.$emit('cell-edit', { row, key, fullKey, value }); |
| 244 | } | 269 | } |
| 245 | }, | 270 | }, |
| 246 | // 表格取消编辑 | 271 | // 表格取消编辑 |
| 247 | onCellUpdateCancel({ oldValue, value, row, key, fullKey }) { | 272 | onCellUpdateCancel({ oldValue, value, row, key, fullKey }) { |
| 248 | - this.setCellValue({ value: oldValue, row, key, fullKey }); | 273 | + if (row.$new !== true) { |
| 274 | + this.setCellValue({ value: oldValue, row, key, fullKey }); | ||
| 275 | + } | ||
| 249 | }, | 276 | }, |
| 250 | // 设置表格值 | 277 | // 设置表格值 |
| 251 | setCellValue({ value, row, key, fullKey }) { | 278 | setCellValue({ value, row, key, fullKey }) { |