【问题标题】:How do I loop all Firebase children in React Native?如何在 React Native 中循环所有 Firebase 子项?
【发布时间】:2018-04-06 11:42:32
【问题描述】:

在帖子底部回答 (另见@soutot 答案)

我已经成功地从我的Firebase 代码中获得了文本输出,所以我知道它有效。现在我需要循环Firebase 中的所有孩子。来自 swift 的方法是将每个项目存储在 tempObject 上,然后将其附加到数组中。然后,您可以以任何您喜欢的方式简单地使用该数组。这似乎不适用于JavaScript,或者我做错了什么。我现在拥有的功能齐全的 FB 代码是:

componentDidMount(){
    let child = "" 
    var ref = firebase.database().ref("testCategory");

    ref.once("value")
    .then(function(snapshot) {
        child = snapshot.child("test1/testHeader").val() 
        this.setState( {    
            child
        })
    }.bind(this)); 
}

然后我可以在控制台或<Text> 中成功打印此内容。现在,我遇到的问题是循环所有子项,将它们添加到数组中,然后使用该数组显示数据。在我看来,它应该是这样工作的:

componentDidMount(){
    let child = "" 
    var ref = firebase.database().ref("testCategory");

    ref.once("value")
    .then(function(snapshot) {
        snapshot.forEach(function(childSnapshot){
           let tempObject = MyFirebase
           tempObject.testHeader = 
           childSnapshot.val() 

           myArray.append(tempObject) //or .push???
        })
        this.setState( {    //PASSING VARIABLE TO STATE
            child   
        })
    }.bind(this)); //BINDING TO SET STATE
}

我知道这显然是错误的。创建这样的对象甚至都行不通...MyFirebase -class 看起来像这样:

render() {
let testHeader = ""
let testText = ""   
)
}

我的Firebase 数据库如下所示: (我暂时忽略了 subText)

非常感谢所有建议:)

工作代码

 //FIREBASE CODE 
componentDidMount(){
    const ref = firebase.database().ref("testCategory");

    ref.once("value")
    .then(function(snapshot) {
        const categories = []

        //LOOPING EACH CHILD AND PUSHING TO ARRAY
        snapshot.forEach(item => {

            const temp = item.val();
            categories.push(temp);
            return false;
        });

        this.setState( {    //PASSING VARIABLE TO STATE
            child,
            categories
        })
    }.bind(this)); //BINDING TO SET STATE
}

【问题讨论】:

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


【解决方案1】:

根据您提供的代码,到目前为止它似乎可以工作

var ref = firebase.database().ref("testCategory");

    ref.once("value")
    .then(function(snapshot) {

我说的对吗?

从现在开始,如果您添加一个console.log(snapshot.val()),它可能会打印一个对象数组,如下所示: [ { test1: { testHeader: 'FirstHeader', testText: 'FirstText' } }, { test2: { testHeader: 'SecondSub', testText: 'SecondSub } }]

对吗?

如果是这样,例如,您可以将此快照存储到您的状态中,然后在您的渲染方法中使用此状态。像这样的:

const ref = firebase.database().ref('testCategory');

ref.once('value').then((snapshot) => {
  this.setState({ categories: snapshot.val() });
});

然后在你的渲染方法中:

const { categories } = this.state;

categories.map(category => <Text>{category.testHeader}</Text>)

屏幕上的结果应该是: 第一个标题 二次元

如果这有帮助,请告诉我

一些链接可以解释更多关于我在这个例子中使用的 es6 代码:

数组映射categories.map(...):https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

对象解构const { categories } = this.state:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

const 代替 var const ref = ...: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const

setState:https://reactjs.org/docs/state-and-lifecycle.html

箭头函数(snapshot) =&gt; ...:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

关于 Firebase 快照的一些信息:https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot

希望对你有帮助

【讨论】:

  • 非常感谢您的帮助。没有完全让它工作,因为数组倾向于存储 JSON 数据而不是数组变量,如果这有意义的话。也许我误解了你帖子的某些部分。无论如何,您的帖子对您​​有很大帮助,并且使用 forEach 得到了正确的帮助。见我上面的帖子。 :)
  • 太好了,很高兴知道你能应付。查看您的代码,将来可能会出现一些小问题。 JS 同步工作,如果您有大量项目,您的代码可能会在您的 forEach 循环遍历所有项目之前调用 setState。也许你需要它是异步的。为此,您需要使用async/await 告诉您的代码等到forEach 完成后再进行下一步。类似:.then(async function(snapshot) (...) await snapshot.forEach (...) 文档:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 感谢您的信息,我一定会考虑到这一点! :)
猜你喜欢
  • 1970-01-01
  • 2019-01-14
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
相关资源
最近更新 更多