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

Vue3引入Checkbox时出现useRecaptcha()无提供者错误求助

Vue集成ReCAPTCHA报错"useRecaptcha() is called without provider"解决方案

问题描述

为个人作品集网站集成ReCAPTCHA防止EmailJS收到垃圾邮件,按照文档配置后出现错误:Uncaught Error: useRecaptcha() is called without provider.,尝试使用@unhead/vue和改用vue-recaptcha/head两种配置方式,均出现相同警告与错误。

相关代码

使用@unhead/vue时的main.js

import { createApp } from 'vue'
import { createHead } from '@unhead/vue'
import { VueRecaptchaPlugin } from 'vue-recaptcha'
import './style.css'
import App from './App.vue'

const app = createApp(App)
const head = createHead()
app.use(head)
app.use(VueRecaptchaPlugin, {
  v2SiteKey: import.meta.env.VITE_RECAPTCHA_SITE_KEY,
})
app.mount('#app')

App.vue

<script setup>
import Navbar from './components/Navbar.vue'
import Projects from './components/Projects.vue'
import About from './components/About.vue'
import Contact from './components/Contact.vue';

import { useRecaptchaProvider } from 'vue-recaptcha'
useRecaptchaProvider()
</script>

<template>
  <Navbar/>
  <div id="about">
    <About/>
  </div>
  <div id="work-experience">
    Work Experience
  </div>
  <div id="projects">
    <Projects/>
  </div>
  <div id="contact">
    <Contact/>
  </div>
</template>

Contact.vue

<script setup>
import { Checkbox } from 'vue-recaptcha';
</script>

<template>
  <div class="container">
    <div class="contact">
      <h2>Reach me</h2>
      <div class="social">
      </div>
    </div>
    <form ref="form" @submit.prevent="sendEmail">
      <div class="form">
        <input type="text" name="from_name" placeholder="Name">
        <input type="email" name="from_email" placeholder="Email">
        <input type="text" name="company_name" placeholder="Company">
        <textarea name="message" placeholder="Message"></textarea>
        <Checkbox/>
        <button type="submit">Send</button>
      </div>
    </form>
  </div>
</template>

警告与错误信息

[Vue warn]: injection "Symbol(vue-recaptcha-context)" not found. 
  at <Checkbox> 
  at <Contact> 
  at <App>
[Vue warn]: [vue-recaptcha]: You may forget to `use` vue-recaptcha plugin 
  at <Checkbox> 
  at <Contact> 
  at <App>
[Vue warn]: Unhandled error during execution of setup function 
  at <Checkbox> 
  at <Contact> 
  at <App>
Uncaught Error: useRecaptcha() is called without provider.
    at useRecaptchaContext (context.mjs?v=40414563:8:11)
    at useAssertV2SiteKey (context.mjs?v=40414563:17:15)
    at useChallengeV2 (challenge-v2.mjs?v=40414563:12:19)
    at useComponentV2 (component-v2.mjs?v=40414563:5:83)
    at setup (Checkbox.vue:46:18)
    at callWithErrorHandling (runtime-core.esm-bundler.js:173:22)
    at setupStatefulComponent (runtime-core.esm-bundler.js:7265:29)
    at setupComponent (runtime-core.esm-bundler.js:7220:11)
    at mountComponent (runtime-core.esm-bundler.js:5542:13)
    at processComponent (runtime-core.esm-bundler.js:5517:17)

解决方案

1. 移除不必要的useRecaptchaProvider调用

已经通过app.use(VueRecaptchaPlugin)全局注册了ReCAPTCHA插件,它会自动在应用中注入上下文,手动调用useRecaptchaProvider会干扰全局上下文传递,导致组件无法获取正确的配置。

修改后的App.vue:

<script setup>
import Navbar from './components/Navbar.vue'
import Projects from './components/Projects.vue'
import About from './components/About.vue'
import Contact from './components/Contact.vue';

// 移除以下两行代码
// import { useRecaptchaProvider } from 'vue-recaptcha'
// useRecaptchaProvider()
</script>

<template>
  <Navbar/>
  <div id="about">
    <About/>
  </div>
  <div id="work-experience">
    Work Experience
  </div>
  <div id="projects">
    <Projects/>
  </div>
  <div id="contact">
    <Contact/>
  </div>
</template>

2. 确认环境变量正确加载

检查项目根目录的.env文件是否正确配置:

VITE_RECAPTCHA_SITE_KEY=你的ReCAPTCHA站点密钥

注意:修改环境变量后需要重启开发服务器才能生效,可在main.js中添加打印语句确认值是否正确获取:

console.log('ReCAPTCHA Site Key:', import.meta.env.VITE_RECAPTCHA_SITE_KEY)

3. 修正ReCAPTCHA组件导入路径(针对v2版本)

若使用的是ReCAPTCHA v2的Checkbox组件,需要从vue-recaptcha/v2导入,而非根路径:

修改后的Contact.vue:

<script setup>
// 修正导入路径
import { Checkbox } from 'vue-recaptcha/v2';
</script>

<template>
  <div class="container">
    <div class="contact">
      <h2>Reach me</h2>
      <div class="social">
      </div>
    </div>
    <form ref="form" @submit.prevent="sendEmail">
      <div class="form">
        <input type="text" name="from_name" placeholder="Name">
        <input type="email" name="from_email" placeholder="Email">
        <input type="text" name="company_name" placeholder="Company">
        <textarea name="message" placeholder="Message"></textarea>
        <Checkbox/>
        <button type="submit">Send</button>
      </div>
    </form>
  </div>
</template>

4. 不使用@unhead/vue时的额外配置

如果不需要@unhead/vue,需在main.js中导入vue-recaptcha/head来自动加载ReCAPTCHA的官方脚本:

import { createApp } from 'vue'
import { VueRecaptchaPlugin } from 'vue-recaptcha'
import 'vue-recaptcha/head' // 添加这一行
import './style.css'
import App from './App.vue'

const app = createApp(App)
app.use(VueRecaptchaPlugin, {
  v2SiteKey: import.meta.env.VITE_RECAPTCHA_SITE_KEY,
})
app.mount('#app')

内容的提问来源于stack exchange,提问作者Paweenwat Maneechai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:37:56