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
相关产品推荐
相关产品推荐

