vue3,pinia状态管理,手写插件实现持久化

状态管理和持久化

先简单概述一下状态管理和持久化

  • 状态管理:使任意两个组件共享数据
  • 持久化:将共享的数据保存在本地,不随页面销毁而消失

         要实现状态的持久化,可以直接采用插件的形式实现,插件其实就是一个函数,所以根据这些原理,可以手写一个函数将数据保存在本体,重启页面时优先读取出来,这就是一个持久化插件的功能

persist.js

要实现持久化的效果,重点在两个功能:1.保存数据;2.优先读取

首先安装好pinia 并准备一个简单的store,可以参考:vue3状态管理,pinia的使用_vue3usestore的用法 pinia-CSDN博客

npm install pinia
import {defineStore} from 'pinia'

export const useStore = defineStore('counter', {
    state: () => {
        return {
            // 定义状态
            counter: 0
        }
    },
    // 定义计算属性
    getters: {
        // 定义计算属性
        getCounter: (state) => {
            return state.counter>=5?state.counter:"数据不足"
        }
    },
    // 定义操作
    actions: {
        // 定义操作
        addCounter() {
            this.counter++
        }
    }
    // 定义其他选项
    // ...
})
import {defineStore} from 'pinia'
import {ref,computed} from 'vue'

export const useStore = defineStore('counter', ()=>{
    const counter = ref(0);
    
    const getCounter = computed(() => {
        return counter.value>=5?counter.value:"数据不足"
    })
    const addCounter = () => {
        counter.value++
    }
    return{
        counter,
        getCounter,
        addCounter
    }
})

这是两个书写风格,这里采用更简洁的第二种作为示例,

在src下新建一个plugins文件夹,在新建一个js文件persist.js这个js文件就是持久化插件

在main.js中使用插件

import './assets/main.css'

import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } from 'pinia'

import persist from './plugins/persist' //引入插件

const app = createApp(App);
const pinia = createPinia();

pinia.use(persist);// 注册持久化插件
app.use(pinia);
app.mount('#app');

persist插件

在persist插件中,有一个参数,store状态的上下文 

export default function(context){
  console.log(context);
}

注意几个关键的值,正好对应了,pinia中的状态存储,

这里分享一下关于响应式值在控制台的打印,开启这个设置就可以直接查看到响应式值中的内容,而不用去一级一级点开才能看到,

将state数据保存

export default function(context){
  console.log(context);
  const key = context.store.$id
  // 将数据保存在本地
  window.addEventListener('beforeunload', () => {// 页面关闭前执行
    localStorage.setItem(key, JSON.stringify(context.store.$state))
  })
}

使用store仓库的名称,也就$id的值作为key,将state里的值保存,这里监听了窗口的关闭事件,

当窗口关闭时,就会将store中的值保存下来

这里点击了4次按钮后,刷新页面,这个数据就存入了本地,

将state数据读取

export default function(context){
  console.log(context);
  const key = context.store.$id
  // 将数据保存在本地
  window.addEventListener('beforeunload', () => {// 页面关闭前执行
    localStorage.setItem(key, JSON.stringify(context.store.$state))
  })
  // 读取本地数据
  try{
    const data = JSON.parse(localStorage.getItem(key))
    if(data){
      context.store.$state = data
    }
  }catch(e){
    console.log("本地数据读取失败");
  }
}

因为这个插件是在main.js中启用的,所以它会在整个页面渲染前执行,这样就能将本地的数据读取并存入到store中,

这样就实现了一个持久化插件,

总结

全局插件的执行流程:在main.js中注册--->页面打开时执行(在页面维渲染时就已经执行了),

        一个插件其实就是实现某个功能的函数方法,并不是只有十分复杂的结构才能称为插件,当我们使用插件时,在理解了功能之后就可以尝试自己来实现

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值