fix: 处理viewedKeys由于 FIFO 顺序,显式提供的值可能会被异步存储恢复静默地移除。
parent
c78d89f549
commit
a5f0537cb0
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue