You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:25:25