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

React Native+Firebase Firestore个人待办清单:解决待办全员可见问题

解决用户专属待办清单问题

要实现每个用户仅查看和管理自己的待办事项,需要从数据关联、查询过滤、安全规则三个层面处理,以下是具体修改方案:

1. 添加待办时关联当前用户ID

在创建待办文档时,存入当前登录用户的UID,作为用户专属标识:

const addDailyPlan = () => {
    // 获取当前登录用户
    const currentUser = firebase.auth().currentUser;
    if (!currentUser) {
        alert("请先登录");
        return;
    }

    if (addDailyTodo && addDailyTodo.length > 0) {
        const timeStamp = firebase.firestore.FieldValue.serverTimestamp();
        const daily = {
            heading: addDailyTodo, // 修复原代码变量名错误
            createdAt: timeStamp,
            userId: currentUser.uid // 新增用户ID字段
        };
        dailyRef
            .add(daily)
            .then(() => {
                setAddDailyTodo('');
                Keyboard.dismiss();
            })
            .catch((error) => {
                alert(error);
            })
    }
}

2. 查询时过滤当前用户的待办事项

修改监听逻辑,只获取与当前用户UID匹配的待办文档:

useEffect(() => {
    const currentUser = firebase.auth().currentUser;
    if (!currentUser) return;

    // 订阅当前用户的待办数据
    const unsubscribe = dailyRef
        .where('userId', '==', currentUser.uid) // 过滤当前用户的待办
        .orderBy('createdAt', 'desc')
        .onSnapshot(querySnapShot => {
            const dailys = []
            querySnapShot.forEach((doc) => {
                const { heading } = doc.data()
                dailys.push({ // 修复原代码数组操作错误,避免直接修改状态变量
                    id: doc.id,
                    heading,
                })
            })
            setDailysTodo(dailys)
        })

    // 组件卸载时取消订阅,防止内存泄漏
    return () => unsubscribe();
}, [])

3. 设置Firestore安全规则(核心防护)

仅靠代码过滤不够,必须通过Firestore规则防止用户非法访问他人数据。打开Firebase控制台的Firestore规则页面,替换为以下规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /daily/{docId} {
      allow read, write: if request.auth != null && request.auth.uid == resource.data.userId;
    }
  }
}

规则说明:只有已登录用户,且操作的文档userId与自身UID一致时,才能进行读写操作。

额外代码修复

  • 原代码中addDailyPlan里的heading: addDaily是变量名错误,改为addDailyTodo
  • 原useEffect中直接修改状态变量dailysTodo.push的操作错误,改为向临时数组dailys添加数据
  • 添加订阅取消逻辑,避免组件卸载后内存泄漏

内容的提问来源于stack exchange,提问作者Ulaş Kara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:15:37