如何在React Native中使用带有过滤数据的多个Flatlists

时间:2017-10-20 02:43:53

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

如何创建多个只显示一种“状态”数据的平面列表?

例如:

  • 状态的一个单位列表==='inProgress'
  • 状态的一个平面列表=== '完成'
  • 状态的一个平面列表=== '失败'

所有数据都在数组'goallist'中,该数据来自Firebase数据库。

我非常感谢你对此的帮助。

import React, { Component } from 'react';
import { Text, FlatList, View, Image, TouchableOpacity, Alert } from 'react-native';
import firebase from 'firebase';
import { Button, Card, CardSection } from '../common';
import styles from '../Styles';

class List extends Component {

    static navigationOptions = {
        title: 'List',
    }

    constructor(props) {
        super(props);

        this.state = {
            goallist: '',
            loading: false,
    };
  }

componentDidMount() {
    this.setState({ loading: true });
    const { currentUser } = firebase.auth();
    const keyParent = firebase.database().ref(`/users/${currentUser.uid}/goalProfile`);
    keyParent.on(('child_added'), snapshot => {
      const newChild = {
           key: snapshot.key,
           goal: snapshot.val().goal,
           status: snapshot.val().status
        };
        this.setState((prevState) => ({ goallist: [...prevState.goallist, newChild] }));
        console.log(this.state.goallist);
        });

this.setState({ loading: false });
}

onRenderItem = ({ item }) => (
    <TouchableOpacity onPress={this.showAlert}>
        <Text style={styles.listStyle}>
             { item.goal } { item.key }
        </Text>
    </TouchableOpacity>
);

showAlert = () => {
    Alert.alert(
        'Did you succeed or fail?',
        'Update your status',
   [
        { text: 'Completed?',
              onPress: () => console.log('Completed Pressed'),             },
        { text: 'Failed?',
              onPress: () => console.log('Failed Pressed'),
        },
        { text: 'Cancel',
              onPress: () => console.log('Cancel Pressed'),
              style: 'cancel' },
   ],
       { cancelable: false }
   );
}

keyExtractor = (item) => item.key;

render() {
  return (
    <Card>

      <View style={{ flex: 1 }}>
       <FlatList
          data={this.state.goallist}
          keyExtractor={this.keyExtractor}
          extraData={this.state}
          renderItem={this.onRenderItem}
        />
      </View>

    </Card>
    );
  }
}

export { List };

1 个答案:

答案 0 :(得分:1)

您只需要修改onRenderItem函数以呈现如下的某些特定对象(此Flatlist仅显示inProgress对象):

onRenderItem = ({ item }) => {
  if (item.type === 'inProgress') {
    return (
      <TouchableOpacity onPress={this.showAlert}>
        <Text style={styles.listStyle}>
          { item.goal } { item.key }
        </Text>
      </TouchableOpacity>
    )
  } else { return null; }
};