Git Product home page Git Product logo

redux-persist's Introduction

Redux Persist

Persist and rehydrate a redux store.

Redux Persist is performant, easy to implement, and easy to extend.

npm i redux-persist

build status npm version npm downloads

Note: These docs apply to redux-persist v5. v4 will be supported for the forseeable future, and if it works well for your use case you are encouraged to stay on v4.

Usage

API Docs

import { persistStore, persistReducer } from 'redux-persist'
import storage from 'redux-persist/es/storage' // default: localStorage if web, AsyncStorage if react-native
import rootReducer from './rootReducer'

const config = {
  key: 'root', // key is required
  storage, // storage is now required
}

const reducer = persistReducer(config, rootReducer)

function configureStore () {
  // ...
  let store = createStore(reducer)
  let persistor = persistStore(store)
  
  return { persistor, store }
}

Additionally if you are using react, it is recommended you use the provided PersistGate component for integration. This will take care of delaying the rendering of the app until rehydration is complete.

class App extends Component {
  //...
  render() {
    return (
      <PersistGate 
        persistor={persistor} 
        loading={<Loading />}
        >
        {/* rest of app */}
      </PersistGate>
    )
  }
}

v5 Breaking Changes

There are three important breaking changes.

  1. api has changed as described in the above migration section
  2. state with cycles is no longer serialized using json-stringify-safe, and will instead noop.
  3. state methods can no longer be overridden which means all top level state needs to be plain objects. redux-persist-transform-immutable will continue to operate as before as it works on substate, not top level state.

Additionally v5 does not yet have typescript bindings.

Migration from v4 to v5

WARNING v4 stored state is not compatible with v5. If you upgrade a v4 application, your users will lose their stored state upon upgrade. You can try the (highly) experimental v4 -> v5 state migration if you please. Feedback appreciated.

Standard Usage:

  • remove autoRehydrate
  • changes to persistStore:
      1. remove config argument (or replace with an empty object)
      1. remove all arguments from the callback. If you need state you can call store.getState()
      1. All constants (ex: {REHYDRATE, PURGE}) has moved to redux-persist/lib/constants instead of redux-persist/constants
  • add persistReducer to your reducer
    • e.g. let persistedReducer = persistReducer(config, reducer)
  • changes to config:
    • key is now required. Can be set to anything, e.g. 'primary'
    • storage is now required. For default storage: import storage from 'redux-persist/lib/storage'

Recommended Additions

  • use new PersistGate to delay rendering until rehydration is complete
    • import { PersistGate } from 'redux-persist/lib/integration/react'
  • set config.debug = true to get useful logging

If your implementatation uses getStoredState + createPersistor see alternate migration

Why v5

Long story short, the changes are required in order to support new use cases

  • code splitting reducers
  • easier to ship persist support inside of other libs (e.g. redux-offline)
  • ability to colocate persistence rules with the reducer it pertains to
  • first class migration support
  • enable PersistGate react component which blocks rendering until persistence is complete (and enables similar patterns for integration)
  • possible to nest persistence
  • gaurantee consistent state atoms
  • better debugability and extensibility

Migrations

persistReducer has a general purpose "migrate" config which will be called after getting stored state but before actually reconciling with the reducer. It can be any function which takes state as an argument and returns a promise to return a new state object.

Redux Persist ships with createMigrate, which helps create a synchronous migration for moving from any version of stored state to the current state version. [Additional information]

Experimental v4 to v5 State Migration

  • warning: this method is completely untested
  • v5 getStoredState is not compatible with v4, so by default v5 will cause all of the persisted state from v4 to disappear on first run
  • v5 ships with an experimental v4 -> v5 migration that works by overriding the default getStoredState implementation Warning this is completely untested, please try and report back with any issues.
import getStoredStateMigrateV4 from 'redux-persist/lib/integration/getStoredStateMigratev4'
// ...
persistReducer({
  // ...
  getStoredState: getStoredStateMigrateV4(yourOldV4Config)
}, baseReducer)

Storage Engines

Transforms

Transforms allow for arbitrary state transforms before saving and during rehydration.

  • immutable - support immutable reducers
  • compress - compress your serialized state with lz-string
  • encrypt - encrypt your serialized state with AES
  • filter - store or load a subset of your state
  • filter-immutable - store or load a subset of your state with support for immutablejs
  • expire - expire a specific subset of your state based on a property
  • custom transforms:
import { createTransform, persistReducer } from 'redux-persist'

let myTransform = createTransform(
  // transform state coming from redux on its way to being serialized and stored
  (state, key) => specialSerialize(state, key),
  // transform state coming from storage, on its way to be rehydrated into redux
  (state, key) => specialDeserialize(state, key),
  // configuration options
  {whitelist: ['specialKey']}
)

const reducer = persistReducer({transforms: [myTransform]}, baseReducer)

redux-persist's People

Contributors

actra-gschuster avatar af avatar andarist avatar andreaspsson avatar brownbl1 avatar cbayram avatar cretezy avatar davidblurton avatar domlazic avatar doxxx avatar dsernst avatar dxiao avatar edy avatar fkrauthan-hyperwallet avatar gabceb avatar gasp avatar greenkeeperio-bot avatar handtrix avatar ianvs avatar jasonmerino avatar joeybaker avatar klathmon avatar lkay avatar marvinhagemeister avatar morlay avatar rt2zz avatar rufman avatar scic avatar unindented avatar zalmoxisus avatar

Watchers

 avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.