高级用法
该插件还为更高级的用例公开了其他 API。
全局持久性选项
安装插件时,您可以使用公开的 createPersistedState 方法来初始化带有全局选项的插件,而不是使用默认导出。这些选项成为应用程序中所有商店的新默认选项。
import { createPinia } from 'pinia'
import { createPersistedState } from 'pinia-plugin-persistedstate'
const pinia = createPinia()
pinia.use(createPersistedState({
storage: sessionStorage,
}))在此示例中,每个声明 persist: true 的存储将默认地将数据保存到 sessionStorage 中。
可用的全局选项包括:
传递给存储的 persist 配置的任何选项都将覆盖在全局选项中声明的对应选项。
使用 NUXT ?
Nuxt 模块中的全局选项作为模块选项处理,与独立的插件全局选项不同。在 Nuxt 模块文档 中阅读更多内容。
全局密钥选项
除了其他全局持久性选项之外,createPersistedState 函数还接受一个选项: key。全局 key 选项接受传递给存储键的函数,并且应该返回一个字符串,以成为新的存储key。
import { createPinia } from 'pinia'
import { createPersistedState } from 'pinia-plugin-persistedstate'
const pinia = createPinia()
pinia.use(createPersistedState({
key: id => `__persisted__${id}`,
}))import { defineStore } from 'pinia'
defineStore('store', {
state: () => ({ saved: '' }),
persist: true,
})在此示例中,存储将在 __persisted__store 下而不是在 store 下持久化。
使用 NUXT ?
Nuxt 中的全局key通过 module 项作为字符串模板而不是函数传递。在 Nuxt 模块文档 中阅读更多内容。
存储的多个持久性
可能存在需要将数据从一个存储持久化到不同存储的特定用例。 persist 选项也接受数组配置。
import { defineStore } from 'pinia'
defineStore('store', {
state: () => ({
toLocal: '',
toSession: '',
toNowhere: '',
}),
persist: [
{
pick: ['toLocal'],
storage: localStorage,
},
{
pick: ['toSession'],
storage: sessionStorage,
},
],
})在本例中, toLocal 值将保存在 localStorage 中,而 toSession 值将保存在 sessionStorage 中。toNowhere 将不会持续。
WARNING
当不指定 paths 选项或在两个持久性配置中以同一路径为目标时要小心。这可能导致数据不一致。在rehydration过程中,持久性的处理顺序与声明的顺序相同。
import { defineStore } from 'pinia'
defineStore('store', {
state: () => ({
someData: 'Hello Pinia'
}),
persist: [
{
storage: localStorage,
},
{
storage: sessionStorage,
},
],
})在这种特定情况下,在水合时,从 sessionStorage 检索的数据将替换从 localStorage 检索的数据。
强制 hydration
如果您需要从存储中手动触发hydration作用,现在每个存储都公开了一个 $hydrate 方法。默认情况下,调用此方法还会触发 beforeHydrate 和 afterHydrate 钩子。您可以通过指定方法来避免钩子触发。
借鉴此 store:
import { defineStore } from 'pinia'
const useStore = defineStore('store', {
state: () => ({
someData: 'Hello Pinia'
})
})您可以访问 $hydrate:
const store = useStore()
store.$hydrate({ runHooks: false })这将从存储中获取数据并用它替换当前状态。在上面的例子中,钩子不会被触发。
警告
在大多数情况下,您应该不需要手动合并状态。确保你知道你在做什么,并且你使用 $hydrate 的原因不是由于一个错误(无论是你的实现还是插件本身)。
强制持久化
如果您需要手动触发存储的持久性,现在每个存储都公开了一个 $persist 方法。
借鉴此 store:
import { defineStore } from 'pinia'
const useStore = defineStore('store', {
state: () => ({
someData: 'Hello Pinia'
})
})您可以访问 $persist:
const store = useStore()
store.$persist()这将强制将存储状态保留在配置的存储中。
警告
在大多数情况下,您应该不需要手动合并状态。确保你知道你在做什么,并且你使用 $persist 的原因不是由于一个错误(无论是你的实现还是插件本身)。