Home > Software engineering >  `useEffect` not being able to fetch data on component mount
`useEffect` not being able to fetch data on component mount

Time:07-09

I am trying to set an array of objects into dineIns after fetching them inside useEffect. What I understood is that there is some kind of delay in receiving the data because the state variable returns an empty array when I log it after fetching the data.

import axios from 'axios';
import React, { useEffect, useState } from 'react';
import { useNavigate } from 'react-router';
import jwtDecode from 'jwt-decode';

function CheckIns() {
  const [dineIns, setDineIns] = useState([]);

  const navigate = useNavigate();

  useEffect(() => {
    const token = localStorage.getItem('token');
    if (token) {
      const user = jwtDecode(token);
      if (!user) {
        localStorage.removeItem('token');
        navigate('/login');
      } else {
        async function UserData(user_email) {
          const user_data = await axios
            .get(`/api/users/${user_email}`)
            .then((res) => {
              const info = res.data.reservations;
              setDineIns(info);
              console.log(dineIns);
            });
        }

        UserData(user.email);
      }
    } else {
      navigate('/login');
    }
  }, []);
}

What needs to be corrected here to set the state in time?

CodePudding user response:

set state is an async operation, which log the data after set it, will log the old value.

To ensure that the data set correctly, you can use setState again

const info = res.data.reservations
setDineIns(info)
setDineIns(prev => {
  console.log(prev)
  return prev;
})

Or you can use effect with dineIns dependence.

I think your code works fine.

CodePudding user response:

You are expecting a Promise from the axios call but you are awaiting it.
Try to change your code like this:

useEffect(() => {
  const token = localStorage.getItem('token');
  if (token) {
    const user = jwtDecode(token);
    if (!user) {
      localStorage.removeItem('token');
      navigate('/login');
    } else {
      async function UserData(user_email) {
        try {
          const { data } = await axios.get(`/api/users/${user_email}`);
          setDineIns(data.reservations);
          console.log(dineIns);
        } catch (err) {
          console.log(err);
        }
      }

      UserData(user.email);
    }
  } else {
    navigate('/login');
  }
}, []);
  • Related