You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
import{createStore,createEvent}from'effector'importpersistfrom'effector-localstorage'constinc=createEvent()constdec=createEvent()const$counter=createStore(0).on(inc,(state)=>state+1).on(dec,(state)=>state-1)// persist store in `localStorage`persist({store: $counter,key: 'counter',})
store (Store): Store to synchronize with localStorage.
key (string): Key for localStorage, to store value in.
def?: (any): Default value, which will be passed to store in case of absent storage value. Default = store.defaultState.
fail? (Event | Effect): Event or Effect, which will be triggered in case of any error (serialization/deserialization error, storage is full and so on).
LocalStorage supports storing only plain strings. Because of that it is required to do value serialization for persisting and string deserialization for restoring the value, if your value is more complex, than just plain string.
effector-localstorage uses JSON.stringify for serialization and JSON.parse for deserialization.
You cannot change it.
These methods has some limitations, because of JSON specification:
Only simple types supported, which are valid JSON values
While you can use effector-localstorage in SSR environment, this will not throw an exception in runtime, BUT persist function will trigger fail (if you passed it) if localStorage and/or addEventListener are not available. If your business logic does not rely on fail, you can safely ignore this behaviour — persist will do nothing with store value on server side.
Note though, that you will probably want to add serialize:'ignore' to persisted stores, so server value will not interfere with browser value.
Complex behaviour
effector-localstoragedoes one thing well, and we would like to leave this package in its "state of an art" status.
The only valid reason to increase package size — is to fix an issue, but not new functionality.
If you know, how to reduce package size without breaking tests — PRs are welcome :)
If your business logic requires more complex behaviour, like custom serialization/deserialization, support for sessionStorage or other storages, like IndexedDB, or reactive pick-ups from non-reactive storage — take a look on effector-storage package.
effector-localstorage's API was intentionally changed in order for effector-storage to be "drop-in" replacement for it. You can just replace import and here you go, ready to enrich your application:
- import persist from 'effector-localstorage'+ import { persist } from 'effector-storage/local'
Contributors
Thanks goes to these wonderful people (emoji key):