Sfoglia il codice sorgente

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

* Table: fix reserve-selection not work

* fix
hetech 6 anni fa
parent
commit
6dd3f632a0
2 ha cambiato i file con 17 aggiunte e 27 eliminazioni
  1. 4 4
      packages/table/src/store/index.js
  2. 13 23
      packages/table/src/store/watcher.js

+ 4 - 4
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();
 

+ 13 - 23
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() {