This commit is contained in:
owenchen committed 2026-10-15 16:31:09 +08:00
1 parent f6f3735ab3
commit 95b38a7e4d
34 files changed
+6166 -329

No files matched your search

@@ -63,6 +63,11 @@ const props = defineProps({
* 否则未登录时会先打一发必然 401 的请求,错误弹窗和跳转一起出现。
*/
auto: { type: Boolean, default: false },
/**
* 选择器模式下重新拉第一页(搜索/筛选)时是否保留已勾选:
* true=多选挑选中不清勾选(挑完再搜也不怕丢已选),false=普通列表照旧清。
*/
keepSelectionOnReload: { type: Boolean, default: false },
});
const emit = defineEmits<{
@@ -81,6 +86,8 @@ const paging = ref<any>(null);
const rows = ref<AdminRow[]>([]);
const selectedKeys = ref<string[]>([]);
const selectMode = ref(false);
// 记住被勾选行的完整对象(按 rowKey 存):搜索/翻页后当前 rows 变了也能凭 key 还原已选,供选择器一次性回传
const selectedPool = ref<Record<string, AdminRow>>({});
const keywordModel = computed({
get: () => props.keyword,
@@ -100,7 +107,7 @@ function isSelected(row: AdminRow): boolean {
}
const selectedRows = computed(() =>
rows.value.filter(row => selectedKeys.value.includes(keyOf(row))),
selectedKeys.value.map(key => selectedPool.value[key]).filter(Boolean),
);
const allSelected = computed(
@@ -109,6 +116,7 @@ const allSelected = computed(
function clearSelection(): void {
selectedKeys.value = [];
selectedPool.value = {};
selectMode.value = false;
emit("selection-change", []);
}
@@ -116,12 +124,18 @@ function clearSelection(): void {
function toggleSelect(row: AdminRow): void {
const key = keyOf(row);
const next = selectedKeys.value.filter(item => item !== key);
// filter 后长度没变说明原本没选中,那就加上
const pool = { ...selectedPool.value };
// filter 后长度没变说明原本没选中,那就加上(同时存下行对象)
if (next.length === selectedKeys.value.length) {
next.push(key);
pool[key] = row;
}
else {
delete pool[key];
}
selectedKeys.value = next;
emit("selection-change", rows.value.filter(item => next.includes(keyOf(item))));
selectedPool.value = pool;
emit("selection-change", next.map(item => pool[item]).filter(Boolean));
}
function toggleSelectAll(): void {
@@ -130,7 +144,12 @@ function toggleSelectAll(): void {
return;
}
selectedKeys.value = rows.value.map(row => keyOf(row));
emit("selection-change", [...rows.value]);
const pool = { ...selectedPool.value };
for (const row of rows.value) {
pool[keyOf(row)] = row;
}
selectedPool.value = pool;
emit("selection-change", selectedKeys.value.map(key => pool[key]).filter(Boolean));
}
function onLongPress(row: AdminRow): void {
@@ -144,7 +163,8 @@ function onLongPress(row: AdminRow): void {
async function onQuery(page: number, pageSize: number): Promise<void> {
try {
const result = await props.loader(page, pageSize);
if (page === 1) {
// 回到第 1 页默认清勾选;选择器正在多选时保留,避免"先勾后搜"丢失已选
if (page === 1 && !(selectMode.value && props.keepSelectionOnReload)) {
clearSelection();
}
paging.value?.completeByTotal(result.rows, result.total);