我对React有点新,并使用重新库来与Firebase一起使用。
我目前正在尝试呈现一个表,但由于我的数据在firebase中的结构,我需要从两个位置获取一个键列表 - 第一个是用户键列表团队成员,第二个是完整的用户信息。
团队节点的结构如下:/teams/team_id/userkeys
,用户信息的存储方式如下:/Users/userkey/{email, name, etc.}
我的表由两个反应组件组成:表组件和行组件。
我的表组件传递了道具teamid
,并且我使用re-base的bindToState功能来获取componentWillMount()
中的关联用户密钥。然后,我再次使用bindToState来获取完整的用户节点,如下所示:
componentWillMount() {
this.ref = base.bindToState(`/teams/${this.props.data}/members`, {
context: this,
state: 'members',
asArray: true,
then() {
this.secondref = base.bindToState('/Users', {
context: this,
state: 'users',
asArray: true,
then() {
let membersKeys = this.state.members.map(function(item) {
return item.key;
});
let usersKeys = this.state.members.map(function(item) {
return item.key;
});
let onlyCorrectMembersKeys = intersection(membersKeys, usersKeys);
this.setState({
loading: false
});
}
});
}
});
}
如您所见,我创建了membersKeys
和usersKeys
,然后使用underscore.js的交集函数来获取我的用户节点中的所有成员密钥(注意:我这样做)这是因为在某些情况下,用户将成为团队成员,但不在/Users
下。
我挣扎的部分是添加额外的rebase调用以创建完整成员数组(即来自/Users
的用户数据,用于{{1}中的键}。
编辑:我已尝试
onlyCorrectMembersKeys
但我收到错误 let allKeys = [];
onlyCorrectMembersKeys.forEach(function(element) {
base.fetch(`/Users/${element}`, {
asArray: true,
then(data) {
allKeys.prototype.concat(data);
}
});
});
我假设那是因为只有KeyCensMembersKeys还没有完全计算出来,但我正在努力寻找解决这个问题的最佳方法..
答案 0 :(得分:1)
对于任何处理这个问题的人,我似乎找到了(某种程度上)解决方案:
onlyCorrectMembersKeys.map(function(item) {
base.fetch(`/Users/${item}`, {
context: this,
asObject: true,
then(data) {
if (data) {
allKeyss.push({item,data});
this.setState({allKeys: allKeyss});
}
this.setState({loading: false});
},
onFailure(err) {
console.log(err);
this.setState({loading: false});
}
})
}, this);
}
这样可以正常工作,但是当更新users
和members
状态时,它不会更新allkeys
状态。我确信这只是因为我的反应知识水平,所以当我想出来时,我会发布解决方案。
编辑:使用listenTo而不是bindToState是正确的方法,因为bindToState的回调只被触发一次。