使用FlatList的React-Native Firebase Display对象数组

时间:2019-05-15 08:25:29

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

我正在尝试显示一些Firebase数据,但是什么也没显示。

export default class ListGroupScreen extends Component {
    constructor(){
        super();

        this.state = {
            dataArray: [],
        }

    }

    componentDidMount() {
        let that = this;

        firebase.database().ref('/groups').on('child_added', function (data){
            that.setState({
                dataArray: data.val()
            })

        })
    }

    render() {

        console.log(this.state.dataArray);
        console.log(this.state.dataArray[0]);

        return (
            <List>
                <FlatList
                    data={this.state.dataArray}
                    renderItem={({ item }) => (
                        <ListItem
                            title={<Text>{item.groupTitle}</Text>}
                            time={<Text>{item.groupTime}</Text>}
                        />
                    )}
                />
            </List>
        );
    }
}

console.log(this.state.dataArray);给我数据库中的所有项目,但是console.log(this.state.dataArray [0]);给我不确定的如下所示:enter image description here

这是数据库的样子:enter image description here

2 个答案:

答案 0 :(得分:2)

原因是.on('child_added')groups节点中的每个项目返回一个对象。

在您的情况下,您需要使用.once('value'),它将为您返回包含项的集合(对象),您必须将其转换为数组:

firebase.database().ref('/groups').once('value', function(snapshot) {
    var returnArray = [];

    snapshot.forEach(function(snap) {
        var item = snap.val();
        item.key = snap.key;

        returnArray.push(item);
    });

    // this.setState({ dataArray: returnArray })
    return returnArray;  
});

答案 1 :(得分:0)

FlatList反应本机组件期望数据props是一个数组。即使您在承包商中声明为数组,您仍将其作为对象传递;但是在componentDidMount中,您要覆盖对象。您可以将其更改为对象数组。

console.log(this.state.dataArray[0])肯定给出undefined,因为它不是数组



export default class ListGroupScreen extends Component {
    constructor(){
        super();

        this.state = {
            data: null,
        }

    }

    componentDidMount() {
       const that = this;
       firebase.database().ref('/groups').on('child_added', function (data){
            that.setState({
                data: data.val()
            })

        })
    }

    render() {

        const dataArray = Object.values(this.state.data)

        return (
            <List>
                <FlatList
                    data={dataArray}
                    renderItem={({ item }) => (
                        <ListItem
                            title={<Text>{item.groupTitle}</Text>}
                            time={<Text>{item.groupTime}</Text>}
                        />
                    )}
                />
            </List>
        );
    }
}