使用多个redux为每个应用程序用户存储一个



在react native应用程序中,我使用redux。目前整个应用程序有一个商店,我使用redux-persist缓存存储到本地存储。

我的应用程序是用户名和密码保护,你必须创建帐户使用它。

现在我想提供功能,以便我的用户可以在他的帐户之间切换-如果他有多个帐户-。这造成了很多麻烦,因为现在每次用户在帐户之间切换时,我都必须清除存储并重置状态。

所以我在考虑是否可以使用多个商店,每个用户一个?

例如,我的应用程序状态看起来像

{
  chat:{},
  highscores:{},
  gameHistory:{},
}

现在,如果一个用户有帐户,比如User1@gmail.com,状态将用他的数据填充。他的状态将被保存到LocalStorage,

一旦切换帐户到User2@gmail.com,现在我必须将应用程序重置为其initialState,然后以某种方式从localStorage加载User2状态

我不希望每次用户切换帐户时应用程序的状态都会丢失。

所以我在考虑可能在这种情况下,使用多个Redux store是一个很好的选择,每个用户一个。

以前有人设计过供多人使用的应用吗?如何在redux中做到这一点?

上面的答案很好,但是因为我使用的是ImmutableJs,所以嵌套很深的对象真的很难处理。

所以我最终用user_id来命名存储键

所以现在当我切换用户时,我只是用localStorage或AsyncStorage中的特定用户数据刷新整个存储。

我把rootReducer包装在一个简单的reducer中来处理这个问题。

function makeRootReducer(rootReducer){
 return function reducer(state, action){
   if(action.type==='SWITCH_USER'){
      //LOAD USER DATA..
      const data = JSON.parse(localStorage.getItem("store.user."+action.id)||"{}");
      return makeInitialData(data); //this just return initialData.
    }
    let newState = rootReducer(state, action);
    //simple save state to localStorage if state changed
    if(state !== newState)localStorage.setItem('store.user.'+state.user_id',JSON.stringify(newState);
    return newState;
  }
}

我不认为每个用户都有一个商店是个好主意。查看这个SO答案:https://stackoverflow.com/a/33633850/3794660

为什么不用用户id来命名reducer中的数据呢?像这样:

{
  currentUserId: "1",
  chat:{ "1": { // Chats for user id 1 }, "2": { // Chats for user id 2 }},
  highscores:{ // Same structure as above },
  gameHistory:{ // Same structure as above },
}

当您切换用户帐户时,只需更新状态中的currentUserId。

我建议使用选择器来封装从存储区读取数据的逻辑。

获取当前帐户的所有聊天记录的简单选择器如下所示:

const getCurrUserId = state => state.currentUserId
const getChats = state => {
   const userId = getCurrUserId(state);
   return state.chat[userId];
}

然后在mapStateToProps中使用简单的getChats选择器将数据传递给组件。通过这种方式,您封装了从状态中检索数据的逻辑,并且您的组件不需要知道这些细节,因此如果需要,您可以自由地更改策略。

相关内容

  • 没有找到相关文章

最新更新