Javascript Can';t在不可变记录中正确设置此嵌套对象
设置平面对象不可变记录没有问题。但现在我有一个问题,我想在哪里设置一个记录,我想可能是一个记录列表?我试图将firebase数据库中的用户ref放入一个或多个不可变的记录中 因此,我从firebase加载我的用户引用。它的结构看起来像 我不知道如何嵌套列表。用户有一个UID列表。从那里它变得更平坦了。但这有可能有一个记录列表吗?我还没有在网上看到任何例子,所以我在这一点上迷失了方向。任何帮助都将不胜感激 如果我在做一些更平淡的事情,比如说只是个人资料,那看起来会是这样的Javascript Can';t在不可变记录中正确设置此嵌套对象,javascript,reactjs,firebase,redux,immutable.js,Javascript,Reactjs,Firebase,Redux,Immutable.js,设置平面对象不可变记录没有问题。但现在我有一个问题,我想在哪里设置一个记录,我想可能是一个记录列表?我试图将firebase数据库中的用户ref放入一个或多个不可变的记录中 因此,我从firebase加载我的用户引用。它的结构看起来像 我不知道如何嵌套列表。用户有一个UID列表。从那里它变得更平坦了。但这有可能有一个记录列表吗?我还没有在网上看到任何例子,所以我在这一点上迷失了方向。任何帮助都将不胜感激 如果我在做一些更平淡的事情,比如说只是个人资料,那看起来会是这样的 export co
export const Profile = Record({
key: null,
profileName: '',
profilePic: '',
teamName: '',
});
似乎要通过UID列表是我面临的第一个挑战,我很难通过。一旦超过了最初的列表,它就更加平淡了
也许我甚至不应该这样做。我对其他人提出如何处理这些数据持开放态度。我只是习惯于在我的应用程序中使用不可变的记录。我希望在这最后一点上能坚持这种模式 到目前为止,基本上还没有记录列表。根据我所能找到的,您可以使用带有记录值的map,并根据答案扩展记录类,以获得与您想要的等价物(下面的代码基于此方法) 我还可以找到一篇有趣的文章,其中有多种方法,以功能的方式表达相同的想法 如果这不是你所期望的,请告诉我
var用户={
“efbluh”:{
“个人资料”:{
档案名称:'比尔',
图片:'https://blue',
团队名称:“本地人”,
},
“团队”:{
“Lpphasd”:{
竞争性:“a”
}
}
},
“fixbluh”:{
“个人资料”:{
档案名称:'比尔',
图片:'https://blue',
团队名称:“本地人”,
},
“团队”:{
“Lpphasd”:{
竞争性:“a”
},
“asdsadasda”:{
竞争性:“b”
}
}
}
};
var ProfileRecord=不可变的.Record({
档案名称:“”,
简介图片:'',
团队名称:“”,
});
var teamRecord=不可变的.Record({
竞争性:''
});
类用户扩展了Immutable.Record({'profile':new ProfileRecord(),'team':Immutable.Map()}){
构造函数({profile,team}={}){
super({team:Immutable.Map(team).Map(x=>newteamrecord(x)),profile:newprofilerecord(profile)})
}
}
var userMap=Immutable.Map(users.Map)(x=>newuser(x));
//确认它确实是一个记录
console.log(userMap.get('efbluh').get('profile').profileName)
log(userMap.get('fixbluh').toJS())
console.log(userMap.get('fixbluh').get('team').toJS())
到目前为止,基本上还没有记录列表。根据我所能找到的,您可以使用带有记录值的map,并根据答案扩展记录类,以获得与您想要的等价物(下面的代码基于此方法)
我还可以找到一篇有趣的文章,其中有多种方法,以功能的方式表达相同的想法
如果这不是你所期望的,请告诉我
var用户={
“efbluh”:{
“个人资料”:{
档案名称:'比尔',
图片:'https://blue',
团队名称:“本地人”,
},
“团队”:{
“Lpphasd”:{
竞争性:“a”
}
}
},
“fixbluh”:{
“个人资料”:{
档案名称:'比尔',
图片:'https://blue',
团队名称:“本地人”,
},
“团队”:{
“Lpphasd”:{
竞争性:“a”
},
“asdsadasda”:{
竞争性:“b”
}
}
}
};
var ProfileRecord=不可变的.Record({
档案名称:“”,
简介图片:'',
团队名称:“”,
});
var teamRecord=不可变的.Record({
竞争性:''
});
类用户扩展了Immutable.Record({'profile':new ProfileRecord(),'team':Immutable.Map()}){
构造函数({profile,team}={}){
super({team:Immutable.Map(team).Map(x=>newteamrecord(x)),profile:newprofilerecord(profile)})
}
}
var userMap=Immutable.Map(users.Map)(x=>newuser(x));
//确认它确实是一个记录
console.log(userMap.get('efbluh').get('profile').profileName)
log(userMap.get('fixbluh').toJS())
console.log(userMap.get('fixbluh').get('team').toJS())
希亚姆的建议绝对正确,所以这是公认的答案。如果你有需要的话,大多数人都应该能够接受。然而,如果你像我一样,使用firebase与redux和选择器,这就是Shyams建议对我的作用。我并不是说这是你见过的react/redux/Selector中最纯粹的例子,但它对我很有用
不用再麻烦了
最初,我通过redux操作和reducer获得用户
我的action和action creators从firebase获取数据,并从我拥有的一些高级firebase db函数中将其最初存储在键值不可变记录中
import*作为“/actionTypes”中的类型;
从“不可变”导入{Record};
从'src/firebase'导入{FirebaseList};
导出常数联盟=新记录({
key:null,
值:null
})
export const leagueFireDB=新FirebaseList({
加载:加载联盟成功,
},联盟);
导出函数loadLeague(){
log(“LOADLEAGUE::”);
返回调度=>{
leagueFireDB.path=`users/`;
leagueFireDB.subscribeChild(派遣);
};
}
导出函数LoadLeagueSucces(league){
console.log(“LEAGUElOADSuccess::”,league);
返回{
类型:types.LOAD\u LEAGUE\u SUCCESS,
有效载荷:联盟
};
}
希亚姆的建议绝对正确,所以这是公认的答案。如果你有需要的话,大多数人都应该能够接受。然而,如果你像我一样,使用firebase与redux和选择器,这就是Shyams建议对我的作用。我并不认为这是最纯粹的例子