You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Google Recaptcha中executeRecaptcha函数未定义问题求助

解决react-google-recaptcha-v3 executeRecaptcha未初始化完成就调用的问题

针对你遇到的executeRecaptcha未初始化完成就调用导致返回undefined的问题,这里有几种稳定的解决方案:

方法1:状态监听+Promise等待就绪

通过状态监听executeRecaptcha的初始化状态,封装等待函数确保验证码逻辑在就绪后执行:

import { useGoogleReCaptcha } from 'react-google-recaptcha-v3';
import { useState, useEffect } from 'react';
import { useNavigate } from 'react-router-dom';

export const useAxiosClient = () => {
  const navigate = useNavigate();
  const { executeRecaptcha } = useGoogleReCaptcha();
  const [recaptchaReady, setRecaptchaReady] = useState(false);

  // 监听executeRecaptcha变化,初始化完成后标记就绪
  useEffect(() => {
    if (executeRecaptcha) {
      setRecaptchaReady(true);
    }
  }, [executeRecaptcha]);

  // 等待recaptcha就绪的工具函数
  const waitForRecaptchaReady = () => {
    return new Promise(resolve => {
      if (recaptchaReady) {
        resolve(true);
      } else {
        const interval = setInterval(() => {
          if (recaptchaReady) {
            clearInterval(interval);
            resolve(true);
          }
        }, 100);
      }
    });
  };

  const getCaptchaToken = async (action: string) => {
    await waitForRecaptchaReady();
    return await executeRecaptcha(action);
  };

  const loginBefore = async () => {
    const captchaToken = await getCaptchaToken('login');
    // 后续业务逻辑
  };

  return { loginBefore };
};

方法2:直接在getCaptchaToken中循环等待

如果不想额外维护状态,可以直接在令牌获取函数中循环判断,直到executeRecaptcha可用:

import { useGoogleReCaptcha } from 'react-google-recaptcha-v3';
import { useNavigate } from 'react-router-dom';

export const useAxiosClient = () => {
  const navigate = useNavigate();
  const { executeRecaptcha } = useGoogleReCaptcha();

  const getCaptchaToken = async (action: string) => {
    // 循环等待直到executeRecaptcha初始化完成
    while (!executeRecaptcha) {
      await new Promise(resolve => setTimeout(resolve, 100));
    }
    return await executeRecaptcha(action);
  };

  const loginBefore = async () => {
    const captchaToken = await getCaptchaToken('login');
    // 后续业务逻辑
  };

  return { loginBefore };
};

方法3:组件层面控制调用时机

在调用loginBefore的组件中,先判断recaptcha是否就绪,避免提前触发:

// useAxiosClient.tsx
import { useGoogleReCaptcha } from 'react-google-recaptcha-v3';
import { useState, useEffect } from 'react';
import { useNavigate } from 'react-router-dom';

export const useAxiosClient = () => {
  const navigate = useNavigate();
  const { executeRecaptcha } = useGoogleReCaptcha();
  const [isRecaptchaReady, setIsRecaptchaReady] = useState(false);

  useEffect(() => {
    setIsRecaptchaReady(!!executeRecaptcha);
  }, [executeRecaptcha]);

  const getCaptchaToken = async (action: string) => {
    return await executeRecaptcha(action);
  };

  const loginBefore = async () => {
    const captchaToken = await getCaptchaToken('login');
    // 后续业务逻辑
  };

  return { loginBefore, isRecaptchaReady };
};

// 调用组件示例
import { useAxiosClient } from './useAxiosClient';

const LoginComponent = () => {
  const { loginBefore, isRecaptchaReady } = useAxiosClient();

  return (
    <button 
      onClick={loginBefore} 
      disabled={!isRecaptchaReady}
    >
      {isRecaptchaReady ? '登录' : '验证码加载中...'}
    </button>
  );
};

以上方法均能替代不稳定的延迟调用,确保executeRecaptcha初始化完成后再获取验证码令牌。

内容的提问来源于stack exchange,提问作者S D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:52:28