Перейти к содержимому
FFormhook
Все руководства

Руководство

Контактная форма Nuxt (без бэкенда)

Nuxt не нужен серверный маршрут для приёма отправок контактной формы. Вставьте обычную HTML-форму в страницу Nuxt, или - если нужен клиентский фидбек - используйте обработчик Vue 3 <script setup> с $fetch и ref для отслеживания статуса отправки.

Используйте обычную HTML-форму

API-маршрут не нужен. Форма POST'ит напрямую в Formhook, и вашему фреймворку никогда не приходится касаться отправки.

contact.html
<form action="https://formhook.app/f/YOUR_API_KEY" method="POST">
  <label>
    Email
    <input type="email" name="email" required />
  </label>

  <label>
    Message
    <textarea name="message" required></textarea>
  </label>

  <!-- honeypot: bots fill this; humans don't see it -->
  <input type="text" name="_gotcha" tabindex="-1" autocomplete="off" hidden />

  <!-- optional: send users to a thank-you page after a native POST -->
  <input type="hidden" name="_redirect" value="https://example.com/thanks" />

  <button type="submit">Send</button>
</form>

Или отправить через fetch в Nuxt

Используйте этот вариант, если хотите состояния успех/ошибка на клиенте без полной перезагрузки страницы.

pages/contact.vue
<!-- pages/contact.vue -->
<script setup lang="ts">
type Status = "idle" | "sending" | "ok" | "error";
const status = ref<Status>("idle");

async function onSubmit(e: Event) {
  e.preventDefault();
  status.value = "sending";

  const form = e.target as HTMLFormElement;
  const data = Object.fromEntries(new FormData(form));

  try {
    await $fetch("https://formhook.app/f/YOUR_API_KEY", {
      method: "POST",
      body: data,
    });
    status.value = "ok";
    form.reset();
  } catch {
    status.value = "error";
  }
}
</script>

<template>
  <p v-if="status === 'ok'">Thanks - we'll be in touch.</p>
  <form v-else @submit="onSubmit">
    <input type="email" name="email" placeholder="Email" required />
    <textarea name="message" placeholder="Message" required />
    <input type="text" name="_gotcha" tabindex="-1" hidden />
    <button type="submit" :disabled="status === 'sending'">
      {{ status === "sending" ? "Sending…" : "Send" }}
    </button>
    <p v-if="status === 'error'">Something went wrong. Please try again.</p>
  </form>
</template>

Как это работает

Обычный сниппет формы работает в любой странице Nuxt (pages/contact.vue) без соответствующего маршрута server/api. Для клиентских состояний успеха/ошибки второй сниппет использует $fetch - встроенный fetch-обёртку Nuxt - и ref для управления state machine статуса. Оба идут напрямую в formhook.app/f/YOUR_API_KEY.

Что происходит дальше

  • Отправка попадает в панель Formhook в течение секунды.
  • Push-уведомление срабатывает на каждом включённом устройстве.
  • Отвечайте прямо из панели (Pro и выше) - никакой серверный API Nuxt или интеграция транзакционной почты не требуются.

Запустите вашу контактную форму на Nuxt сегодня.

Зарегистрируйтесь бесплатно, создайте форму, вставьте API-ключ. Пять минут.

Начать бесплатно

Бесплатный тариф: 5 форм · 250 отправок/мес · Без банковской карты.

Контактная форма Nuxt - FAQ

Нужно ли писать серверный маршрут Nitro для формы?
Нет. Форма POST'ит напрямую в Formhook, что значит: ваш сайт Nuxt может оставаться полностью статическим, если вы этого хотите. Никакого /server/api/contact.ts для поддержки.
Работает ли это с `nuxt generate` (статический сайт)?
Да. Контактная форма - это просто HTML POST - ей всё равно, рендерится ли остальная часть вашего сайта Nuxt статически или на edge.
Куда положить API-ключ? Безопасно ли его коммитить?
API-ключ - это идентификатор формы, а не секрет в традиционном смысле - он и так уже виден в HTML каждого посетителя. Относитесь к нему как к публичному идентификатору эндпоинта и полагайтесь на per-form rate limits Formhook, CORS-allowlist и переключатель Turnstile для защиты.

Руководства для других фреймворков

Migrating from Formspree? See how Formhook compares.