Redux Persist使用

1、功能

能实现redux数据的持久化

2、安装

npm install redux-persist

3、使用

将persistReducer和persistStore添加到我们的Store

// configureStore.js 

import  {  createStore  }  from  'redux' 
import  {  persistStore ,  persistReducer  }  from  'redux-persist' 
import  storage  from  'redux-persist/lib/storage'  // 默认为localStorage for web 

// commonReducers ={auth,tag,socketIO}
import commonReducers from './reducer';
const reducers = combineReducers({
  ...commonReducers,
});

const  persistConfig  =  { 
  key : 'root' , 
  storage , 
} 

const  persistedReducer  =  persistReducer ( persistConfig , rootReducer ) 

export  default  ( )  =>  { 
  let  store  =  createStore ( persistedReducer ) 
  let  persistor  =  persistStore ( store ) 
  return  { store , persistor } 
}

 

 

1. persistReducer(config, reducer):

参数:
config
  • 所需配置: key, storage(storage默认为localStorage)
  • 值得注意的其他配置: whitelist, blacklist, version, stateReconciler, debug
reducer:任何reducer都可以使用,通常是返回顶级的reducer--combineReducers
 
返回值
一个经过处理的reducer
 

2. persistStore(store, [config, callback])

参数:
store:redux store,将做持久化存储
config: 如果要避免在调用后立即开始持久化persistStore,请设置选项 manualPersist。示例:{ manualPersist: true }然后可以在任何时候使用persistor.persist(). 如果在进行persistStore呼叫时您的存储尚未准备好,您通常希望这样做。
 
 
callback:回调函数
 
返回值:
  • 返回持久化对象

3 .persistor

  • 持久化对象由 persistStore 使用以下方法返回:
  • .purge()
  • 从磁盘清除状态并返回一个承诺
    • .flush()
  • 立即将所有挂起状态写入磁盘并返回一个承诺
    • .pause()
  • 暂停持久性
    • .persist()
  • 恢复坚持
 

可以设置黑白名单

// BLACKLIST 
const  persistConfig  =  { 
  key : 'root' , 
  storage : storage , 
  blacklist : [ 'tag' ]  // 不会被持久化
} ; 

// WHITELIST 
const  persistConfig  =  { 
  key : 'root' , 
  storage : storage , 
  whitelist : [ 'auth' ]  // 会被持久化
} ;

 

黑白名单仅作用1层,例如 whitelist : [ 'tag.name' ]是不会起作用的,只能作用到tag层
 

在应用中引入

const  App  =  ( )  =>  { 
  return  ( 
    < Provider  store = { store } > 
      < PersistGate  loading = { null }  persistor = { persistor } > 
        < RootComponent  / > 
      < / PersistGate > 
    < / Provider > 
  ) ; 
} ;

 

 
该PersistGate组件是延迟渲染,直到持久化完成,在loading = { null }中,可以替换为我们自己的loading组件:loading={<Loading />}
处理到这一步就可以在实现redux的持久化存储了,在localStorage中可以看到记录:
{
    "auth": "{\"user\":{\"token\":\"776ac3fd-fbf6-4fec-82b0-6e3a5abdced8\",\"userId\":\"6167a3cd239b8f3bc5dbc36c\",\"isAdmin\":true,\"nickname\":\"zhangm9\",\"username\":\"zhm\",\"role\":\"admin\"}}",
    "socketIO": "{\"socketIO\":null}",
    "tag": "{\"loadTagsStatus\":\"notStart\",\"tags\":[]}",
    "_persist": "{\"version\":-1,\"rehydrated\":true}"
}

 

 

 

 
从persist中的数据可以看出,当状态对象被持久化时,它会被序列化JSON.stringify()。如果状态对象的某些部分无法映射到 JSON 对象,则序列化过程可能会以意想不到的方式转换状态的这些部分。例如,JSON 中不存在javascript Set类型。当您尝试通过 序列化 Set 时JSON.stringify(),它会转换为空对象。可能不是你想要的。官方提供了Transform 来解决这种问题
 
 

posted @ 2021-10-15 10:43  ellenxx  阅读(843)  评论(0编辑  收藏  举报