【问题标题】:Duplicated data coming from Firebase Firestore in React Native来自 React Native 中 Firebase Firestore 的重复数据
【发布时间】:2020-08-02 22:29:44
【问题描述】:

我正在尝试从 Firestore 中的数据库加载一些数据,但我不明白为什么该变量会从中加载重复的文档。

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

我正在我的函数 seleccionarTest() 中加载完整的集合,我想加载带有两个文档(test1 和 test2)的 var 测试,我稍后将在 Touchable Flat List 中使用它们。

查看函数:

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>
);

}

不幸的是,正如您在下一个屏幕截图中看到的那样,我在 console.log 中的 var 有 4 个文档(test1、test2、test1、test2),我不明白为什么这些文档会重复。

感谢您的 cmets!

【问题讨论】:

  • 您的 seleccionarTests 函数是否在其他地方的代码中多次调用?如果不能解决此问题,请在输入 seleccionarTests 函数或在 promise 解析时清除 tests 数组,这样您可以保证在开始推送数据之前数组为空。
  • 谢谢,Ralemos。此解决方法解决了该问题。我仍然需要了解为什么该函数被调用两次,并且此信息被重复添加到变量中。

标签: react-native google-cloud-firestore


【解决方案1】:

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

为了解决这个问题,您需要在每次执行函数时清除数组,执行以下操作:

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);
    });
} 

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

【讨论】:

  • 谢谢@ralemos。我认为答案没有解决问题,也不适用,因为函数没有这种方法可以应用。我需要做一些进一步的调查。
  • 你不使用 react 吗? React 确实有 this.setState() 方法。此外,解释为什么应该清除数组的答案部分仍然适用。
  • 我使用的是 React-native 但不使用类,而不是函数,“this”指的是一个类。另外,我认为该解决方案更接近于linguinecode.com/post/… 之类的东西,并且该功能被重新渲染了很多次,但我不明白为什么。我相信将变量设置为空并不能解决为什么会呈现两次的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多