From 6dd3f632a0cc0f0c678e1071563eb7ac13fb39c6 Mon Sep 17 00:00:00 2001 From: hetech Date: Tue, 25 Jun 2019 16:57:30 +0800 Subject: [PATCH] Table: fix reserve-selection not work (#16135) * Table: fix reserve-selection not work * fix --- packages/table/src/store/index.js | 8 +++---- packages/table/src/store/watcher.js | 36 +++++++++++------------------ 2 files changed, 17 insertions(+), 27 deletions(-) diff --git a/packages/table/src/store/index.js b/packages/table/src/store/index.js index 97716a344..7c55d1f87 100644 --- a/packages/table/src/store/index.js +++ b/packages/table/src/store/index.js @@ -12,15 +12,15 @@ Watcher.prototype.mutations = { // 没有使用 computed,而是手动更新部分数据 https://github.com/vuejs/vue/issues/6660#issuecomment-331417140 this.updateCurrentRow(); this.updateExpandRows(); - if (!states.reserveSelection) { + if (states.reserveSelection) { + this.assertRowKey(); + this.updateSelectionByRowKey(); + } else { if (dataInstanceChanged) { this.clearSelection(); } else { this.cleanSelection(); } - } else { - this.assertRowKey(); - this.updateSelectionByRowKey(); } this.updateAllSelected(); diff --git a/packages/table/src/store/watcher.js b/packages/table/src/store/watcher.js index 396defe7d..8ea37e6f6 100644 --- a/packages/table/src/store/watcher.js +++ b/packages/table/src/store/watcher.js @@ -127,18 +127,15 @@ export default Vue.extend({ const states = this.states; states.isAllSelected = false; const oldSelection = states.selection; - if (states.selection.length) { + if (oldSelection.length) { states.selection = []; - } - if (oldSelection.length > 0) { - this.table.$emit('selection-change', states.selection ? states.selection.slice() : []); + this.table.$emit('selection-change', []); } }, cleanSelection() { - const selection = this.states.selection || []; - const data = this.states.data; - const rowKey = this.states.rowKey; + const states = this.states; + const { data, rowKey, selection } = states; let deleted; if (rowKey) { deleted = []; @@ -150,24 +147,19 @@ export default Vue.extend({ } } } else { - deleted = selection.filter((item) => { - return data.indexOf(item) === -1; - }); + deleted = selection.filter(item => data.indexOf(item) === -1); } - - deleted.forEach((deletedItem) => { - selection.splice(selection.indexOf(deletedItem), 1); - }); - if (deleted.length) { - this.table.$emit('selection-change', selection ? selection.slice() : []); + const newSelection = selection.filter(item => deleted.indexOf(item) === -1); + states.selection = newSelection; + this.table.$emit('selection-change', newSelection.slice()); } }, toggleRowSelection(row, selected, emitChange = true) { const changed = toggleRowStatus(this.states.selection, row, selected); if (changed) { - const newSelection = this.states.selection ? this.states.selection.slice() : []; + const newSelection = (this.states.selection || []).slice(); // 调用 API 修改选中值,不触发 select 事件 if (emitChange) { this.table.$emit('select', newSelection, row); @@ -207,17 +199,15 @@ export default Vue.extend({ updateSelectionByRowKey() { const states = this.states; - const { selection, rowKey, data = [] } = states; + const { selection, rowKey, data } = states; const selectedMap = getKeysMap(selection, rowKey); - // TODO:这里的代码可以优化 - states.selection = data.reduce((prev, row) => { + data.forEach(row => { const rowId = getRowIdentity(row, rowKey); const rowInfo = selectedMap[rowId]; if (rowInfo) { - prev.push(row); + selection[rowInfo.index] = row; } - return prev; - }, []); + }); }, updateAllSelected() {