设计思路
- 状态管理:使用Solid.js的响应式系统来管理应用的状态。将不同类型的状态(用户信息、用户偏好设置、购物车数据等)分别定义为独立的响应式变量。
- IndexedDB封装:创建一个封装IndexedDB操作的模块,提供异步的读取和写入方法。这个模块负责处理IndexedDB的打开、事务管理、数据操作等细节。
- 加载顺序:在应用加载时,按照特定顺序依次从IndexedDB中读取每个状态。可以使用
async/await
或者Promise
链式调用确保顺序性。
- 状态更新同步:在状态更新时,使用Solid.js的响应式机制,在状态变化后触发同步到IndexedDB的操作。为了避免性能问题,可以采用防抖(Debounce)或节流(Throttle)技术。
- 数据竞争处理:利用Promise的特性,确保每次IndexedDB操作都是顺序执行,避免多个操作同时修改数据导致的数据竞争。
关键代码逻辑
- IndexedDB封装模块
const indexedDB = window.indexedDB;
const dbPromise = new Promise((resolve, reject) => {
const request = indexedDB.open('myAppDB', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
const objectStore = db.createObjectStore('userInfo', { keyPath: 'id' });
const objectStore2 = db.createObjectStore('userPreferences', { keyPath: 'id' });
const objectStore3 = db.createObjectStore('cartData', { keyPath: 'id' });
};
request.onsuccess = (event) => {
resolve(event.target.result);
};
request.onerror = (event) => {
reject(event.target.error);
};
});
export const getFromIndexedDB = async (storeName, key) => {
const db = await dbPromise;
return new Promise((resolve, reject) => {
const transaction = db.transaction(storeName);
const objectStore = transaction.objectStore(storeName);
const request = objectStore.get(key);
request.onsuccess = (event) => {
resolve(event.target.result);
};
request.onerror = (event) => {
reject(event.target.error);
};
});
};
export const putToIndexedDB = async (storeName, data) => {
const db = await dbPromise;
return new Promise((resolve, reject) => {
const transaction = db.transaction(storeName, 'readwrite');
const objectStore = transaction.objectStore(storeName);
const request = objectStore.put(data);
request.onsuccess = (event) => {
resolve(event.target.result);
};
request.onerror = (event) => {
reject(event.target.error);
};
});
};
- 应用加载时状态恢复
import { createSignal } from 'solid-js';
import { getFromIndexedDB } from './indexedDBUtils';
const [userInfo, setUserInfo] = createSignal(null);
const [userPreferences, setUserPreferences] = createSignal(null);
const [cartData, setCartData] = createSignal(null);
const loadStates = async () => {
try {
const userInfoData = await getFromIndexedDB('userInfo', 'user1');
setUserInfo(userInfoData);
const userPreferencesData = await getFromIndexedDB('userPreferences', 'user1');
setUserPreferences(userPreferencesData);
const cartDataData = await getFromIndexedDB('cartData', 'user1');
setCartData(cartDataData);
} catch (error) {
console.error('Error loading states:', error);
}
};
loadStates();
- 状态更新同步
import { createSignal, createEffect } from 'solid-js';
import { putToIndexedDB } from './indexedDBUtils';
const [userInfo, setUserInfo] = createSignal(null);
createEffect(() => {
const debounceTimer = setTimeout(() => {
const currentUserInfo = userInfo();
if (currentUserInfo) {
putToIndexedDB('userInfo', currentUserInfo).catch(console.error);
}
}, 300); // 防抖时间300毫秒
return () => clearTimeout(debounceTimer);
});