1.方法一(pinia-plugin-persistedstate)
1.安装插件-pinia-plugin-persistedstate
yarn add pinia-plugin-persistedstate
npm i pinia-plugin-persistedstate
2.在 pinia 中注册
import { createPinia } from 'pinia';
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);
export default pinia;
3.自定义持久化参数配置
import { PersistedStateOptions } from "pinia-plugin-persistedstate";
const piniaPersistConfig = (key: string, paths?: string[]) => {
const persist: PersistedStateOptions = {
key,
storage: localStorage,
paths
};
return persist;
};
export default piniaPersistConfig;
4.如何使用(setup 写法)
import { defineStore } from 'pinia';
import { ref } from 'vue';
import piniaPersistConfig from '@/store/helper/persist';
const storeDemo = defineStore(
'store-demo',
() => {
const title = ref('demo');
const setTitle = () => {
title.value = '我是 store 改变的值';
};
return {
title,
setTitle,
};
},
{
persist: piniaPersistConfig('gloabl-demo'),
}
);
export default storeDemo;
5.如何使用(options 写法)
import { defineStore } from 'pinia';
import { GlobalState } from '../type';
import { DEFAULT_PRIMARY } from '@/config/layout.config';
import piniaPersistConfig from '@/store/helper/persist';
export const useGlobalStore = defineStore({
id: 'skam-global',
state: (): GlobalState => ({
layout: 'classic',
assemblySize: 'default',
language: null,
maximize: false,
theme: 'dark',
primary: DEFAULT_PRIMARY,
isDark: false,
isGrey: false,
isWeak: false,
asideInverted: false,
headerInverted: false,
isCollapse: false,
accordion: true,
breadcrumb: true,
breadcrumbIcon: true,
tabs: true,
tabsIcon: true,
footer: true,
mode: 'inline',
}),
getters: {},
actions: {
setGlobalState(...args: any) {
this.$patch({ [args[0]]: args[1] });
},
},
persist: piniaPersistConfig('geeker-global'),
});
export default useGlobalStore;
6.总结:每当通过 ref 创建的 title 值改变时,locastorage 就会更新值。
2.方法二
1.pinia 配置
import { createPinia } from 'pinia';
const pinia = createPinia();
export default pinia;
2.globalDemo
import { defineStore } from 'pinia';
import { ref } from 'vue';
const storeDemo = defineStore('store-demo', () => {
const title = ref('demo');
const setTitle = () => {
title.value = '我是 store 改变的值';
};
return {
title,
setTitle,
};
});
export default storeDemo;
3.页面使用(setup)
<template>
<div>{{ title }}</div>
<a-button @click="pageHandle">页面改变 title</a-button>
<a-button @click="() => useGlobalDemo.setTitle()">store改变 title</a-button>
</template>
import { useStore } from '@/store';
import { storeToRefs } from 'pinia';
const { useGlobalDemo } = useStore();
const { title } = storeToRefs(useGlobalDemo);
onMounted(() => {
useGlobalDemo.title = '修改 title 的值';
});
const pageHandle = () => {
useGlobalDemo.title = '页面更改';
};
const demoF = (mutation, state) => {
localStorage.setItem('subscribe-demo', JSON.stringify(state));
};
useGlobalDemo.$subscribe(demoF, { detached: true });
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?