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

获取此错误“钩子调用无效。只能在函数组件主体内部调用钩子。”在功能组件内部?

南宫阳焱
2023-03-14

我收到这个错误”无效的钩子呼叫。钩子只能在函数组件的主体内部调用。“当我尝试运行我的函数时。我试图运行一个脚本,生成reCaptcha令牌脚本如下:

这个组件应该生成令牌(这是我得到错误的地方)

import * as React from 'react'
import { RECAPTCHA_KEY } from '../../../utils/env'

// @ts-ignore
declare const window: any

interface RecaptchaProps {
  actionType: string
}
export const RecaptchaGen = ({ actionType }: RecaptchaProps) => {
  const siteKey = RECAPTCHA_KEY
  const [loaded, setLoaded] = React.useState(false)
  React.useEffect(() => {
    const scriptTag = document.createElement('script')
    scriptTag.src = 'https://www.google.com/recaptcha/api.js?render=' + siteKey
    document.appendChild(scriptTag)

    return () => {
      scriptTag.remove()
      setLoaded(false)
    }
  }, [siteKey])

  React.useEffect(() => {
    if (!loaded) return
    window.grecaptcha.ready(function () {
      window.grecaptcha
        .execute(siteKey, {
          action: actionType,
        })
        .then(function (token: string) {
          //reCaptch token generated needs to be sent to the back end for validation
          console.log(token)
        })
    })
  }, [loaded, actionType, siteKey])
}

在另一个组件中,我调用了前面的脚本组件,并传递了一个动作类型,但是我得到了提到的react钩子错误(仅显示相关代码)。

import * as React from 'react'
import { RecaptchaGen } from '../../../components/_molecules/Recaptcha'

const onLoginClick = () => {
    RecaptchaGen({ actionType: 'login' })
  }

我想问题在于我调用/使用导入组件的方式,但我找不到解决方案?

共有3个答案

纪晨
2023-03-14

名称RecaptchaGen表明它是构造函数或组件,但两者都不是。它是一个自定义挂钩,因此应该以use开头,例如:useRecaptchaGen。

下面是如何在组件中使用它:

export const useRecaptchaGen = (action) => {
  if (!action) {
    return;
  }
  const { actionType }: RecaptchaProps = action;
  //....rest of your code
};

const Component = () => {
  const [action, setAction] = React.useState(false);
  const onLoginClick = () => {
    setAction({ actionType: 'login' });
  };
  //cannot conditionally call hooks
  useRecaptchaGen(action);
};
柳奇思
2023-03-14

您正在使用常规js函数中的useffecthook。

挂钩只能在有效的react组件内调用RepcaptchaGen不是react组件,因为它没有使用react组件特定的东西,比如返回一些jsx

高展
2023-03-14

我不熟悉你的具体用例,但是一个常见的模式是将一些效果逻辑封装到一个由你的自定义钩子返回的函数中,然后任何正常的JS函数(回调与否)都可以调用该函数。

>

返回一个函数以基本替换第二个useffect回调。

export const useRecaptchaGen = ({ actionType }: RecaptchaProps) => {
  const siteKey = RECAPTCHA_KEY
  const [loaded, setLoaded] = React.useState(false)
  React.useEffect(() => {
    const scriptTag = document.createElement('script')
    scriptTag.src = 'https://www.google.com/recaptcha/api.js?render=' + siteKey
    document.appendChild(scriptTag)

    return () => {
      scriptTag.remove()
      setLoaded(false)
    }
  }, [siteKey]);

  const generateRecaptcha = () => {
    if (!loaded) return;
    window.grecaptcha.ready(function () {
      window.grecaptcha
        .execute(siteKey, {
          action: actionType,
        })
        .then(function (token: string) {
          //reCaptch token generated needs to be sent to the back end for validation
          console.log(token)
        })
    })
  };

  return { generateRecaptcha };
}

在组件中,使用新的钩子和解构generateRecaptcha

const { generateRecaptcha } = useRecaptchaGen({ actionType: 'login' });

onLoginClick处理程序中调用generateRecaptcha

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

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

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

  • 我在我的react项目中使用apollo graphql,我得到的错误是 无效的钩子调用。钩子只能在函数组件的主体内部调用 这是我的代码 一旦我运行了这个程序,我就得到了错误,我知道useQuery本身就是一个钩子,我不能从内部useEffect调用它,但是接下来应该怎么解决这个问题,因为我需要首先从我的redux状态中获取insuranceId并将其发送到查询。 谢谢

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

  • 问题内容: 使用挂钩时出现此错误。我有它的基本形式,正在看react docs作为参考,但是仍然出现此错误。我已经准备好面对手掌的时刻… 问题答案: 更新时间:2018年12月 的新版本现已发布,链接。Hooks现在可以立即使用。感谢作者theKashey。 查看此样板https://github.com/ReeganExE/react-hooks- boilerplate 反应钩 反应热加载器