Explorar el Código

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

layhuts hace 1 mes
padre
commit
a5f0537cb0
Se han modificado 1 ficheros con 32 adiciones y 26 borrados
  1. 32 26
      packages/effects/plugins/src/vxe-table/use-viewed-row.ts

+ 32 - 26
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) {