vue3 + electron 桌面端使用LocalForage数据持久化
1 安装 LocalForage
npm install localforage
2 封装 LocalForage
import localforage from 'localforage'
localforage.config({
name: 'okFactura',
storeName: 'local_data',
description: 'Local storage using IndexedDB',
driver: localforage.INDEXEDDB
})
const setItem = (key, value) => {
const raw = JSON.parse(JSON.stringify(value));
return localforage.setItem(key, raw);
}
const getItem = (key) => {
return localforage.getItem(key)
}
const removeItem = (key) => {
return localforage.removeItem(key)
}
const clear = () => {
return localforage.clear()
}
export default {
setItem,
getItem,
removeItem,
clear
}
3 项目中使用
import storage from "@/utils/storage"
if (loginForm.value.rememberMe) {
storage.setItem("username", loginForm.value.username);
storage.setItem("password", encrypt(loginForm.value.password));
storage.setItem("rememberMe", loginForm.value.rememberMe);
} else {
storage.removeItem("username")
storage.removeItem("password")
storage.removeItem("rememberMe")
}
4 注意事项
-- 默认顺序:indexDB webSql localStory
-- 通过config 指定 driver: localforage.INDEXEDDB
-- 不管什么数据类型,存储和获取都不改变数据类型,可以直接存储获取
const raw = JSON.parse(JSON.stringify(value)); // 脱响应式
return localforage.setItem(key, raw);
可以用 Vue 的 `toRaw()` + `structuredClone()` 组合,安全处理复杂嵌套结构
import { toRaw } from 'vue'
const deepClone = (obj) => {
return structuredClone(toRaw(obj)) // 精准、可靠
}
const setItem = (key, value) => {
const raw = deepClone(value);
return localforage.setItem(key, raw);
}