使用router.query作为Next.js中useEffect的依赖项[关闭]

yx2lnoni  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(118)

已关闭。此问题需要更多focused。它目前不接受回答。
**希望改进此问题?**更新问题,使其仅针对editing this post的一个问题。

4天前关闭。
Improve this question
我正在做一个Next.js项目,有一个组件使用useEffect钩子来根据URL中的查询参数执行一些操作。我注意到useEffect钩子有一个可选的第二个参数,一个依赖数组,它决定了什么时候应该重新运行效果。由于我希望每当查询参数更改时都执行效果,因此我考虑使用router.query作为useEffect hook中的依赖项。然而,我不确定这是否是一个好的做法,是否有任何潜在的陷阱。
下面是我的代码的简化版本:

import { useEffect, useState } from 'react';
import { useRouter } from 'next/router';

function MyComponent() {
  const router = useRouter();
  const [data, setData] = useState(null);

  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await axios.get(`/api/data/${router.query.id}`);
        setData(response.data);
      } catch (error) {
        console.error('Error fetching data:', error);
      }
    };

    fetchData();
    // I want this effect to run whenever the query parameters change.
  }, [router.query]);

  // Rest of the component...
}

字符串
我的问题是:
1.在useEffect hook中使用router.query作为依赖项是一个好的实践吗?是否有任何我应该注意的潜在性能或其他问题?
1.使用router.query作为依赖项有什么含义?它是否会导致效果过度重复运行,或者它是否被优化为仅在必要时触发?
1.是否有其他方法可以在不使用router.query作为useEffect中的依赖项的情况下实现相同的结果?
我想确保我的代码遵循最佳实践,并且我的组件的行为既有效又正确。任何关于如何处理这种情况的见解或建议将不胜感激。
谢谢你,谢谢

2hh7jdfx

2hh7jdfx1#

您也可以使用文档中的router.isReady
isReady:boolean -路由器字段是否已在客户端更新并可供使用。只应在useEffect方法内部使用,而不应用于在服务器上有条件地呈现。

import { useRouter } from 'next/router';
import { useEffect, useState } from 'react';

function MyComponent() {
   const router = useRouter();
   const [data, setData] = useState(null);

   useEffect(() => {
      const fetchData = async () => {
         try {
            const response = await axios.get(`/api/data/${router.query.id}`);
            setData(response.data);
         } catch (error) {
            console.error('Error fetching data:', error);
         }
      };
      if (router.isReady && router.query.id) {
         fetchData();
      }
      // I want this effect to run whenever the query parameters change.
   }, [router.isReady, router.query.id]);

   // Rest of the component...
}

字符串

相关问题