Firestore文档删除异常:自动删全量数据及TypeError问题求助
问题分析与解决方案
1. TypeError: snapShot.data().delete is not a function 错误原因
这个错误是因为你误在文档数据对象上调用了delete()方法——doc.data()返回的只是文档的纯数据(普通JS对象),根本没有delete方法。delete()是Firestore文档引用(DocumentReference)的专属方法,必须通过collection.doc(id)拿到引用后才能调用。
你的deleteFireData函数本身逻辑是对的,问题出在调用这个函数的方式上。
2. 打开页面自动删除全部数据的原因
这是因为你在渲染列表项的删除按钮时,直接执行了deleteFireData(item.id),而不是传递一个点击触发的函数。比如错误写法:
// 错误:组件渲染时会立即执行deleteFireData,遍历所有item就会批量删除 <Button onPress={deleteFireData(item.id)} title="删除" />
这种写法会在页面加载、组件渲染时,自动逐个执行每个列表项的删除函数,导致所有数据被一次性清空。
正确实现方案
步骤1:修正删除按钮的点击事件
用箭头函数包裹删除函数,确保只有点击按钮时才执行删除操作:
// 正确:点击按钮时才触发删除 <Button onPress={() => deleteFireData(item.id)} title="删除" />
步骤2:同步更新本地列表(可选但推荐)
删除Firestore数据后,建议同步更新本地userData状态,避免页面数据和数据库不一致:
const deleteFireData = (id) => { donation .doc(id) .delete() .then(() => { Alert.alert( 'Request Rejected', 'the request been deleted ' ); // 移除本地列表中已删除的项 setUserData(prevList => prevList.filter(item => item.id !== id)); }) .catch(e => console.log('删除失败:', e)) }
步骤3:排查其他错误调用
检查代码中所有调用delete()的位置,确保没有在doc.data()返回的对象上调用该方法,所有删除操作都通过collection.doc(id).delete()执行。
额外优化:简化数据获取代码
你的数据获取逻辑可以简化,避免async/await和.then()混用,保持代码风格统一:
React.useEffect(() => { const fetchData = async () => { try { const querySnapshot = await donation.orderBy('submitTime','desc').get(); const list = querySnapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); setUserData(list); } catch (error) { console.error('获取数据失败:', error); } finally { setLoading(false); } } fetchData(); }, []);
内容的提问来源于stack exchange,提问作者Mohsen Mohsen
相关产品推荐
相关产品推荐

