javascript - 尽管使用 extraData,但删除最后一项后无法重新渲染 FlatList - React Native

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

我尝试重新渲染平面列表,但无法再更新,

我从实时数据库获取数据并将其作为数据 Prop 传递给 Flatlist, 并编写一个函数来从列表和数据库中删除一个项目并且工作得很好,但是当我删除列表中的最后一个项目时,我看不到空屏幕“列表”,只是保存了我删除的最后一个项目,尽管它已被删除在数据库中!

代码

import React, { Component } from 'react';
import { View, Text, StyleSheet, FlatList, ScrollView, TouchableOpacity } from 'react-native';
import firebase from "react-native-firebase";
import Icon from 'react-native-vector-icons/Ionicons';

class UserFavorites extends Component {
    constructor(props) {
        super(props);
        this.state = {
            currentUser: null,
            favorites: [],

        }
    }
    componentDidMount() {
        const currentUser = firebase.auth().currentUser.uid;
        this.setState({ currentUser });
        const favorites = firebase.database().ref(`favorites/${currentUser}`);
        favorites.on("value", (snapshot) => {
            let favorites = []
            snapshot.forEach((childSnapshot) => {
                favorites.push({
                    ProviderId: childSnapshot.val().ProviderId,
                    providerName: childSnapshot.val().providerName,
                    providerService: childSnapshot.val().providerService,
                });
                this.setState({ favorites })
            });
        });
    }
    _listEmptyComponent = () => {
        return (
            <View style={styles.container}>
                <Text style={{ alignSelf: "center" }}> No favorites Provider Found :O</Text>
            </View>
        )
    }
    render() {
        const { fav } = this.state;
        return (
            <View style={styles.container} >
                <FlatList data={this.state.favorites}
                    key={Math.random() * 1000}
                    contentContainerStyle={{ flexGrow: 1 }}
                    ListEmptyComponent={this._listEmptyComponent()}
                    extraData={this.state}
                    renderItem={({ item }) => {
                        return (
                            <ScrollView>
                                <TouchableOpacity>
                                    <View
                                        style={{
                                            flex: 1,
                                            paddingLeft: 15,
                                            paddingRight: 10,
                                            height: 105,
                                            alignItems: "center",
                                            backgroundColor: "#fafafa",
                                            flexDirection: "row",
                                            borderBottomWidth: .8,
                                            borderBottomColor: "#aaa"
                                        }}>
                                        <Icon style={{ alignSelf: "center" }} name="ios-contact" size={60} color="#1567d3" />
                                        <View style={{ flex: 1, padding: 5, flexDirection: "row" }}>
                                            <View style={{ marginLeft: 27 }}>
                                                <Text style={{
                                                    fontSize: 18,
                                                    fontWeight: "800",
                                                    fontFamily: 'Gill Sans',
                                                    color: '#000',
                                                }}>
                                                    {item.providerName}
                                                </Text>
                                                <Text style={{
                                                    fontSize: 18,
                                                    fontWeight: "800",
                                                    fontFamily: 'Gill Sans',
                                                    color: '#000',
                                                }}>
                                                    {item.providerService}

                                                </Text>
                                            </View>
                                            <View style={{ alignItems: "flex-end", justifyContent: "center", flex: 1 }}>
                                                <Icon style={{ marginRight: 20 }}
                                                    name={`ios-heart${fav ? "" : "-empty"}`}
                                                    size={35} color="#f00"
                                                    onPress={() => {
                                                        const currentUser = firebase.auth().currentUser.uid;
                                                        firebase.database().ref(`favorites/${currentUser}/${item.ProviderId}`).remove().then(() => alert("Removed"))
                                                    }}
                                                />
                                            </View>

                                        </View>

                                    </View>
                                </TouchableOpacity>
                            </ScrollView>
                        )
                    }
                    }
                    keyExtractor={(item, index) => index.toString()}
                />
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
    },
});

export default UserFavorites;

最佳答案

您要从 Firebase 中删除该项目,而不是从 Flatlist 的数据源 this.state.favorites 中删除该项目,请添加一个在从 Firebase 中删除该项目后调用的函数。

_onRemove = (_item) => { 

   this.setState({ 
     favorites: this.state.favorites.filter(item => item.ProviderId !== _item.ProviderId) 
   });
}

将要删除的项目传递给平面列表中的函数

renderItem={({ item }) => {
  return ....
   //scrollview code
   <Icon style={{ marginRight: 20 }}
    name={`ios-heart${fav ? "" : "-empty"}`}
    size={35} color="#f00"
    onPress={() => {
       const currentUser = firebase.auth().currentUser.uid;
       ....
       // firebase code
       this._onRemove(item);
    }
   />
  ....
  //rest of the code
}}

关于javascript - 尽管使用 extraData,但删除最后一项后无法重新渲染 FlatList - React Native,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56611080/

相关文章:

javascript - 按钮和div的onclick事件有什么区别?

javascript - 如何在 Vue 中将 HTML 属性与组件数据合并?

javascript - 在 promise 中设置状态时遇到困难

javascript - 输出 'NaN' 使用 ReactJS 增加状态值

react-native - 如何在 react native 项目中指定 minSdkVersion

javascript - 如何对 AJAX 调用后创建的格式化 HTML 调用 JQuery 操作?

javascript - JS : how to algorithmically highlight a diamond-shaped selection of x/y coordinates?

javascript - react 中的异步功能不会对状态变化使用react

react-native - 在 iOS 中 react native fbsdk

react-native 升级返回未定义的 'toLowerCase'