pinia-plugin-persistedstate icon indicating copy to clipboard operation
pinia-plugin-persistedstate copied to clipboard

[core] Persisted state doesn't update when calling this.$reset() and then setting state values

Open christianlmc opened this issue 3 years ago • 8 comments

Minimal example:

export const useStore = defineStore('main', {
  state: () => ({
    counter: 0,
  }),
  persist: true,
  actions: {
    // If this function is not async with await on $reset, the localstorage doesn't update (even though pinia does update)
    // If F5 is pressed after setCounter has been called, counter will go back to previous state instead of 100
    setCounter100() {
      this.$reset();
      this.counter = 100
    },
  },
})

christianlmc avatar Mar 23 '22 15:03 christianlmc

Hi, what versions are you running ? I tried with the examples given in the repo (using vite + vue3) and with your exact store it works fine and properly saves counter as 100 in the storage, and rehydrates properly.

If you could provide a complete repo with your problem so it can be investigated. thanks :)

prazdevs avatar Mar 23 '22 22:03 prazdevs

Sorry it took me so long, here is an example repo of the issue

https://github.com/christianlmc/bug-pinia-plugin-persistedstate

christianlmc avatar Mar 28 '22 13:03 christianlmc

Okay, i investigated a bit, and there seems to be some off behaviour with the $reset method. The way mutations are committed is not the same on the very first time, and the following ones. If you put this in your HomeView.vue

<script setup lang="ts">
import { useCounterStore } from "@/stores/counter";
import { storeToRefs } from "pinia";

const counterStore = useCounterStore();
const { counter } = storeToRefs(counterStore);
const { setCounter100 } = counterStore;

counterStore.$subscribe((e) => { console.log(e) })


</script>

<template>
  <main>
    <button @click="setCounter100">do thing</button>
    <div style="font-size: 3rem">Counter</div>
    {{ counter }}
    <input v-model="counter" />
    <div>Look at Local Storage, on the 'Application' tab on the Inspector</div>
    <div>It shows {"counter":0} (Tested on Chrome 99)</div>
  </main>
</template>

After loading the page, the first click on the button will give you 2 subscription events, and the state will be store in localStorage properly, but if you click again, only 1 subscription event containing everything is emitted, and the state is not persisted correctly. Reloading the page resets this behaviour every time. This seems more like a pinia issue/behaviour im not aware of.

Also it seems suspiciously tied to this issue https://github.com/vuejs/pinia/issues/1129

prazdevs avatar Mar 28 '22 16:03 prazdevs

or this one https://github.com/vuejs/pinia/issues/992

prazdevs avatar Mar 28 '22 16:03 prazdevs

Thank you @prazdevs, I will keep using the await this.$reset workaround for the time being

christianlmc avatar Mar 28 '22 16:03 christianlmc

Hey there @prazdevs Is there an update on this matter? I can not make it work, even with the await. Could you maybe provide an example?

ThatDeveloper avatar Oct 05 '22 16:10 ThatDeveloper