Troevil
3 天前
自己封装一下
第一种用额外的 key ,val 存储 key 的过期时间
```typescript
// stores/user.ts
import { defineStore } from 'pinia'
const EXPIRATION_KEY = '__user_store_expire__'
const EXPIRATION_DURATION = 1000 * 60 * 60 // 1 小时(可修改)
export const useUserStore = defineStore('user', {
state: () => ({
name: '',
token: '',
}),
persist: {
key: 'user', // 本地存储的 key
storage: localStorage,
afterRestore: (context) => {
const expireTime = parseInt(localStorage.getItem(EXPIRATION_KEY) || '0')
const now = Date.now()
if (now > expireTime) {
console.log('user store expired, resetting...')
context.store.$reset()
localStorage.removeItem(EXPIRATION_KEY)
}
},
// 在每次存储后写入过期时间
beforeRestore: () => {
const expireTime = Date.now() + EXPIRATION_DURATION
localStorage.setItem(EXPIRATION_KEY, expireTime.toString())
}
},
})
```
第二种 直接 warpper 原数据
```
// stores/user.ts
import { defineStore } from 'pinia'
import { createPersistedState } from 'pinia-plugin-persistedstate'
// 设置过期时间(单位:毫秒)
const EXPIRE_TIME = 1000 * 60 * 60 // 1 小时
// 封装一个带过期逻辑的 storage
const expiredStorage = {
getItem: (key: string): string | null => {
const raw = localStorage.getItem(key)
if (!raw) return null
try {
const parsed = JSON.parse(raw)
const now = Date.now()
if (parsed.expire && now > parsed.expire) {
localStorage.removeItem(key)
return null
}
return JSON.stringify(parsed.data)
} catch (e) {
return null
}
},
setItem: (key: string, value: string): void => {
const payload = {
data: JSON.parse(value),
expire: Date.now() + EXPIRE_TIME,
}
localStorage.setItem(key, JSON.stringify(payload))
},
removeItem: (key: string): void => {
localStorage.removeItem(key)
},
}
```