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

最新文章

  1. jquery本地上传预览扩展(隐藏上传控件单击图片上传支持ie!!)
  2. 基于socket的TCP和UDP编程
  3. Java-URLConnection类详解
  4. IOS new Date() 时间转换失败问题以及其他问题
  5. 你不得不知道的HTML5的新型标签
  6. 转载 SQL Server 2008 R2 事务与隔离级别实例讲解
  7. hadoop python and Twitter
  8. operator= 复制操作符的意外
  9. 剑指offer编程题Java实现——面试题6重建二叉树
  10. Varnsih调用多台后端主机
  11. Python 爬虫:把廖雪峰教程转换成 PDF 电子书
  12. 【C#】数据库脚本生成工具(二)
  13. Pyharm中关于“warning: Debugger speedups using cython not found”问题的解决
  14. 网络协议 11 - Socket 编程(下):眼见为实耳听为虚
  15. Linux中使用Apache发布html网页
  16. 人脸识别1:n对比 (一)
  17. VS调式时出现异常,在输入法是中文状态下,输入框输入字母再回车,会造成页面关闭,vs退出调式
  18. 20165336 2017-2018-2 《Java程序设计》第4周学习总结
  19. Struts2开发基础
  20. day1-课堂代码

热门文章

  1. Nginx代理和动静分离
  2. 1、在SrpingBoot的环境当中使用JSP及相关功能
  3. .NET6打包部署到Windows Service
  4. 图文详解丨iOS App上架全流程及审核避坑指南
  5. 京东云开发者|经典同态加密算法Paillier解读 - 原理、实现和应用
  6. vue 过滤器时间格式化
  7. Linux *.service文件详解
  8. orcle恢复报错:ORA-00392: 日志 2 (用于线程 1) 正被清除, 不允许操作
  9. c++题目:切香肠
  10. 2022-2023年度必备宇宙最全Windows系统软件清单