从Firebase获取正确的路径时出错

时间:2018-12-04 04:52:20

标签: javascript reactjs firebase firebase-realtime-database

我是新手,我正在努力从Firebase获取列表。但是我一直坚持给对象提供路径。我不知道如何给事件ID的路径,如图所示。 enter image description here

这是我要提供正确路径的代码。任何帮助将不胜感激。

firebase.database().ref('/events').child('/friends').once('value').then((snapshot) =>{
    let data = snapshot.val();
    let items = object.values(data);
    allUserList.push(items);
    this.setState({allFriendList: allFriendList});

}

我有多个按键,请参见图片 enter image description here

这是我要在其中显示好友列表的单位列表的代码

<FlatList style={{}} keyboardShouldPersistTaps={'always'}
data={this.state.allFriendList}
ItemSeparatorComponent={this.renderSeparator}
renderItem={({ item }) => {
        return (
        <TouchableOpacity onPress={() => this.goToNextScreen(item)}>
        <View style={{
                flexDirection: 'row', paddingBottom: 5, paddingTop: 5,
                justifyContent: 'space-between', alignItems: 'center'
            }}>
    }
}

3 个答案:

答案 0 :(得分:2)

您可以在参考文件中完成完整的路径:

firebase.database().ref('/events/friends/whatever-key')
    .once('value').then((snapshot) =>{
        /// Whatever code
    });

答案 1 :(得分:1)

如果您想显示某个事件的朋友列表,并且知道该事件的关键,则可以执行以下操作:

let eventKey = '-LRuFQAsleScaEK2MqXu';
let eventRef = firebase.database().ref('events').child(eventKey);
eventRef.child('friends').once('value').then((snapshot) =>{
  let allFriendList = [];
  snapshot.forEach((friendSnapshot) => {
    let data = friendSnapshot.val();
    allUserList.push(data);
  });
  this.setState({allFriendList: allFriendList});
});

一些更改:

  • 此代码仅侦听特定路径/events/-LRuFQAsleScaEK2MqXu/friends。实际上,它本可以使用该路径来监听,即firebase.database()。ref('/ events / -LRuFQAsleScaEK2MqXu / friends')。once('value'...
  • 从中获得的snapshot包含多个朋友,因此我们以snapshot.forEach()对其进行循环。
  • 将所有朋友添加到列表中后,我们将调用setState通知React。

在注释中,您表示希望合并所有朋友列表,您可以使用以下方法进行

let eventsRef = firebase.database().ref('events');
eventRef.once('value').then((snapshot) =>{
  let allFriendList = [];
  snapshot.forEach((eventSnapshot) => {
    eventSnapshot.child('friends').forEach((friendSnapshot) => {
      let data = friendSnapshot.val();
      allUserList.push(data);
    });
  });
  this.setState({allFriendList: allFriendList});
});

但是我高度建议针对此用例更改/增强您的数据模型。该代码可能有效,但读取的数据量超出了所需。如果同一位朋友出现在更多事件中,则它也可能正在读取重复的朋友。如果您想要一个全局的朋友列表,则可以将其精确地存储在数据库中:一个用户列表,其中可能包含与他们成为朋友的事件的事件ID。

答案 2 :(得分:0)

使用[key]方法的个人喜好非常适合自定义键名。

例如,如果您知道密钥,data.[key].name将产生结果。

如果您不知道该键(LRjSl...),则可以遍历friends对象:

for (var key in data) {
    data[key].name //will be Shabnam
}