Browse Source

fix: 处理viewedKeys由于 FIFO 顺序,显式提供的值可能会被异步存储恢复静默地移除。

pull/7898/head
layhuts 4 months ago
parent
commit
a5f0537cb0
  1. 58
      packages/effects/plugins/src/vxe-table/use-viewed-row.ts

58
packages/effects/plugins/src/vxe-table/use-viewed-row.ts

@ -198,38 +198,44 @@ export function useViewedRow<T = any>(
const persist = useDebounceFn(persistImmediate, 300);
// ========== 从存储恢复 ==========
function restoreFromStorage() {
async function restoreFromStorage(): Promise<void> {
if (!adapter) return;
adapter
.getKeys()
.then((stored) => {
if (stored && stored.length > 0) {
for (const key of stored) {
viewedSet.value.add(key);
}
if (maxSize > 0) {
enforceMaxSize(viewedSet.value, maxSize);
}
triggerRef(viewedSet);
try {
const stored = await adapter
.getKeys();
if (stored && stored.length > 0) {
for (const key of stored) {
viewedSet.value.add(key);
}
})
.catch((error) => {
console.error('[viewedRow] restore failed:', error);
});
if (maxSize > 0) {
enforceMaxSize(viewedSet.value, maxSize);
}
triggerRef(viewedSet);
}
} catch (error) {
console.error('[viewedRow] restore failed:', error);
}
}
restoreFromStorage();
// 合并外部传入的 viewedKeys
if (options.viewedKeys) {
const keys = isRef(options.viewedKeys)
? options.viewedKeys.value
: options.viewedKeys;
for (const key of keys) {
viewedSet.value.add(key);
// 先恢复存储,再合并外部 viewedKeys,确保 viewedKeys 是最新插入的(最后被淘汰)
restoreFromStorage().then(() => {
if (options.viewedKeys) {
const keys = isRef(options.viewedKeys)
? options.viewedKeys.value
: options.viewedKeys;
updateViewedSet((set) => {
let changed = false;
for (const key of keys) {
if (!set.has(key)) {
set.add(key);
changed = true;
}
}
return changed;
});
}
}
});
// ========== 更新 viewedSet 的统一入口 ==========
function updateViewedSet(updater: (set: Set<number | string>) => boolean) {

Loading…
Cancel
Save