|
@@ -0,0 +1,107 @@
|
|
|
+const cacheManager = (function() {
|
|
|
+ // 默认存储的前缀,可以根据需要修改
|
|
|
+ const STORAGE_PREFIX = 'App_cache_';
|
|
|
+
|
|
|
+ // 设置缓存
|
|
|
+ function set(key, value) {
|
|
|
+ const fullKey = STORAGE_PREFIX + key;
|
|
|
+ if (typeof value === 'object' && value !== null) {
|
|
|
+ // 如果是对象,则将其转换为字符串存储
|
|
|
+ uni.setStorageSync(fullKey, JSON.stringify(value));
|
|
|
+ } else {
|
|
|
+ uni.setStorageSync(fullKey, value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取缓存
|
|
|
+ function get(key) {
|
|
|
+ const fullKey = STORAGE_PREFIX + key;
|
|
|
+ const value = uni.getStorageSync(fullKey);
|
|
|
+ try {
|
|
|
+ // 尝试将字符串解析为对象
|
|
|
+ return JSON.parse(value);
|
|
|
+ } catch (e) {
|
|
|
+ // 如果解析失败,则直接返回值
|
|
|
+ return value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 删除缓存
|
|
|
+ function remove(key) {
|
|
|
+ const fullKey = STORAGE_PREFIX + key;
|
|
|
+ uni.removeStorageSync(fullKey);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 增量修改对象中的参数或添加新参数 删除参数
|
|
|
+ //例子: cacheManager.updateObject('user', { www: undefined }); //删除
|
|
|
+ function updateObject(key, updates) {
|
|
|
+ let obj = get(key) || {};
|
|
|
+ // 合并更新到对象中
|
|
|
+ //Object.assign(obj, updates);
|
|
|
+ for (let [keyToUpdate, value] of Object.entries(updates)) {
|
|
|
+ if (value === null || value === undefined) {
|
|
|
+ // 如果值为 null 或 undefined,则删除属性
|
|
|
+ delete obj[keyToUpdate];
|
|
|
+ } else {
|
|
|
+ // 否则,更新或添加属性
|
|
|
+ obj[keyToUpdate] = value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 重新设置缓存
|
|
|
+ set(key, obj);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 清除所有以特定前缀开头的缓存
|
|
|
+ function clearAll() {
|
|
|
+ const keys = uni.getStorageInfoSync().keys;
|
|
|
+ keys.forEach(key => {
|
|
|
+ if (key.startsWith(STORAGE_PREFIX)) {
|
|
|
+ uni.removeStorageSync(key);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // 增量修改对象中的数组,支持添加、更新和删除元素
|
|
|
+ function updateArrayInObject(key, arrayPath, updateFn) {
|
|
|
+ let obj = get(key) || {};
|
|
|
+
|
|
|
+ // 根据arrayPath找到需要修改的数组
|
|
|
+ const targetArray = findArrayInObject(obj, arrayPath);
|
|
|
+
|
|
|
+ if (Array.isArray(targetArray)) {
|
|
|
+ // 应用更新函数到目标数组上
|
|
|
+ updateFn(targetArray);
|
|
|
+
|
|
|
+ // 重新设置缓存
|
|
|
+ set(key, obj);
|
|
|
+ } else {
|
|
|
+ console.error(`Path ${arrayPath} does not point to an array in the object.`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 例子
|
|
|
+ // cacheManager.updateArrayInObject('user', 'hobbies', (hobbies) => {
|
|
|
+ // hobbies.push('reading');
|
|
|
+ // hobbies = 'coding';
|
|
|
+ // hobbies.pop();
|
|
|
+ // });
|
|
|
+ // 在对象中根据路径找到数组
|
|
|
+ function findArrayInObject(obj, path) {
|
|
|
+ return path.split('.').reduce((acc, curr) => {
|
|
|
+ if (acc && acc[curr] !== undefined) {
|
|
|
+ return acc[curr];
|
|
|
+ } else {
|
|
|
+ return undefined;
|
|
|
+ }
|
|
|
+ }, obj);
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ set,
|
|
|
+ get,
|
|
|
+ remove,
|
|
|
+ updateObject,
|
|
|
+ findArrayInObject,
|
|
|
+ clearAll
|
|
|
+ };
|
|
|
+})();
|
|
|
+
|
|
|
+export default cacheManager;
|