Commit 86a49e4b8e35e8a7ee2d17a1d14a4dd72f871cac

Authored by Aaron
1 parent 6ea31861
Exists in master and in 1 other branch legacy

优化新式表格编辑事件

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 }) {