当前位置: 首页 > article >正文

vue3使用pinia实现数据缓存

文章目录

  • 前言
  • 一、pinia是什么?
  • 二、安装pinia
  • 三、注册pinia
  • 四、使用pinia
    • 定义数据及方法
    • 使用
  • 优化
    • `如有启发,可点赞收藏哟~`


前言

vue2以前一直使用vuex实现状态管理
vue3之后推出了pinia…


一、pinia是什么?

直观、类型安全、轻便灵活的Vue Store,使用具有DevTools支持的组合api

二、安装pinia

由于pinia本身没有提供设置缓存的功能,不过可以结合pinia-plugin-persistedstate实现

npm i pinia -S
npm i pinia-plugin-persistedstate -S

三、注册pinia

  • main.ts文件
import { createApp } from "vue";
import { createPinia } from "pinia";
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
import App from "./App/index.vue";

const app = createApp(App);
// 注册  pinia , 并在 pinia 使用 piniaPluginPersistedstate
app.use(createPinia().use(piniaPluginPersistedstate));
app.mount("#app");

四、使用pinia

大部分开发都默认在 stores 目录放置缓存相关文件

定义数据及方法

pinia有两种写法,其中一个是同vuex类似的选项式(这种才能结合pinia-plugin-persistedstate设置浏览器缓存),还有一个就是更符合vue3组合式写法

  • stores/mapState.ts (选项式)
import { defineStore } from "pinia";

export interface MapState {
  address: string;
}
const { SIS_STORE_NAME } = import.meta.env;

export const useMapStore = defineStore(SIS_STORE_NAME + "map", {
  state: (): MapState => ({
    address: "",
  }),
  getters: {},
  actions: {
    setAdress(address: string) {
      this.address = address;
    },
    clearMessage() {
      this.address = "";
    },
  },
  persist: {
    /**
     * 使用的存储
     * @default $store.id
     */
    key: SIS_STORE_NAME + "map",
    /**
     * 存储位置
     * @default localStorage
     */
    storage: sessionStorage,
    /**
     * 需要设置缓存的state 如果未设置即存储所有state
     * @default undefined
     */
    // paths: [],
    /**
     * 存储之前
     * @default null
     */
    beforeRestore: () => {},
    /**
     * 存储之后
     * @default undefined
     */
    afterRestore: () => {},
    /**
     * 启用时在控制台中记录错误。
     * @default false
     */
    debug: true,
  },
});
  • stores/counter.ts (组合式)
import { ref, computed } from "vue";
import { defineStore } from "pinia";

export const useCounterStore = defineStore("counter", () => {
  const count = ref(0);
  const doubleCount = computed(() => count.value * 2);
  function increment() {
    count.value++;
  }

  return { count, doubleCount, increment };
});

使用

如果是字段数据,需要使用storeToRefs 获取为响应式的,方法不用
虽然上述两种定义不同,但调用使用方式是一样的

import { storeToRefs } from "pinia";
import { useMapStore } from "./stores/mapState";
import { useCounterStore } from "./stores/counter";

const { address } = storeToRefs(useMapStore())
const { setAdress, clearMessage } = useMapStore()
setAdress('')
clearMessage()

const { count } = storeToRefs(useCounterStore())
const { increment } = useCounterStore()
increment()
console.log(count)

优化

  • stores/index.ts
import type { App } from "vue";
import { createPinia } from "pinia";
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

const store = createPinia().use(piniaPluginPersistedstate);

// 全局注册 store
export function setupStore(app: App<Element>) {
  app.use(store);
}
export { store };
  • main.ts
import { createApp } from "vue";
import App from "./App/index.vue";
import { setupStore } from "./stores";
const app = createApp(App);
// 全局注册 状态管理(store)
setupStore(app)
app.mount("#app");


如有启发,可点赞收藏哟~


http://www.kler.cn/news/136650.html

相关文章:

  • FreeSSl 申请免费证书,ACME实现自动化续期(https证书自动续期)
  • Nestjs请求处理顺序
  • 通过页面添加国际化数据,实现vue的国际化
  • 通过四元数求机器人本体坐标旋转量
  • Spring--4
  • 33 类与对象 · 下
  • 算法设计与分析算法实现——删数问题
  • Node.js环境配置级安装vue-cli脚手架
  • Java面试题07
  • 一文了解:离散型制造业轻量化MES解决方案
  • SD3403/SS928 烧录 Uboot Kernel Rootfs是什么
  • WiFi 6的数据在发送端分片和在接收端重组的理解
  • 【快应用】快应用学习之兄弟组件通信
  • Vue框架学习笔记——创建Vue实例、实例与容器对应关系
  • C语言的5个内存段你了解吗?( 代码段/数据段/栈/堆)
  • Python将原始数据集和标注文件进行数据增强(随机仿射变换),并生成随机仿射变换的数据集和标注文件
  • 【C++ Primer Plus学习记录】for循环
  • 51.Sentinel微服务保护
  • 架构探索之路-第一站-clickhouse | 京东云技术团队
  • C++设计模式——单例模式
  • 基于单片机GPS轨迹定位和里程统计系统
  • 全国见!飞桨星河社区五周年,邀你共赴大模型盛宴!
  • 什么是调试和性能分析工具?
  • 【广州华锐互动】VR虚拟现实技术助力太空探险:穿越时空,探索宇宙奥秘
  • 第二证券:龙头公司大手笔回购 港股今年以来回购总额逼近千亿港元
  • 基于Java封装继承多态实现的一个简单图书系统