从Firebase Array-Like读取数据

时间:2018-05-03 18:44:48

标签: javascript reactjs firebase firebase-realtime-database

我在Firebase中有一个模型,保存方式如下:

my model at firebase

我在componentDidMount中获取数据,如下所示:

fetchMatches = async () => {
   const { firebaseApp, auth, pool } = this.props;


     await firebaseApp.database()
       .ref(`/pools/${pool.key}/users/${auth.uid}/`)
       .once('value')
       .then(snapshot =>{
         this.setState({matches:snapshot.val()})
       })  
 }

问题是,我的状态成为一个对象:不是数组,不是列表。

如何以正确的方式读取此数据,我可以根据属性过滤它。

当我尝试

let matches = this.state.matches;
    for (let index = 0; index < matches.length; index++) {
      const element = matches[index];
      console.log(element);
    }

不行。

当我尝试使用this.state.matches.map()时,他们说这不是一个函数。它真的不像我的调试器this.state.matches是一个OBJECT。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

当您使用once函数获取数据时,它返回该特定ref的对象,在这种情况下,它将返回此$ {auth.uid}数据作为对象。 所以你可能想把你的ref改成一点:ref(/pools/${pool.key}/users/${auth.uid}/matches), 然后根据firebase文档https://firebase.google.com/docs/database/web/lists-of-data#listen_for_value_events

循环匹配子项
await firebaseApp.database()
    .ref(`/pools/${pool.key}/users/${auth.uid}/matches`)
    .once('value')
    .then(snapshot =>{
      snapshot.forEach(function(childSnapshot) {
       var childKey = childSnapshot.key;
       var childData = childSnapshot.val();
       // ...
    });
})