Home > Blockchain >  variable undefined in useEffect
variable undefined in useEffect

Time:06-11

I am trying to use the value of currentUser in the function inside of the useEffect Hook, but the value seems not to be the user's object, that I want it to be when using it. Here is the code:

function Chat() {   

    const currentUser = useAuth()

    useEffect(() => {
        const fetchParticipants = async () => {
            console.log(currentUser.uid) // not defined
        }
        fetchParticipants()
    }, [])
}

That is the useAuth() function that is being called

export function useAuth() {
    const [ currentUser, setCurrentUser ] = useState();

    useEffect(() => {
        const unsub = onAuthStateChanged(auth, user => setCurrentUser(user));
        return unsub;
    }, [])

    return currentUser;
}

CodePudding user response:

The initial value of currentUser is going to be undefined because that is what you (don't) pass to the state when you set it up in your hook.

So the effect is first going to run with undefined as the value of currentUser.

Later, the onAuthStateChanged will trigger and update the state.

This will trigger a re-render and currentUser will be the value you want.

However, your effect will not re-run because the dependency array is []. You need to tell it to re-run the function when the value updates.

useEffect(() => {
    const fetchParticipants = async () => {
        console.log(currentUser.uid) // not defined
    }
    fetchParticipants()
}, [currentUser]) // <-------------------- Dependancy array

CodePudding user response:

I would instead have a primitive inside the dep's array and a check before invoking the function

useEffect(() => {
  const fetchParticipants = async () => {
     console.log(currentUser.uid)
  }
  if(currentUser.id){
    fetchParticipants();
  }
}, [currentUser.id]) 
  • Related