mirror of https://github.com/ElemeFE/element
Table: fix reserve-selection not work (#16135)
* Table: fix reserve-selection not work * fixpull/16221/head
parent
ac00b28c74
commit
6dd3f632a0
|
@ -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();
|
||||
|
||||
|
|
|
@ -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() {
|
||||
|
|
Loading…
Reference in New Issue