Ver código fonte

fix: 处理非原子性的先清除后写入操作会setKeys带来永久性数据丢失的风险

layhuts 1 mês atrás
pai
commit
c78d89f549

+ 8 - 2
packages/effects/plugins/src/vxe-table/use-viewed-row.ts

@@ -94,11 +94,17 @@ function createIndexedDBAdapter(
     },
     async setKeys(keys) {
       try {
-        // 先清除旧数据,再逐条写入
-        await manager.clear();
+        const newKeySet = new Set(keys.map(String));
+        // 先写入新数据,确保数据安全落盘
         await Promise.all(
           keys.map((key) => manager.setItem(String(key), key, opts.ttl)),
         );
+        // 再清理不在新集合中的旧 key
+        const existingKeys = await manager.keys();
+        const toRemove = existingKeys.filter((k) => !newKeySet.has(k));
+        if (toRemove.length > 0) {
+          await Promise.all(toRemove.map((k) => manager.removeItem(k)));
+        }
       } catch (error) {
         console.error('[viewedRow] indexedDB persist failed:', error);
       }