Плагін Pinia - функція, що викликається для кожного стору при його створенні й може додавати властивості, обгортати дії, підписуватися на зміни.
const pinia = createPinia();
pinia.use(({ store, options }) => {
// додати властивість усім сторам
store.createdAt = new Date();
// логувати всі дії
store.$onAction(({ name, args, after, onError }) => {
const start = performance.now();
after(() => console.debug(`${store.$id}.${name}`, performance.now() - start));
onError((error) => reportError(error, { store: store.$id, action: name }));
});
});
Плагін отримує store, pinia, app і options - опції, передані в defineStore. Через власні опції стор може «вмикати» поведінку плагіна.
Збереження стану між перезавантаженнями - мінімальний плагін:
pinia.use(({ store, options }) => {
if (!options.persist) return;
const key = `pinia:${store.$id}`;
const saved = localStorage.getItem(key);
if (saved) store.$patch(JSON.parse(saved));
store.$subscribe((_, state) => {
localStorage.setItem(key, JSON.stringify(state));
}, { detached: true });
});
export const useSettingsStore = defineStore('settings', {
state: () => ({ theme: 'light', perPage: 20 }),
persist: true,
});
На практиці частіше беруть готовий pinia-plugin-persistedstate - він уміє вибирати поля, сховище і серіалізацію.
Що враховувати при збереженні:
- не зберігати секрети й токени в
localStorage- їх прочитає будь-який скрипт на сторінці (XSS); - версіонування: після зміни структури стану старі збережені дані можуть зламати застосунок. Потрібна версія в ключі чи міграція;
- зберігати вибірково - фільтри й налаштування так, кешовані відповіді API - ні (застаріють);
- SSR:
localStorageна сервері немає - відновлення лише в браузері, інакше розбіжності при гідрації; - синхронізація вкладок - подія
storageдля оновлення стору, якщо інша вкладка змінила значення.
TypeScript: власні властивості й опції плагіна оголошуються розширенням модулів PiniaCustomProperties і DefineStoreOptionsBase.