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

pull/348/MERGE
layhuts 2026-05-09 13:38:50 +08:00
parent c78d89f549
commit a5f0537cb0
1 changed files with 33 additions and 27 deletions

View File

@ -198,39 +198,45 @@ export function useViewedRow<T = any>(
const persist = useDebounceFn(persistImmediate, 300); const persist = useDebounceFn(persistImmediate, 300);
// ========== 从存储恢复 ========== // ========== 从存储恢复 ==========
function restoreFromStorage() { async function restoreFromStorage(): Promise<void> {
if (!adapter) return; if (!adapter) return;
adapter try {
.getKeys() const stored = await adapter
.then((stored) => { .getKeys();
if (stored && stored.length > 0) { if (stored && stored.length > 0) {
for (const key of stored) { for (const key of stored) {
viewedSet.value.add(key); viewedSet.value.add(key);
}
if (maxSize > 0) {
enforceMaxSize(viewedSet.value, maxSize);
}
triggerRef(viewedSet);
} }
}) if (maxSize > 0) {
.catch((error) => { enforceMaxSize(viewedSet.value, maxSize);
console.error('[viewedRow] restore failed:', error); }
}); triggerRef(viewedSet);
} }
} catch (error) {
restoreFromStorage(); console.error('[viewedRow] restore failed:', error);
// 合并外部传入的 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 的统一入口 ========== // ========== 更新 viewedSet 的统一入口 ==========
function updateViewedSet(updater: (set: Set<number | string>) => boolean) { function updateViewedSet(updater: (set: Set<number | string>) => boolean) {
const changed = updater(viewedSet.value); const changed = updater(viewedSet.value);