简体   繁体   English

上下文 userdata 是 useEffect 挂钩中的空对象

[英]Context userdata is an empty object in useEffect hook

I have a problem in my code.我的代码有问题。 useEffect cant read imported object. useEffect 无法读取导入的对象。 As you see user object is imported from another context.如您所见,用户对象是从另一个上下文导入的。 When i try to use this user object in useEffect of DataContext it returns an empty object.当我尝试在 DataContext 的 useEffect 中使用此用户对象时,它返回一个空对象。 I think useEffect is rendered before that state has a value but I don't have idea how to fix it.我认为 useEffect 在该状态具有值之前呈现,但我不知道如何修复它。 I want to access user.email in useEffect instead of email(iashviligiorgi3@gmail.com) so firebase will filter emails and give me the object of current user.我想在 useEffect 中访问 user.email 而不是 email(iashviligiorgi3@gmail.com),因此 firebase 将过滤电子邮件并给我当前用户的对象。 Thanks.谢谢。 I am begginer and don't know a lot of things yet.我是初学者,还不知道很多事情。

DataContext.js :数据上下文.js:

 import { createContext, useContext, useEffect, useState } from "react"; import { db, storage, storedb } from "../firebase"; import { uid } from "uid"; import { set, ref, onValue } from "firebase/database"; import { doc, setDoc, updateDoc, collection, addDoc, query, where, getDocs, getDoc, onSnapshot, collectionGroup, limit, } from "firebase/firestore"; import { ref as storageref, uploadBytesResumable, getDownloadURL, } from "firebase/storage"; import { useUserAuth } from "./UserAuthContext"; const dataContext = createContext(); export function DataContextProvider({ children }) { const { user } = useUserAuth(); const [category, setCategory] = useState(""); const [contactnumber, setContactNumber] = useState(""); const [description, setDescription] = useState(""); const [price, setPrice] = useState(""); const [sellername, setSellerName] = useState(""); const [title, setTitle] = useState(""); const [imageurl, setImageUrl] = useState(""); const [imageUpload, setImageUpload] = useState(null); const [imageuploaddone, setImageUploadDone] = useState(""); // Data for Users and Items const [items, setItems] = useState([]); const [userdata, setUserData] = useState([]); console.log(items); const userUid = user ? user.uid : null; const uploadImage = async () => { try { const uuid = uid(); if (imageUpload == null) return; const imageRef = storageref( storage, `images/${uuid} + ${imageUpload.name}` ); const uploadTask = uploadBytesResumable(imageRef, imageUpload); uploadTask.on( "state_changed", (snapshot) => { // progrss function .... const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100; setImageUploadDone("Upload is " + progress.toFixed() + "% done"); }, (error) => { // error function .... console.log(error); }, () => { // complete function .... getDownloadURL(uploadTask.snapshot.ref).then((downloadURL) => { setImageUrl(downloadURL); }); } ); } catch (error) { throw error; } }; const writeToDatabase = () => { const uuid = uid(); const docRef = doc(storedb, "users", user.email); const colRef = collection(docRef, "items"); addDoc(colRef, { uuid, category, contactnumber, description, price, sellername, title, userUid, imageurl, }); setTitle(""); setCategory(""); setContactNumber(""); setDescription(""); setPrice(""); setSellerName(""); setImageUrl(""); }; const changeHandler = () => { writeToDatabase(); }; useEffect(() => { if (user) { console.log(user); } const docRef = doc(storedb, "users", "iashviligiorgi3@gmail.com"); const docSnap = getDoc(docRef).then((doc) => { console.log(doc.data()); }); // const useremailref = collection(storedb, "users"); // const q = query(useremailref, where("email", "==", user.email)); // const getquery = getDocs(q).then((collection) => { // setUserData(collection.docs.map((doc) => doc.data())); // }); const itemsCollection = collectionGroup(storedb, "items"); const data = getDocs(itemsCollection).then((collection) => { setItems(collection.docs.map((doc) => doc.data())); }); console.log(items); }, []); return ( <dataContext.Provider value={{ category, setCategory, contactnumber, setContactNumber, description, setDescription, price, setPrice, sellername, setSellerName, title, setTitle, imageurl, setImageUrl, changeHandler, items, setImageUpload, uploadImage, setImageUploadDone, imageuploaddone, imageUpload, userdata, }} > {children} </dataContext.Provider> ); } export function useDataContext() { return useContext(dataContext); } // import { useState, createContext, useContext } from "react"; // const dataContext = createContext(); // export function DataContextProvider({ children }) { // const data = "1245r1"; // return ( // <dataContext.Provider value={{ data }}>{children}</dataContext.Provider> // ); // } // export function useDataContext() { // return useContext(dataContext); // }

UserAuthContext.js : UserAuthContext.js:

 import { createContext, useContext, useEffect, useState } from "react"; import { createUserWithEmailAndPassword, signInWithEmailAndPassword, onAuthStateChanged, signOut, GoogleAuthProvider, signInWithPopup, sendEmailVerification, } from "firebase/auth"; import { auth } from "../firebase"; import { storedb } from "../firebase"; const userAuthContext = createContext(); export function UserAuthContextProvider({ children }) { const [user, setUser] = useState({}); function emailVerification() { return sendEmailVerification(auth.currentUser); } function logIn(email, password) { return signInWithEmailAndPassword(auth, email, password); } function signUp(email, password) { return createUserWithEmailAndPassword(auth, email, password); } function logOut() { return signOut(auth); } function googleSignIn() { const googleAuthProvider = new GoogleAuthProvider(); return signInWithPopup(auth, googleAuthProvider); } useEffect(() => { const unsubscribe = onAuthStateChanged(auth, (currentuser) => { // console.log("Auth", currentuser); setUser(currentuser); }); return () => { unsubscribe(); }; }, []); return ( <userAuthContext.Provider value={{ user, logIn, signUp, logOut, googleSignIn, emailVerification }} > {children} </userAuthContext.Provider> ); } export function useUserAuth() { return useContext(userAuthContext); }

App.js :应用程序.js:

 import React from "react"; import ReactDOM from "react-dom/client"; import "./index.css"; import App from "./App"; import { UserAuthContextProvider } from "./context/UserAuthContext"; import { DataContextProvider } from "./context/DataContext"; import { SearchContextProvider } from "./context/SearchContext"; const root = ReactDOM.createRoot(document.getElementById("root")); root.render( <UserAuthContextProvider> <DataContextProvider> <SearchContextProvider> <App /> </SearchContextProvider> </DataContextProvider> </UserAuthContextProvider> );

You have to add currentuser to dependency array, so when value of current user will change useEffect will be re-render and assign new value to user state您必须将currentuser添加到依赖数组,因此当当前用户的值发生变化时,useEffect 将重新渲染并为用户状态分配新值

useEffect(() => {
    const unsubscribe = onAuthStateChanged(auth, (currentuser) => {
      // console.log("Auth", currentuser);
      setUser(currentuser);
    });

    return () => {
      unsubscribe();
    };
  }, [currentuser]);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM