Pinia: storeToRefs, плагины, persist
↑ 5.2 Состояние: Pinia, SSOT, Vue Query · ← Предыдущая · → Следующая
Зачем это на собесе
Расширение Pinia: сохранение состояния, плагины, безопасность данных.
Объяснение
storeToRefs(store) возвращает refs для state и getters (actions берутся напрямую).
const store = useUiStore();
const { theme, sidebarOpen } = storeToRefs(store);
const { toggleSidebar } = store;Плагин Pinia — функция, получающая контекст (store, app, pinia, options).
const logger: PiniaPlugin = ({ store }) => {
store.$onAction(({ name, args, after, onError }) => {
const t = performance.now();
after(() => console.debug(`${store.$id}.${name}`, args, `${performance.now() - t} мс`));
onError((e) => report(e));
});
store.$subscribe((mutation, state) => localStorage.setItem(`pinia:${store.$id}`, JSON.stringify(state)));
};
const pinia = createPinia().use(logger);
declare module "pinia" { export interface PiniaCustomProperties { $api: ApiClient } } // типизация добавленных свойствPersist (pinia-plugin-persistedstate):
pinia.use(piniaPluginPersistedstate);
export const useSettings = defineStore("settings", () => { /* ... */ }, {
persist: { key: "settings", storage: localStorage, pick: ["theme", "locale"] }, // только нужные поля
});Что сохранять: тему, язык, черновики, выбранные фильтры. Чего не сохранять: токены доступа в localStorage без осознанного решения (XSS), персональные данные, кэш сервера.
Другие возможности: $state (замена состояния), pinia.state.value (SSR-гидратация), defineStore с hydrate, HMR (acceptHMRUpdate), тестирование (createTestingPinia), setActivePinia вне компонентов.
Нюансы и подводные камни
- Не забывайте, что при SSR состояние сериализуется: только JSON-совместимое.
- Persist при изменении структуры стора ломает старые сохранённые данные: версионируйте ключи, миграции.
- Плагины выполняются для каждого стора — используйте фильтр по
store.$id. - Токены лучше хранить в
HttpOnlycookie.
Практика
- Настройте
persistдля темы и языка, исключив чувствительное. - Напишите плагин логирования actions.
- Реализуйте версионирование сохранённого состояния.
Вопросы с ответами
Что делает
storeToRefs?Превращает state и getters стора в
ref, чтобы деструктурировать без потери реактивности.
Что нельзя хранить в persist?
Секреты и чувствительные данные (токены, персональные данные) без защиты; кэш серверных данных.