React native 来自React Native中Firebase Firestore的重复数据

React native 来自React Native中Firebase Firestore的重复数据,react-native,google-cloud-firestore,React Native,Google Cloud Firestore,我试图从Firestore中的数据库中加载一些数据,但我不知道为什么该变量从中加载重复的文档 在Firestore中,我有一个包含两个元素的集合,test1和test2,如下面的屏幕截图所示 我正在我的函数seleccialtest()中加载完整的集合,我想用两个文档(test1和test2)加载var测试,稍后我将在一个可触摸的平面列表中使用这两个文档 请参见功能: export default function AsignarTest({route, navigation}){ conso

我试图从Firestore中的数据库中加载一些数据,但我不知道为什么该变量从中加载重复的文档

在Firestore中,我有一个包含两个元素的集合,test1和test2,如下面的屏幕截图所示

我正在我的函数seleccialtest()中加载完整的集合,我想用两个文档(test1和test2)加载var测试,稍后我将在一个可触摸的平面列表中使用这两个文档

请参见功能:

export default function AsignarTest({route, navigation}){
console.log("Entrando en asignar test");
const {usuario} = route.params;

const [animacion, setAnimacion] = useState(true);
const [tests, setTests] = useState([]);

const db = firestore();

function seleccionarTests(){
    db.collection("test").get()
.then((querySnapshot) =>{       
    var i=0;
    querySnapshot.forEach((documentSnapshot)=>{
        tests.push({id:documentSnapshot.id, datos: documentSnapshot.data()});
    });
    setAnimacion(false);
    console.log(tests);
    return;
}).catch((error)=>{
    console.log(error);
    });
}

//Gestionamos cuando el usuario selecciona una peluqueria
const gestionarClick = (id)=>{
        //Todo
        console.log(id);
}

const p = seleccionarTests();

return(
    <View style={estiloGlobal.container}>
        <ActivityIndicator
            size="small"
            color = "#dd85be"
            animating = {animacion} />
        <View>
            <FlatList
                keyExtractor = {(item) => item.id}
                data={tests}
                renderItem= {({item})=> (
                    <TouchableOpacity
                        onPress={() =>{gestionarClick(item.id)}}>
                            <View style={estiloGlobal.lineaRecta}>
                                <View style={{paddingLeft: 10}}>
                                    <Text style= {estiloGlobal.botonTexto}>{item.id}</Text>
                                </View>
                            </View>
                    </TouchableOpacity>
                )} />
        </View>
    </View>
);
导出默认函数AsignarTest({route,navigation}){
console.log(“Entrando-en-asignar测试”);
const{usuario}=route.params;
常量[animation,setanimation]=useState(true);
const[tests,setTests]=useState([]);
const db=firestore();
函数selectiontests(){
db.collection(“test”).get()
.then((querySnapshot)=>{
var i=0;
querySnapshot.forEach((documentSnapshot)=>{
push({id:documentSnapshot.id,datos:documentSnapshot.data()});
});
Setanimation(假);
控制台日志(测试);
返回;
}).catch((错误)=>{
console.log(错误);
});
}
//这是一个很好的选择
const gestionarClick=(id)=>{
//待办事项
console.log(id);
}
const p=selectionatests();
返回(


感谢您的评论!

发生这种情况的原因可能是因为代码中的其他地方第二次调用了
selectiontests
函数,或者该数据实际上是以前执行的垃圾数据,从未在数组中清理过

无论采用哪种方法,都需要在每次执行函数时清除数组,如下所示:

function seleccionarTests(){
    this.setState({tests: []});
    db.collection("test").get().then((querySnapshot) =>{       
        var i=0;
        querySnapshot.forEach((documentSnapshot)=>{
            tests.push({id:documentSnapshot.id, datos: documentSnapshot.data()});
        });
        setAnimacion(false);
        console.log(tests);
        return;
    }).catch((error)=>{
        console.log(error);
    });
} 

注意:在像您这样的情况下,使用收集的所有结果填充数组以防止重复数据时,这应该始终作为一种最佳做法。

您的
selectiontests
函数是否在代码中的其他地方调用过多次?如果没有,为了解决此问题,请当您输入
seleccionaltests
函数或在promise resolve上输入
tests
数组时,您可以确保数组在开始推送数据之前是空的。谢谢,Ralemos。这一解决方法解决了这个问题。我仍然需要理解为什么函数会被调用两次,并且此信息会被添加到副本中变量。谢谢@ralemos。我认为答案没有解决这个问题,也不适用,因为函数没有this方法可以应用。我需要做进一步的调查。你不是在使用react吗?react有
this.setState()
method。另外,答案中解释为什么数组仍然适用的部分。我使用的是React native,而不是类,而不是函数和“this”引用一个类。另外,我认为解决方案更接近于这样的情况,函数被重新呈现了很多次,但我不明白为什么。我认为将变量设置为空并不能解决为什么呈现两次的问题。