ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Vue.js] Vue2 => Vue3로 이전하며 Pinia가 localStorage에 데이터를 저장하지 않았던 이슈!
    Vue.js 2023. 1. 4. 14:04

    Vue2에서 Vue3로 이전하며 기존에 정상적으로 동작하던 Pinia가 데이터를 localStorage 저장하지 못했다. 사실 이슈라기 보다는 그냥 단순히 세팅의 문제였는데, 다음에 똑같은 일이 발생하지 않기 위해 기록한다!

     


    기존 package.json

      "dependencies": {
    ...
        "pinia": "...",
        "pinia-plugin-persistedstate": "...",
    ...
      },

     

    신규 package.json

      "dependencies": {
    ...
        "pinia": "...",
        "pinia-plugin-persist": "...",
    ...
      },

    우선 Pinia 데이터를 전역으로 공유하기 위해 데이터를 sessionStorage나 localStorage등에 저장하는 것을 도와주는 라이브러리를pinia-plugin-persistedstate에서 pinia-plugin-persist로 변경했다. (사실 변경하지 않아도 될 것 같은데 우선 가이드대로 했다.)

     

     

    기존 @/stores/index.ts

    import { createPinia } from "pinia";
    import piniaPluginPersistedstate from "pinia-plugin-persistedstate";
    
    const pinia = createPinia();
    pinia.use(piniaPluginPersistedstate);
    
    export default pinia;

     

    신규 @/stores/index.ts

    import { createPinia } from "pinia";
    const pinia = createPinia();
    export default pinia;

    기존에는 Pinia의 추가 라이브러리를 위처럼 @/stores/index.ts에서 세팅했는데, 새로 작성했을 때는 그렇게 하지 않고 main.ts에서만 처리했다.

     

     

    기존 main.ts

    import Vue from "vue";
    import App from "@/App.vue";
    ...
    import { PiniaVuePlugin } from "pinia";
    import pinia from "@/stores";
    
    Vue.use(PiniaVuePlugin);
    
    ...
    
    new Vue({
      pinia,
    ...
      render: (h) => h(App),
    }).$mount("#app");

     

    신규 main.ts

    import { createApp } from "vue";
    import App from "@/App.vue";
    import { createPinia } from "pinia";
    import piniaPersist from "pinia-plugin-persist";
    ...
    
    const pinia = createPinia();
    pinia.use(piniaPersist);
    
    const app = createApp(App);
    app.use(pinia);
    ...
    app.mount("#app");

    형태만 살짝 다르고 크게 다르지 않다.

     

     

    기존 user.ts (store)

    import { defineStore } from "pinia";
    
    export const useUserStore = defineStore("user", {
      state: () => {...},
      getters: {...},
      actions: {..},
      persist: true
    });

     

    신규 user.ts (store)

    import { defineStore } from "pinia";
    
    export const useUserStore = defineStore("user", {
      state: () => {...},
      getters: {...},
      actions: {..},
      persist: {
        enabled: true,
        strategies: [{ storage: localStorage }],
      },
    });

    위를 보면 persist 옵션이 살짝 다르다. 기존 라이브러리는 persist: true만 돼 있으면 localStorage를 default로 사용하는데, 이 라이브러리는 위처럼 localStorage를 사용하고 싶으면 localStorage를 명시해줘야한다.(default: sessionStorage)

     

     

    결과 :

    위 처럼 'user'를 key로한 데이터가 localStorage에 잘 저장이 된다!

    'Vue.js' 카테고리의 다른 글

    [Vue.js] useVModel 사용하며 겪은 이슈  (0) 2022.06.18

    댓글