【问题标题】:Firebase query with React Native not showing on my screen (but showing on console.log)带有 React Native 的 Firebase 查询未显示在我的屏幕上(但显示在 console.log 上)
【发布时间】:2018-11-28 03:03:16
【问题描述】:

我的数据按预期显示在 console.log 上,但不在我的屏幕上。 这是控制台日志的屏幕截图。

这是我的代码:

componentWillMount = () => {
this.getData();
}

getData(){
  const { currentUser } = firebase.auth();
    firebase
    .database()
    .ref(`/users/${currentUser.uid}/data/`)
    .orderByKey()
    .on('child_added', snap =>  {

      //Is this correct or does it need to be formatted a different way?
      snap.key, 
      snap.val().Weight 

      //note that the console logs below displays the data
      console.log(snap.key)
      console.log(snap.val().Weight)

    }) 
}

renderRow = () => {
  return (
    <View style={[styles.card, styles.cardBorderTop]}>
      <Text>
        {snap.key} //Is this the correct way to reference this value?
      </Text>
      <Text style={[styles.textRight]}>
        {snap.val().Weight} //Is this the correct way to reference this value?
      </Text>
    </View>
  )
}

  render() {
    return (
      <View style={[styles.container]}>
        <FlatList
          data={this.getData} //Is this the correct data reference?
          renderItem={this.renderRow} 
        />
      </View>
    );
  }
}

这就是我的屏幕呈现方式。请注意,我希望数据呈现在 FlatList 上。

任何帮助将不胜感激。

附带说明一下,我现在意识到我需要将日期存储为 ISO-8601,以便它们可以正确排序,我将在弄清楚如何获取查询数据以呈现在我的屏幕。

更新 我意识到我的问题并不像我预期的那么清楚,对此我深表歉意。我需要的是能够通过 date keyWeight child 查询我的数据。我可以在控制台上使用 snap.key 和 snap.val().Weight 成功地做到这一点,但是看起来这不是在我的 FlatList 上显示数据所需的正确参考,这就是我需要帮助的地方.

作为参考,这是我的 Firebase 数据库:

【问题讨论】:

  • 数据显示方式有什么问题?
  • 在控制台日志上很好,但它没有使用 FlatList 显示在我的屏幕上。我更新了原始帖子以包含我的空白屏幕。我的代码中遗漏了一些东西。查看 renderRow 函数和 FlatList 数据参考。有点不对劲。
  • 我真的不太确定这应该做什么:{ snap.key, snap.val().Weight console.log(snap.key + snap.val().Weight + 'LBS') }。这应该返回给调用者什么?你觉得你的来电者在这里data={this.getData}是如何使用它的?
  • snap.key 按控制台日志中的预期返回我的密钥。例如:FRI NOV 16 2018 MON NOV 12 2018 等...并且 snap.val().Weight 还按预期返回 Weight 子数据。例如: 175 171 但是,看起来这不是能够在平面列表上显示我的数据所需的正确代码。它是否正确? .on('child_added', snap => { snap.key, snap.val().Weight })

标签: javascript firebase react-native firebase-realtime-database


【解决方案1】:

您的 getData 函数目前不返回任何内容,因此虽然视图可能会调用 getData(),但它什么也得不到。

但简单地添加return 语句将无济于事,因为数据是异步加载的。在 React 中,您应该将数据置于组件的状态中(通过调用 setState()),然后在渲染器中使用它。

在代码中:

componentWillMount = () => {
  this.setState({ data: [] });
  this.getData();
}

getData(){
  const { currentUser } = firebase.auth();
  firebase
    .database()
    .ref(`/users/${currentUser.uid}/data/`)
    .orderByKey()
    .on('child_added', snap =>  {
      var data = this.state.data;
      data.push({ key: snap.key, weight: snap.val().Weight });
      this.setState({ data: data });
    }) 
}

所以这个:

  • 将状态中的data 属性初始化为空数组。
  • 将每个来自数据库的新项目添加到 data

有了这个,你可以渲染数据数组:

renderRow = ({item}) => {
  return ( 
    <View style={[styles.card, styles.cardBorderTop]}> 
      <Text> 
        {item.key} 
      </Text> 
      <Text style={[styles.textRight]}>
        {item.Weight} 
      </Text>
    </View>
  )
}

render() {
  return (
    <View style={[styles.container]}>
      <FlatList
        data={this.state.data}
        renderItem={this.renderRow} 
      />
    </View>
  );
}

最后一位可能包含语法错误,因为我从未使用过FlatList。如有疑问,请与后者here 的文档进行比较。

【讨论】:

  • 谢谢你一如既往的弗兰克。我不得不将 (item) 更改为 ({item}) 并且它都按预期呈现。我有一个跟进但相关的问题。我创建了一个新密钥,在我的情况下是一个日期,但该密钥的权重子项不存在,所以现在我得到一个“无法读取 null 属性‘数据’。我知道 Firebase 有一个 snap.exists 函数,它我正在尝试实施但没有运气并不断收到错误。如果重量孩子不存在,我基本上不希望密钥出现在我的列表中。任何帮助将不胜感激。谢谢!
  • 很高兴听到基本方法有效。请对我的答案进行您需要做的任何编辑,以便其他人可以更轻松地从中复制/粘贴。 :-) 我可能需要查看新问题的代码,所以请发布一个新问题(这也使得其他人更有可能提供帮助)。
  • 我在上面 Frank 提供的代码中添加了 ({item}) 编辑,并将 componentWillMount 置于状态内以避免我在here 中讨论过的重新渲染问题@
猜你喜欢
  • 2020-07-24
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 2022-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多