Compare commits

...

1 Commits

Author SHA1 Message Date
zhaojisen
3e009c17fd fixed: Fixed an issue where multiple selections across pages could not be reversed 2024-12-04 15:14:44 +08:00

View File

@@ -34,12 +34,14 @@ class StrategyNormal extends StrategyAbstract {
onSelectionChange(val) { onSelectionChange(val) {
this.elDataTable.selected = val this.elDataTable.selected = val
} }
/** /**
* toggleRowSelection和clearSelection的表现与el-table一致 * toggleRowSelection和clearSelection的表现与el-table一致
*/ */
toggleRowSelection(...args) { toggleRowSelection(...args) {
return this.elTable.toggleRowSelection(...args) return this.elTable.toggleRowSelection(...args)
} }
clearSelection() { clearSelection() {
return this.elTable.clearSelection() return this.elTable.clearSelection()
} }
@@ -50,12 +52,12 @@ class StrategyNormal extends StrategyAbstract {
*/ */
class StrategyPersistSelection extends StrategyAbstract { class StrategyPersistSelection extends StrategyAbstract {
/** /**
* el-tableselection-change事件不适用于开启跨页保存的情况。 * el-tableselection-change 事件不适用于开启跨页保存的情况。
* 比如当开启persistSelection时发生以下两个场景 * 比如,当开启 persistSelection时发生以下两个场景
* 1. 用户点击翻页 * 1. 用户点击翻页
* 2. 用户点击行首的切换全选项按钮,清空当前页多选项数据 * 2. 用户点击行首的切换全选项按钮,清空当前页多选项数据
* 其中场景1应该保持selected不变而场景2只应该从selected移除当前页所有行保留其他页面的多选状态。 * 其中场景 1 应该保持 selected 不变;而场景 2 只应该从 selected 移除当前页所有行,保留其他页面的多选状态。
* 但el-tableselection-change事件在两个场景中无差别发生所以这里不处理这个事件 * 但 el-tableselection-change 事件在两个场景中无差别发生,所以这里不处理这个事件
*/ */
/** /**
@@ -63,13 +65,19 @@ class StrategyPersistSelection extends StrategyAbstract {
*/ */
onSelect(selection, row) { onSelect(selection, row) {
const isChosen = selection.indexOf(row) > -1 const isChosen = selection.indexOf(row) > -1
this.toggleRowSelection(row, isChosen) this.toggleRowSelection(row, isChosen)
} }
/** /**
* 用户切换当前页的多选 * 用户切换当前页的多选
*/ */
onSelectAll(selection, selectable = () => true) { onSelectAll(selection, selectable = () => true) {
const isSelected = !!selection.length // 获取当前所有已选择的项
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 => { this.elDataTable.data.forEach(r => {
if (selectable(r)) { if (selectable(r)) {
this.toggleRowSelection(r, isSelected) this.toggleRowSelection(r, isSelected)
@@ -83,33 +91,42 @@ class StrategyPersistSelection extends StrategyAbstract {
toggleRowSelection(row, isSelected) { toggleRowSelection(row, isSelected) {
const { id, selected } = this.elDataTable const { id, selected } = this.elDataTable
const foundIndex = selected.findIndex(r => r[id] === row[id]) const foundIndex = selected.findIndex(r => r[id] === row[id])
if (typeof isSelected === 'undefined') { if (typeof isSelected === 'undefined') {
isSelected = foundIndex <= -1 isSelected = foundIndex <= -1
} }
if (isSelected && foundIndex === -1) { if (isSelected && foundIndex === -1) {
selected.push(row) selected.push(row)
} else if (!isSelected && foundIndex > -1) { } else if (!isSelected && foundIndex > -1) {
selected.splice(foundIndex, 1) selected.splice(foundIndex, 1)
} }
this.elDataTable.$emit('toggle-row-selection', isSelected, row) this.elDataTable.$emit('toggle-row-selection', isSelected, row)
this.updateElTableSelection() this.updateElTableSelection()
} }
clearSelection() { clearSelection() {
this.elDataTable.selected = [] this.elDataTable.selected = []
this.updateElTableSelection() this.updateElTableSelection()
} }
/** /**
* 将selected状态同步到el-table中 * 将selected状态同步到el-table中
*/ */
updateElTableSelection() { updateElTableSelection() {
const { data, id, selected } = this.elDataTable const { data, id, selected } = this.elDataTable
// 历史勾选的行已经不在当前页了所以要将当前页的行数据和selected合并 // 历史勾选的行已经不在当前页了所以要将当前页的行数据和selected合并
const mergeData = _.uniqWith([...data, ...selected], _.isEqual) const mergeData = _.uniqWith([...data, ...selected], _.isEqual)
mergeData.forEach(r => { mergeData.forEach(r => {
const isSelected = !!selected.find(r2 => r[id] === r2[id]) const isSelected = !!selected.find(r2 => r[id] === r2[id])
if (!this.elTable) { if (!this.elTable) {
return return
} }
this.elTable.toggleRowSelection(r, isSelected) this.elTable.toggleRowSelection(r, isSelected)
}) })
} }