From 548d0e0670a77da4e4085fb46d5cce7088b44492 Mon Sep 17 00:00:00 2001 From: zhaojisen <1301338853@qq.com> Date: Thu, 5 Dec 2024 12:37:04 +0800 Subject: [PATCH] =?UTF-8?q?perf=EF=BC=9AOptimize=20the=20execution=20effic?= =?UTF-8?q?iency=20of=20all=20and=20reverse=20selection?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../el-data-table/utils/select-strategy.js | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/src/components/Table/DataTable/compenents/el-data-table/utils/select-strategy.js b/src/components/Table/DataTable/compenents/el-data-table/utils/select-strategy.js index d580c599e..06e627537 100644 --- a/src/components/Table/DataTable/compenents/el-data-table/utils/select-strategy.js +++ b/src/components/Table/DataTable/compenents/el-data-table/utils/select-strategy.js @@ -6,6 +6,8 @@ * 多选策略接口 */ class StrategyAbstract { + cachedSelectedData = [] + constructor(elDataTable) { this.elDataTable = elDataTable // 绑定this后可直接在template中使用 @@ -77,29 +79,51 @@ class StrategyPersistSelection extends StrategyAbstract { const selectedIds = new Set(selected.map(r => r[id])) // 获取当前所有已选择的项 - const selectedRows = this.elDataTable.data.filter(r => selection.includes(r)) + const selectedRows = data.filter(r => selection.includes(r)) // 判断是否已全选 - const isSelected = this.elDataTable.data.every(r => selectable(r) && selectedRows.includes(r)) + const isSelected = data.every(r => selectable(r) && selectedRows.includes(r)) + + const rowsToSelect = [] + const rowsToDeselect = [] data.forEach(r => { if (selectable(r)) { const isRowSelected = selectedIds.has(r[id]) if (isSelected && !isRowSelected) { - selected.push(r) - this.elDataTable.toggleRowSelection(r, true) + rowsToSelect.push(r) } else if (!isSelected && isRowSelected) { - const index = selected.findIndex(item => item[id] === r[id]) - - if (index !== -1) { - selected.splice(index, 1) - this.elDataTable.toggleRowSelection(r, false) - } + rowsToDeselect.push(r) } } }) + if (isSelected) { + rowsToSelect.forEach(row => { + selected.push(row) + selectedIds.add(row[id]) + }) + rowsToDeselect.forEach(row => { + this.elDataTable.toggleRowSelection(row, true) + }) + } else { + rowsToDeselect.forEach(row => { + const index = selected.findIndex(item => item[id] === row[id]) + if (index !== -1) { + selected.splice(index, 1) + } + selectedIds.delete(row[id]) + }) + rowsToSelect.forEach(row => { + this.elDataTable.toggleRowSelection(row, false) + }) + } + + // this.elTable.selected = Array.from(selectedIds).map(id => { + // return data.find(r => r[id] === id) + // }) + callback() } /**