如何在页面刷新时使用 useEffect() 将状态设置为 运行?

How to make setting state with useEffect() to run on page refresh?

我的代码一点也不长也不复杂。这很简单。所以请阅读! (我正在使用反应 + next.js)

  1. 在根文件中,app.js,我有 useEffect 来获取照片数据。该数据数组将在页面组件中使用,因此我通过
  2. 从 app.js 向下传递它
function MyApp({ Component, pageProps }) {
  const [photoData, setPhotoData] = useState([]);
  const [user, setUser] = useState([]);


  useEffect(() => {
    const getPhotos = async () => {
      try {
        const photoData = await axios.get(
          "https://jsonplaceholder.typicode.com/albums"
        );
        setPhotoData(photoData.data);
      } catch (error) {
        console.log(error);
      }
    };

    getPhotos();
  }, []);


useEffect(() => {
         //code for finding user. no external api used.
        setUser(user);
      }
    }
  }, []);


  const passedProps = {
    ...pageProps,
     photoData,
     user
  };

  return (
            ...
          <Component {...passedProps} /> 
   )
  1. 然后我将数据(照片数据)从一个 Home 组件传递给一个(app.js 的)孙组件,一个 Photo 组件
export default function Home({ photoData, user }) {
 return(
          <Photo photoData={photoData} user={user} />
)

  1. 在 Photo 组件中,我正在接收 photoData 并尝试使用 photoData 的默认状态设置 photoArr 的状态。 首次加载整个应用程序时,photoData 成功传递到 Photo 组件,它可以毫无问题地设置状态。
    但主要问题是,当我在照片页面(照片已加载)并刷新页面时,它不会使用 photoData 设置 photoArr 的状态。即使我可以控制台记录从 app.js 收到的 photoData,它也不会使用默认状态 photoData 设置状态 photoArr。
export default function Photo({ photoData, user }) {

  const [photoArr, setPhotoArr] = useState(photoData); 
//I have this as state because I change this array 
//later on in this component (doing CRUD on the photo array).
  

 console.log(photoData); // this returns the array received from app.js
 console.log(photoArr);  // [].   returns an empty array
 console.log(user); // returns the user object received from app.js.

return (
<div>
 {photoArr.length > 0 ? 
  .... code mapping photoArr 
  : "Data is empty"       //It returns this comment when I refresh the page
}
</div>
)

正如您在上面看到的,当我刷新页面时,我得到“数据为空”,这意味着即使在给定的默认状态下 photoArr 也没有设置。如果我不断刷新页面多次,它仍然显示一个空白页面。 根据我的研究,这是由于设置状态是异步的?那么我该如何解决这个问题呢?

试试这个: (在您的照片页面中)

const [photoArr, setPhotoArr] = useState(null); 

useEffect(() => {
    if(photoData.length) setPhotoArr(photoData) // If not empty, set the Arr
},[photoData]} // We listen to photoData's change

在页面加载时,您的 photoData 中没有任何数据,当它向下传递到 Photo 组件时,React 会记住该状态。 但是使用 useEffect 监听 photoData 的变化,我们可以在 getPhotos 函数取回数据后设置 PhotoArr。