在本机应用中,我正在使用redux。目前整个应用程序都有单个商店,我使用redux-persist将商店缓存到localstorage。
我的应用程序受用户名和密码保护,您必须创建帐户才能使用它。
现在我想提供能力,以便我的用户可以在他的帐户之间切换 - 如果他有多个帐户 - 。这会造成很多麻烦,因为现在每次用户在帐户之间切换时我都必须清除存储和重置状态。
所以我考虑的可能是我可以使用多个商店,每个用户一个?
例如我的app状态看起来像
{
chat:{},
highscores:{},
gameHistory:{},
}
现在,如果用户有帐号,请说User1@gmail.com
状态将填充他的数据。他的州将被保存到LocalStorage,
一旦他将帐户切换到User2@gmail.com
,我现在必须将应用程序重置为其initialState,然后以某种方式从localStorage加载User2状态
我不希望每次用户在帐户之间切换时都会丢失应用程序的状态。
所以我考虑可能在这种情况下使用多个Redux商店是一个很好的选择,每个用户都有一个。
有没有人有过一款专为以前多用户设计的应用? 我们怎样才能在redux中做到这一点?
答案 0 :(得分:0)
我不认为每个用户都有一个商店是个好主意。请参阅此答案:https://stackoverflow.com/a/33633850/3794660
为什么不按用户ID命名缩减器中的数据?像这样:
{
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选择器将数据传递给组件。通过这种方式,您可以封装逻辑以从状态中检索数据,而您的组件不需要了解这些详细信息,因此您可以根据需要随意更改策略。
答案 1 :(得分:0)
以上的答案很好,但由于我使用的是ImmutableJs,因此拥有一个深层嵌套的对象真的很难处理。
所以我最终使用user_id为存储密钥命名空间。
所以现在当我切换用户时,我只是用localStorage或AsyncStorage中的这个specefic用户数据刷新整个商店。
我在一个简单的reducer中包装了rootReducer来处理这个问题。
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;
}
}