Table: fix reserve-selection not work (#16135)

* Table: fix reserve-selection not work

* fix
pull/16221/head
hetech 2019-06-25 16:57:30 +08:00 committed by Zhi Cun
parent ac00b28c74
commit 6dd3f632a0
2 changed files with 17 additions and 27 deletions

View File

@ -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();

View File

@ -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() {