Pinia使用方法,数据持久化

1、选项api形式 

import { defineStore } from 'pinia'

const useCountStore = defineStore('count', {
  state: () => {
    return {
      count: 0,
    }
  },
  // 同method支持异步
  actions: {
    add(num: number) {
      this.count += num;
    },
    sub(num: number) {
      this.count -= num;
    },
    addSync(time: number) {
      setTimeout(() => {
        this.count++;
      }, time);
    },
    subSync(time: number) {
      setTimeout(() => {
        this.count--;
      }, time);
    }
  },
  // 同computed
  getters: {
    doubleCount: (state) => state.count * 2,
  },
  persist: {
    key: "test1-key",//保存的可以
    paths: ["count"],//保存哪个变量
  },
});

export default useCountStore;

2、组合api形式 

import { computed, ref } from "vue";

export const useCountStore = defineStore('count', () => {
  const count = ref(0);

  const add = (num: number) => {
    count.value += num;
  }

  const sub = (num: number) => {
    count.value -= num;
  }

  const addSync = (time: number) => {
    setTimeout(() => {
      count.value++;
    }, time);
  }

  const subSync = (time: number) => {
    setTimeout(() => {
      count.value--;
    }, time);
  }

  const doubleCount = computed(() => count.value * 2);

  return {
    count, add, addSync, sub, subSync, doubleCount
  }
},
{
  persist: true,
});

在vue文件中调用 

<template>
  <div class="flex">
    <h3>方法一</h3>
    <div>( {{ CountStore.count }} ) ~ ( {{ CountStore.doubleCount }} )</div>
    <button @click="CountStore.add(5)">add</button>
    <button @click="CountStore.sub(5)">sub</button>
    <button @click="CountStore.addSync(500)">addSync</button>
    <button @click="CountStore.subSync(500)">subSync</button>
    <h3>方法二</h3>
    <div>( {{ count }} ) ~ ( {{ doubleCount }} )</div>
    <button @click="add(5)">add</button>
    <button @click="sub(5)">sub</button>
    <button @click="addSync(500)">addSync</button>
    <button @click="subSync(500)">subSync</button>
    <el-button>中文</el-button>
  </div>
</template>

<script setup lang="ts">
import { storeToRefs } from "pinia";
import useCountStore from "../store/count";

const CountStore = useCountStore();

// 接收出pinia中数据并保持响应式
const { count, doubleCount } = storeToRefs(CountStore);

// 解构方法不需要处理响应式,可直接解构
const { add, addSync, sub, subSync } = CountStore;


</script>

 pinia数据持久化

1、使用插件如 pinia-plugin-persistedstate


import { createPinia } from 'pinia';
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';

createApp(App).use(createPinia().use(piniaPluginPersistedstate));

 

2、 建立事件监听,在pinia添加导入导出的方法,在当页面刷新前将pinia中数据导出,保存到localstorage或indexedDB中,刷新好后再取出数据保存回pinia中。

window.addEventListener('beforeunload', () => {
  window.sessionStorage.setItem('state', JSON.stringify(store.state));
});

// 当storage被修改时触发
window.addEventListener('storage', function () {
  window.sessionStorage.clear();
  window.location.replace("/");
});

window.addEventListener('load', () => {
  let data = window.sessionStorage.getItem('state');
  data = JSON.parse(data);
  // 要commit回去,在pinia中在把数据赋值回去
  console.log(data);
});

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值