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

master^2
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);
// ========== 从存储恢复 ==========
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);
});
}
restoreFromStorage();
// 合并外部传入的 viewedKeys
if (options.viewedKeys) {
const keys = isRef(options.viewedKeys)
? options.viewedKeys.value
: options.viewedKeys;
for (const key of keys) {
viewedSet.value.add(key);
if (maxSize > 0) {
enforceMaxSize(viewedSet.value, maxSize);
}
triggerRef(viewedSet);
}
} catch (error) {
console.error('[viewedRow] restore failed:', error);
}
}
// 先恢复存储,再合并外部 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) {
const changed = updater(viewedSet.value);