React native 来自React Native中Firebase Firestore的重复数据
我试图从Firestore中的数据库中加载一些数据,但我不知道为什么该变量从中加载重复的文档 在Firestore中,我有一个包含两个元素的集合,test1和test2,如下面的屏幕截图所示 我正在我的函数seleccialtest()中加载完整的集合,我想用两个文档(test1和test2)加载var测试,稍后我将在一个可触摸的平面列表中使用这两个文档 请参见功能: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
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”引用一个类。另外,我认为解决方案更接近于这样的情况,函数被重新呈现了很多次,但我不明白为什么。我认为将变量设置为空并不能解决为什么呈现两次的问题。