React中useEffect无法读取Context中user对象的问题求助
问题:DataContext中useEffect无法获取UserAuthContext的user对象
我是React新手,在DataContext的useEffect钩子中尝试使用从UserAuthContext导入的user对象时,返回空对象。推测useEffect在user状态赋值前就执行了,希望用user.email替代硬编码的iashviligiorgi3@gmail.com,让Firebase过滤邮箱获取当前用户对象。
解决方案
1. 给useEffect添加user依赖项
原useEffect的依赖数组为空,只会在组件挂载时执行一次,而Firebase的onAuthStateChanged是异步触发的,此时user还未完成赋值。将user加入依赖数组,当user状态更新时,useEffect会自动重新执行:
useEffect(() => { // ... 业务逻辑代码 }, [user]); // 添加user到依赖数组
2. 先判断user有效性再执行查询
因为user初始值为空对象(或null),直接访问user.email会触发错误,所以要先做存在性校验:
useEffect(() => { // 只有当user存在且包含email字段时才执行后续逻辑 if (!user?.email) return; // 替换硬编码邮箱为user.email,获取对应用户文档 const docRef = doc(storedb, "users", user.email); getDoc(docRef).then((doc) => { if (doc.exists()) { console.log(doc.data()); } else { console.log("未找到对应用户文档"); } }); // 启用之前注释的用户数据查询(适用于users集合用字段存储email的场景) const useremailref = collection(storedb, "users"); const q = query(useremailref, where("email", "==", user.email)); getDocs(q).then((collection) => { setUserData(collection.docs.map((doc) => doc.data())); }); // 获取所有items的逻辑保持不变 const itemsCollection = collectionGroup(storedb, "items"); getDocs(itemsCollection).then((collection) => { setItems(collection.docs.map((doc) => doc.data())); }); }, [user]);
3. 优化UserAuthContext的初始user状态(可选)
将UserAuthContext中user的初始值从{}改为null,可以让用户登录状态的判断更直观:
// UserAuthContext.js中修改初始状态 const [user, setUser] = useState(null);
这样在DataContext中直接通过if (user)就能判断用户是否完成认证。
内容的提问来源于stack exchange,提问作者Giorgi Iashvili
相关产品推荐
相关产品推荐

