diff --git a/uniapp/youjiala/src/components/admin-list/admin-list.vue b/uniapp/youjiala/src/components/admin-list/admin-list.vue index fe5753e..f3445df 100644 --- a/uniapp/youjiala/src/components/admin-list/admin-list.vue +++ b/uniapp/youjiala/src/components/admin-list/admin-list.vue @@ -110,8 +110,13 @@ const selectedRows = computed(() => selectedKeys.value.map(key => selectedPool.value[key]).filter(Boolean), ); +// 全选态只看"当前可见行是否都被勾选",不能用 selectedRows.length 对比 rows.length: +// 选择器页开启 keepSelectionOnReload 后,selectedRows 会含被搜索过滤掉的已选行, +// 两个集合数量碰巧相等会误判成全选,用户点一下全选反而把跨搜索的已选整组清空。 const allSelected = computed( - () => rows.value.length > 0 && selectedRows.value.length === rows.value.length, + () => + rows.value.length > 0 && + rows.value.every(row => selectedKeys.value.includes(keyOf(row))), ); function clearSelection(): void { @@ -139,17 +144,25 @@ function toggleSelect(row: AdminRow): void { } function toggleSelectAll(): void { - if (allSelected.value) { - clearSelection(); - return; - } - selectedKeys.value = rows.value.map(row => keyOf(row)); + // 全选/取消全选只作用于"当前可见行",保留此前跨搜索/跨页已选的其他行; + // keys 与 pool 必须同步增删,否则 pool 会残留 keys 里已不存在的孤儿行对象。 + const visible = rows.value.map(row => keyOf(row)); const pool = { ...selectedPool.value }; - for (const row of rows.value) { - pool[keyOf(row)] = row; + if (allSelected.value) { + const drop = new Set(visible); + selectedKeys.value = selectedKeys.value.filter(key => !drop.has(key)); + for (const key of visible) { + delete pool[key]; + } + } + else { + for (const row of rows.value) { + pool[keyOf(row)] = row; + } + selectedKeys.value = [...new Set([...selectedKeys.value, ...visible])]; } selectedPool.value = pool; - emit("selection-change", selectedKeys.value.map(key => pool[key]).filter(Boolean)); + emit("selection-change", selectedRows.value); } function onLongPress(row: AdminRow): void { diff --git a/uniapp/youjiala/src/pages/security/actor-enquiry.vue b/uniapp/youjiala/src/pages/security/actor-enquiry.vue index 3f4aed4..b8e1d24 100644 --- a/uniapp/youjiala/src/pages/security/actor-enquiry.vue +++ b/uniapp/youjiala/src/pages/security/actor-enquiry.vue @@ -135,7 +135,7 @@ useAuthGuard(() => {