zoukankan      html  css  js  c++  java
  • 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 来解决这种问题
     
     

  • 相关阅读:
    jeecg 笔记之 自定义显示按钮 (exp 属性)
    jeecg 笔记之 自定义word 模板导出(一)
    jeecg 默认为空的字段值是如何被填充的?
    算法题——立方体的体对角线穿过多少个正方体?
    借用Snippet插件美化博客中的代码
    用PS设计等高线效果的背景图片
    算法题——投篮比赛获胜概率问题
    计算机中的颜色XIV——快速变换颜色的V分量
    算法实践——Twitter算法面试题(积水问题)的线性时间解法
    UI设计实战篇——利用Bootstrap框架制作查询页面的界面
  • 原文地址:https://www.cnblogs.com/ellen-mylife/p/15410016.html
Copyright © 2011-2022 走看看