当前位置: 首页 > 知识库问答 >
问题:

无效的钩子调用。当我在useEffect中调用useQuery时,只能在函数组件的主体内部调用挂钩

郎子平
2023-03-14

我在我的react项目中使用apollo graphql,我得到的错误是

无效的钩子调用。钩子只能在函数组件的主体内部调用

这是我的代码

import React, { useEffect, useState, useCallback } from "react";
import { useDispatch, useSelector } from "react-redux";

// **************** COMPONENTS ****************
import { GET_MORTGAGE_JOURNEY } from "../../../../Graphql/Journeys/query";

export default function index() {
  const insuranceId = useSelector((state) => state.mortgage.insuranceId);

  // Panels Heading to show on all panels

  useEffect(() => {
    if (insuranceId) {
      getMortgageData(insuranceId);
    }
  }, [insuranceId]);

  function getMortgageData(insuranceId) {
    const { loading, error, data } = useQuery(GET_MORTGAGE_JOURNEY, {
      variables: { id: insuranceId },
    });
    console.log(data);
  }

  return <section className="mortage-journey"></section>;
}

一旦我运行了这个程序,我就得到了错误,我知道useQuery本身就是一个钩子,我不能从内部useEffect调用它,但是接下来应该怎么解决这个问题,因为我需要首先从我的redux状态中获取insuranceId并将其发送到查询。

谢谢

共有1个答案

劳和雅
2023-03-14

当您从React组件的顶层以外的任何地方调用它时,您都违反了钩子规则。

使用一个回调函数,并从该函数调用钩子。这是个问题。

我在useQuery中找到了这个skip选项,它帮助您有条件地调用useQuery

 useEffect(() => {
    const { loading, error, data } = 
    useQuery(GET_MORTGAGE_JOURNEY, {
      variables: { id: insuranceId },
      skip : (!insuranceId)
    });
  }, [insuranceId]);

每当fianceId更改时,回调都会运行,因此它会在挂载后运行一次,然后在后续更改上运行。

 类似资料:
  • 我想使用React在表中显示一些记录,但我得到了这个错误: 无效的挂接调用。钩子只能在函数组件的主体内部调用。这可能是以下原因之一: 您可能有不匹配的React和渲染器版本(如React DOM) 你可能违反了钩子规则 在同一个应用程序中可能有多个React副本,请参阅有关如何调试和修复此问题的提示。

  • 问题内容: 我是React的新手,现在我想在表中显示一些记录,现在出现此错误。请帮帮我。 无效的挂接调用。挂钩只能在功能组件的主体内部调用。发生这种情况可能是由于以下原因之一:1.您的React和渲染器版本可能不匹配(例如React DOM)2.您可能违反了《胡克规则》 3.您可能在其中包含多个React版本相同的应用程序请参阅有关如何调试和解决此问题的提示。 问题答案: 因为你。在此处查看更多信

  • 我收到这个错误”无效的钩子呼叫。钩子只能在函数组件的主体内部调用。“当我尝试运行我的函数时。我试图运行一个脚本,生成reCaptcha令牌脚本如下: 这个组件应该生成令牌(这是我得到错误的地方) 在另一个组件中,我调用了前面的脚本组件,并传递了一个动作类型,但是我得到了提到的react钩子错误(仅显示相关代码)。 我想问题在于我调用/使用导入组件的方式,但我找不到解决方案?

  • 我在使用hook时遇到此错误。我有它的基本形式,查看react文档作为参考,但仍然得到这个错误。我已经准备好面对掌心时刻。。。

  • 我得到以下错误,不确定我在箭头函数内实例化 react 钩子时做错了什么: 错误:挂接调用无效。钩子只能在函数组件的主体内部调用。这可能是由于以下原因之一: 您可能有不匹配的React和渲染器版本(如React DOM)。 您可能违反了钩子的规则。 同一应用程序中可能有多个React副本。请参阅https://reactjs.org/link/invalid-hook-call有关如何调试和修复此

  • 如何在钩子的if块中调用redux操作: 我有两个选择框。如果此人在选择框中键入,我将的选定id存储在状态中。如果用户选择了一个组,我将它存储在中,所以只有在两个条件都匹配的情况下,我才需要调用APIendpoint来获取。 如果我注释这段代码,就没有错误。如何使代码片段工作?