fixed: Fixed an issue where all select a large number of data cards died

This commit is contained in:
zhaojisen
2024-12-04 16:57:53 +08:00
committed by ZhaoJiSen
parent d4e37e9418
commit 7b862ee0e1
2 changed files with 30 additions and 6 deletions

View File

@@ -14,7 +14,7 @@
@select="selectStrategy.onSelect"
v-on="$listeners"
@selection-change="selectStrategy.onSelectionChange"
@select-all="selectStrategy.onSelectAll($event, canSelect)"
@select-all="handleSelectAll($event, canSelect)"
@sort-change="onSortChange"
>
<!--TODO 不用jsx写, 感觉template逻辑有点不清晰了-->
@@ -1106,6 +1106,12 @@ export default {
this.page = val
this.getList()
},
handleSelectAll(e, canSelect) {
this.loading = true
this.selectStrategy.onSelectAll(e, canSelect, () => {
this.loading = false
})
},
/**
* 切换某一行的选中状态,如果使用了第二个参数,则是设置这一行选中与否
*

View File

@@ -71,22 +71,40 @@ class StrategyPersistSelection extends StrategyAbstract {
/**
* 用户切换当前页的多选
*/
onSelectAll(selection, selectable = () => true) {
onSelectAll(selection, selectable = () => true, callback) {
const { id, selected, data } = this.elDataTable
const selectedIds = new Set(selected.map(r => r[id]))
// 获取当前所有已选择的项
const selectedRows = this.elDataTable.data.filter(r => selection.includes(r))
// 判断是否已全选
const isSelected = this.elDataTable.data.every(r => selectable(r) && selectedRows.includes(r))
this.elDataTable.data.forEach(r => {
data.forEach(r => {
if (selectable(r)) {
this.toggleRowSelection(r, isSelected)
const isRowSelected = selectedIds.has(r[id])
if (isSelected && !isRowSelected) {
selected.push(r)
this.elDataTable.toggleRowSelection(r, true)
} 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)
}
}
}
})
callback()
}
/**
* toggleRowSelectionclearSelection管理elDataTableselected数组
* 记得最后要将状态同步到el-table中
* toggleRowSelectionclearSelection 管理 elDataTableselected 数组
* 记得最后要将状态同步到 el-table
*/
toggleRowSelection(row, isSelected) {
const { id, selected } = this.elDataTable