手写Pinia存储的数据持久化插件
2024-10-11 11:26:45
Pinia和Vuex的通病
Pinia和vuex的通病就是,页面刷新会导致数据丢失
解决通病
一、新建store
import { defineStore } from 'pinia'
//单独存放Store的名字 $id
import { Names } from './store-name'
type User = {
name: string
age: number
}
let res: User = {
name: '孙悟空',
age: 999,
}
const Login = (): Promise<User> => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve({
name: '孙悟空',
age: 999,
})
}, 2000)
})
}
export const useTestStore = defineStore(Names.TEST, {
state: () => {
return {
user: <User>{},
name: '飞机',
}
},
//类似computed 修饰一些值
getters: {
newName():string {
return `new--${this.name}-${this.getUserAge}`
},
getUserAge():number {
return this.user.age
}
},
// 类似methods 可以同步 异步 提交state
actions: {
setName() {
this.name = '孙悟空'
},
async setUser() {
this.user = await Login()
this.setName()
},
},
})
//base
export const useBaseStore = defineStore(Names.BASE, {
state: () => {
return {
baseCurrent:1
}
}
})
存放store名字的文件
store-names.ts
//存放store的名字
export const enum Names {
TEST = 'TEST',
BASE = 'BASE'
}
二、在main.ts中引入并使用手写的插件
main.ts
import { createApp, toRaw } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import router from './router'
import './assets/main.css'
import piniaToLocalStoragePlugin from './stores/piniaToLocalStoragePlugin'
const app = createApp(App)
const store = createPinia()
store.use(
piniaToLocalStoragePlugin({
key: 'pinia', // 这是给缓存到本地时,加一个特殊的前缀,以免造成污染到其他缓存数据
needKeepIds: ['BASE','TEST'], // 对于特定store进行持久化,store的名字都在store-names文件中抽离出来了,空或者不传,则对所有的store进行缓存到本地
})
)
app.use(router)
app.use(store)
app.mount('#app')
三、手写的持久化插件
这个就是本文的主角了
piniaToLocalStoragePlugin.ts
import type { PiniaPluginContext } from 'pinia'
import { toRaw } from 'vue'
type Options = {
key: string
needKeepIds?: string[]
}
// 来个持久化存储的函数
const setStorage = (key: string, value: any) => {
localStorage.setItem(key, JSON.stringify(value))
}
// 来个取的函数
const getStorage = (key: string) => {
return localStorage.getItem(key)
? JSON.parse(localStorage.getItem(key) as string)
: {}
}
const __piniaKey__: string = 'piniaKey'
const piniaToLocalStoragePlugin = (options: Options) => {
const { key, needKeepIds = [] } = options
//使用函数柯里化
return (context: PiniaPluginContext) => {
const { store } = context
if (needKeepIds.length === 0) {
//没有指定存全部
// 有个监听是$subscribe 1. 先监听是否改变了store的内容 改变了就存
store.$subscribe(() => {
console.log(' change' )
//无论哪个 state 所有的改变都走这个函数 所以我们可以在这里搞一些动作
setStorage(`${key ?? __piniaKey__}-${store.$id}`, toRaw(store.$state))
})
} else {
//有指定要存哪些
//使用短路运算
needKeepIds.includes(store.$id) &&
store.$subscribe(() => {
setStorage(`${key ?? __piniaKey__}-${store.$id}`, toRaw(store.$state))
})
}
//2. 获取本地存储的localStorage 有就放在页面上
const data = getStorage(`${key ?? __piniaKey__}-${store.$id}`)
// console.log('data', data) //取到data了 怎么送给store呢
return {
...data,
}
}
}
export default piniaToLocalStoragePlugin
最新文章
- jquery本地上传预览扩展(隐藏上传控件单击图片上传支持ie!!)
- 基于socket的TCP和UDP编程
- Java-URLConnection类详解
- IOS new Date() 时间转换失败问题以及其他问题
- 你不得不知道的HTML5的新型标签
- 转载 SQL Server 2008 R2 事务与隔离级别实例讲解
- hadoop python and Twitter
- operator= 复制操作符的意外
- 剑指offer编程题Java实现——面试题6重建二叉树
- Varnsih调用多台后端主机
- Python 爬虫:把廖雪峰教程转换成 PDF 电子书
- 【C#】数据库脚本生成工具(二)
- Pyharm中关于“warning: Debugger speedups using cython not found”问题的解决
- 网络协议 11 - Socket 编程(下):眼见为实耳听为虚
- Linux中使用Apache发布html网页
- 人脸识别1:n对比 (一)
- VS调式时出现异常,在输入法是中文状态下,输入框输入字母再回车,会造成页面关闭,vs退出调式
- 20165336 2017-2018-2 《Java程序设计》第4周学习总结
- Struts2开发基础
- day1-课堂代码
热门文章
- Nginx代理和动静分离
- 1、在SrpingBoot的环境当中使用JSP及相关功能
- .NET6打包部署到Windows Service
- 图文详解丨iOS App上架全流程及审核避坑指南
- 京东云开发者|经典同态加密算法Paillier解读 - 原理、实现和应用
- vue 过滤器时间格式化
- Linux *.service文件详解
- orcle恢复报错:ORA-00392: 日志 2 (用于线程 1) 正被清除, 不允许操作
- c++题目:切香肠
- 2022-2023年度必备宇宙最全Windows系统软件清单