const cacheMap = new Map()
let timeoutDefault = 1200
function isTimeout(name: string) {
const data = cacheMap.get(name)
if (!data) return true
if (data.timeout === 0) return false
const currentTime = Date.now()
const overTime = (currentTime - data.createTime) / 1000
if (overTime > data.timeout) {
cacheMap.delete(name)
if (name.startsWith('_')) {
try {
uni.removeStorageSync(name)
} catch (e) {
console.log(e)
}
}
return true
}
return false
}
class CacheCell {
private data: any
private timeout: number
private createTime: number
constructor(data: any, timeout: number) {
this.data = data
this.timeout = timeout
this.createTime = Date.now()
}
}
class MinCache {
constructor(timeout = timeoutDefault) {
try {
const res = uni.getStorageInfoSync()
res.keys.forEach((name) => {
try {
const value = uni.getStorageSync(name)
cacheMap.set(name, value)
} catch (e) {
console.log(e)
}
})
} catch (e) {
console.log(e)
}
timeoutDefault = timeout
}
set(name: string, data: any, timeout = timeoutDefault) {
const cachecell = new CacheCell(data, timeout)
let cache = null
// if (name.startsWith('_')) {
try {
uni.setStorageSync(name, cachecell)
cache = cacheMap.set(name, cachecell)
} catch (e) {
console.log(e)
}
// } else {
// cache = cacheMap.set(name, cachecell)
// }
return cache
}
get(name: string) {
return isTimeout(name) ? null : cacheMap.get(name).data
}
delete(name: string) {
let value = false
if (name.startsWith('_')) {
try {
uni.removeStorageSync(name)
value = cacheMap.delete(name)
} catch (e) {
console.log(e)
}
} else {
value = cacheMap.delete(name)
}
return value
}
has(name: string) {
return !isTimeout(name)
}
clear() {
let value = false
try {
uni.clearStorageSync()
cacheMap.clear()
value = true
} catch (e) {
console.log(e)
}
return value
}
}
export const minCache = new MinCache()
uni-app 自定义缓存机制
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 介绍 3.0 项目重写了~~基于uni-app,colorUI,封装了《自定义TabBar》《上传图片》《全局自定...
- 介绍 uni-app自带的底部导航栏虽然也很好用,但是遇到中间需要有一个自定义按钮的需求的时候如果使用自带的mid...
- 记录下 自己花了一上午时间做的 UNIAPP 自定义 loading自定义 toast 同理 只是给组件传个参数过...