【问题标题】:React infinity loop when making HTTP calls using useEffect使用 useEffect 进行 HTTP 调用时反应无限循环
【发布时间】:2020-12-20 15:56:09
【问题描述】:

我正在尝试在 React 组件中进行 2 个 HTTP 调用,然后该组件将为使用 useState 定义的 2 个属性调用 setter。为了防止无限重新渲染,我遵循了我认为正确的方法,但这仍然在发生。这是我的代码:

function Dashboard({ history = [] }) {
  const [teamInfo, setTeamInfo] = useState(null);
  const [survey, setSurvey] = useState(null);
  const [open, setOpen] = useState(false);
  const user = getUser();

  const getSurveyHandler = async () => {
    const surveyResponse = await getSurveys('standard');
    setSurvey(surveyResponse.data);
  };
  const getTeamInfoHandler = async () => {
    const teamInfoResponse = await getTeamInfo(user.teamId);
    setTeamInfo(teamInfoResponse);
  };     

  useEffect(() => {
    document.body.style.backgroundColor = '#f9fafb';

    getSurveyHandler();
    getTeamInfoHandler();
  }, [survey, teamInfo]);

如您所见,我已经在 useEffect 之外定义了函数,并将两个状态变量传递到将检查以防止无限重新渲染的依赖数组中。 谁能明白为什么这仍然发生?

谢谢

【问题讨论】:

  • 依赖数组中的状态变量导致此处无限渲染。

标签: reactjs http infinite-loop


【解决方案1】:

您在函数中设置surveyteamInfo,并在useEffect 中依赖它们。

useEffect 每次依赖项更改时都会运行。您正在设置它们,导致重新渲染。由于它们发生了变化,useEffect 再次运行,再次设置它们。循环继续。

你需要删除那些。

 useEffect(() => {
    document.body.style.backgroundColor = '#f9fafb';

    getSurveyHandler();
    getTeamInfoHandler();
  }, []);

唯一推荐的另一件事是将async 函数移到useEffect 中,除非您需要从组件中的其他位置调用它们。

useEffect(() => {
    const getSurveyHandler = async () => {
        const surveyResponse = await getSurveys('standard');
        setSurvey(surveyResponse.data);
    };
    const getTeamInfoHandler = async () => {
        const teamInfoResponse = await getTeamInfo(user.teamId);
        setTeamInfo(teamInfoResponse);
    };
    document.body.style.backgroundColor = '#f9fafb';

    getSurveyHandler();
    getTeamInfoHandler();
}, []);

【讨论】:

  • 知道了。谢谢。我是 React 的新手(来自 Angular),所以对我来说都是全新的!
  • 不用担心,您需要一分钟的时间来了解它。我自己处理了一些无限循环。
  • 这么说。我已经按照您的建议修改了代码,但我仍然遇到问题:(还有其他可能导致它的原因吗?
  • 您是否重建以确保它没有运行旧代码。如果你的依赖数组中没有任何内容,它应该只运行一次。
  • 知道了!将空数组放回固定它。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 2018-11-18
  • 2022-01-12
  • 2021-01-20
  • 2020-01-31
  • 2020-10-27
相关资源
最近更新 更多