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

[core] support conditional storage

Open wxhccc opened this issue 3 years ago • 6 comments

Sometimes we need to use a path to determine whether another path needs to be persisted, so I suggest to expanding the options.paths

type CheckStateProp = (store: PiniaPluginContext['store']) => boolean
type PropPath = string | [string, CheckStateProp]


...
// when use
paths: ['a', ['b', (store) => store.a === true]]

if a is true, b will persisted, otherwise not persisted b

wxhccc avatar Jun 14 '22 02:06 wxhccc

Hi, i'm still considering adding per-path persistence config as suggested in #19 , could that be part of it, a per-path like this:

persist: [
{
  path: 'a'
},
{
  path: 'b',
  persist: (store) => store.a === true
}
]

or smth like that

This would be part of a V2, for advanced use

prazdevs avatar Jun 14 '22 09:06 prazdevs

it's all right. but I don't think it is good way. for example:

persist: [
{
  path: 'a',
  beforeRestore: () => {},
  afterRestore: () => {},
  serializer: {
    serialize: JSON.stringify,
    deserialize: JSON.parse,
  }
},
{
  path: 'b',
  persist: (store) => store.a === true,
  beforeRestore: () => {},
  afterRestore: () => {},
  serializer: {
    serialize: JSON.stringify,
    deserialize: JSON.parse,
  }
}
]

i need to pass other properties in every item. zhuzhengshou want to to separate state values to localstorage and sessionstorage at the same time when state change.

wxhccc avatar Jun 15 '22 02:06 wxhccc

hmm i see what you mean, i kinda saw a good opportunity as both feature ideas are linked to per-path config

prazdevs avatar Jun 15 '22 20:06 prazdevs

ok i may have an exampls that could help you?

    persist: {
      serializer: {
        deserialize: JSON.parse,
        serialize: (state) => {
          const { a, b } = state
          const toStore = a ? { a, b } : { a }
          return JSON.stringify(toStore)
        }
      }
    },

You can use the serializer to define conditions for elements to be persisted or not. I think that's the best way to do it without adding "too much" to the plugin :)

Let me know if that helped

prazdevs avatar Sep 07 '22 07:09 prazdevs

ok i may have an exampls that could help you?

    persist: {
      serializer: {
        deserialize: JSON.parse,
        serialize: (state) => {
          const { a, b } = state
          const toStore = a ? { a, b } : { a }
          return JSON.stringify(toStore)
        }
      }
    },

You can use the serializer to define conditions for elements to be persisted or not. I think that's the best way to do it without adding "too much" to the plugin :)

Let me know if that helped

yes, it works. but if i need to use custom serializer to do some complex questions, I prefer write a local pinia plugin to do this.

wxhccc avatar Sep 08 '22 01:09 wxhccc

You can always define an external function that returns the state to store from the current state, and have concerns separated this way.

prazdevs avatar Sep 08 '22 11:09 prazdevs

Closing this as it has a workaround, and probably won't see an implementation in the current situation. Feel free to propose new stuff :)

prazdevs avatar Nov 13 '22 15:11 prazdevs