ow
This commit is contained in:
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);
|
||||
|
||||
Reference in new issue
Block a user