vue3-pinia持久化

举报
林太白 发表于 2025/12/24 11:06:37 2025/12/24
【摘要】 vue3-pinia持久化

outline: deep

vue3-pinia持久化

1、安装插件

npm i pinia-plugin-persistedstate 
//或者
yarn add pinia-plugin-persistedstate

2、引入使用

//main.js 
import { createPinia } from 'pinia' 
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' 

app.use(createPinia().use(piniaPluginPersistedstate)); //pinia状态管理 //pinia持久化

3、使用插件

定义一个全局使用方法的部分

src\store\storage\persist.ts
import type { PersistenceOptions } from "pinia-plugin-persistedstate";
/**
 * @description pinia 持久化参数配置
 * @param {String} key 存储到持久化的 name
 * @param {Array} paths 需要持久化的 state name
 * @return persist
 * */
const piniaPersistConfig = (key: string, paths?: string[]) => {
  const persist: PersistenceOptions = {
    key,
    storage: localStorage,
    pick: paths
  };
  return persist;
};
export default piniaPersistConfig;

4、项目使用

设置标签页是否显示ICON

定义一个全局存储数据的部分,放入我们仓库

src\store\modules\global.ts
import { defineStore } from "pinia";
import { config } from "@/config/index";
import piniaPersistConfig from "@/store/storage/persist";

export type LayoutType = "vertical" | "classic" | "transverse" | "columns";
export type AssemblySizeType = "large" | "default" | "small";
export type LanguageType = "zh" | "en" | null;
/* GlobalState */
export interface GlobalState {
  layout: LayoutType;
  assemblySize: AssemblySizeType;
  language: LanguageType;
  maximize: boolean;
  primary: string;
  isDark: boolean;
  isGrey: boolean;
  isWeak: boolean;
  asideInverted: boolean;
  headerInverted: boolean;
  isCollapse: boolean;
  accordion: boolean;
  watermark: boolean;
  breadcrumb: boolean;
  breadcrumbIcon: boolean;
  tabs: boolean;
  tabsIcon: boolean;
  footer: boolean;
}
type ObjToKeyValArray<T> = {
  [K in keyof T]: [K, T[K]];
}[keyof T];
export const useGlobalStore = defineStore("global",{
  // 修改默认值之后,需清除 localStorage 数据
  state: (): GlobalState => ({
    // 布局模式 (纵向:vertical | 经典:classic | 横向:transverse | 分栏:columns)
    layout: "vertical",
    // element 组件大小
    assemblySize: "default",
    // 当前系统语言
    language: null,
    // 当前页面是否全屏
    maximize: false,
    // 主题颜色
    primary: config.themeSetting.Default_Theme_Color,
    // 深色模式
    isDark: false,
    // 灰色模式
    isGrey: false,
    // 色弱模式
    isWeak: false,
    // 侧边栏反转
    asideInverted: false,
    // 头部反转
    headerInverted: false,
    // 折叠菜单
    isCollapse: false,
    // 菜单手风琴
    accordion: true,
    // 页面水印
    watermark: false,
    // 面包屑导航
    breadcrumb: true,
    // 面包屑导航图标
    breadcrumbIcon: true,
    // 标签页
    tabs: true,
    // 标签页图标
    tabsIcon: true,
    // 页脚
    footer: true
  }),
  getters: {},
  actions: {
    // Set GlobalState
    setGlobalState(...args: ObjToKeyValArray<GlobalState>) {
      this.$patch({ [args[0]]: args[1] });
    }
  },
  persist: piniaPersistConfig("global")
});

配置icon

// 全局配置仓库
import { useGlobalStore } from "@/store/modules/global";

//是否显示 tabs 图标
const globalStore = useGlobalStore();

const globalStore = useGlobalStore();
const tabsIcon = computed(() => globalStore.tabsIcon);

项目之中改变,这个时候测试,我们的功能已经ok了

<template>
  <el-switch
    :active-value="true"
    :inactive-value="false"
    active-text="显示图标"
    inactive-text="不显示图标"
    v-model="tabsIcon"
    @change="handleTabsIconChange"
  />
</template>

<script setup lang="ts">
import { useGlobalStore } from '@/store/modules/global';
import { storeToRefs } from 'pinia';

const globalStore = useGlobalStore();
const { tabsIcon } = storeToRefs(globalStore);

const handleTabsIconChange = (value: boolean) => {
  globalStore.setGlobalState('tabsIcon', value);
};
</script>

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。