疑难杂症之生产环境pinia数据丢失

在开发环境的根组件App.vue中,定义组件对象创建以后的操作:将pinia的数据保存在浏览器的sessionStorage 中

<template>
  <router-view />
</template>

<script>
import { usePiniaStore } from '@/piniaStore/index.js'
import CircularJSON from 'circular-json'

export default {
  created() {
    // pinia可持久化存储
    var piniaStore = usePiniaStore()
    // 添加监听页面加载的事件
    window.addEventListener("beforeunload", () => {
      window.sessionStorage.setItem("mianStore", CircularJSON.stringify(piniaStore.$state))  // 页面刷新时将pinia的数据转换为str保存在sessionSrtorage中
    })

    // 获取存储的pinia数据,并转换为js对象
    if (window.sessionStorage.getItem("mianStore")) {
      //将存储的pinia数据重新复制到pinia中
      Object.assign(piniaStore.$state, CircularJSON.parse(window.sessionStorage.getItem("mianStore")))
    }
  }
}

</script>

<style></style>

之前项目使用vuex进行全局的状态管理,这种方式是可行的,后面改用pinia以后,在开发环境没毛病,上线部署以后就出问题:页面刷新导致数据丢失。使用pinia推荐的插件又报错,因为我的全局状态中存在的类型有的是对象,而插件本身是使用Json.parse和Json.stringify进行类型转换,所以会报错。

借鉴插件的实现原理,自定义一个pinia持久化保存的工具如下:

main.js

import { createApp, toRaw } from 'vue'
import CircularJSON from 'circular-json'
...
//先手写我们存储数据的localStorage
const getStorage = (key) => {
    return sessionStorage.getItem(key) ? CircularJSON.parse(sessionStorage.getItem(key)) : {}
}
//存储数据
const setStorage = (key, value) => {
    sessionStorage.setItem(key, CircularJSON.stringify(value)) //value可能是对象或者数组 所以JSON.stringify需要这个转换成字符串 ['1','2','3'] => '['1','2','3']'
}

//函数柯里化  柯里化就是将一个多参数的函数  转换成单参数的函数
const piniaPlugin = (options) => {
    return (context) => { //拿取到pinpa的参数
        console.log('context', context);
        const { store } = context //解构我们需要的store
        const data = getStorage(`${options?.key ?? __piniaKey__}-${store.$id}`) //获取到key
        console.log('data', data);
        //可以通过$subscribe监测到store数据变化
        store.$subscribe(() => {
            // 每当它发生变化时,将整个状态持久化到本地存储
            //${options?.key ??__piniaKey__}-${store.$id} 唯一值key
            setStorage(`${options?.key ?? __piniaKey__}-${store.$id}`, toRaw(store.$state)) //store.$state proxy对象  toRaw把它转为原始对象
        })
        return {
            ...data
        }
    }
}
const pinia = createPinia()
pinia.use(piniaPlugin({ key: 'pinia' }))
const app = createApp(App)
app.use(pinia)
....

效果:刷新页面以后:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Docker时,可能会遇到一些疑难杂症。其中,一些常见的问题及解决办法如下: 1. 运行docker version时报错"Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?"这个错误通常是由于Docker守护进程未启动引起的。可以通过运行以下命令来启动守护进程:`sudo systemctl start docker`(适用于基于systemd的Linux发行版)。如果您不是使用systemd,请根据您的操作系统和版本来启动Docker守护进程。 2. 使用yum安装Docker时报错"Cannot retrieve metalink for repository: epel. Please verify its path and try again."这个错误通常是由于epel源(Extra Packages for Enterprise Linux)未正确安装或配置引起的。您可以尝试以下解决办法: - 首先,确保您的系统与互联网连接正常。 - 检查您的操作系统和版本,并根据官方文档正确安装epel源。 - 如果您已经安装了epel源,但仍然遇到这个错误,请尝试更新epel源并再次运行安装命令。 这些是一些常见的Docker疑难杂症及其解决办法。当然,Docker的使用过程中可能还会遇到其他问题,您可以参考官方文档、社区论坛或搜索引擎来寻找更多解决办法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [docker 疑难杂症](https://blog.csdn.net/weixin_33805992/article/details/92266045)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [docker常见疑难杂症](https://blog.csdn.net/weixin_45776707/article/details/103142818)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值