Anleitung
Nuxt-Kontaktformular (kein Backend nötig)
Nuxt braucht keine Server-Route, um Kontakt-Einsendungen zu empfangen. Fügen Sie das einfache HTML-Formular in eine Nuxt-Seite ein, oder - wenn Sie clientseitiges Feedback wollen - verwenden Sie einen Vue-3-<script setup>-Handler mit $fetch und einer ref, die den Status verfolgt.
Verwenden Sie ein einfaches HTML-Formular
Sie benötigen keine API-Route. Das Formular sendet direkt an Formhook, und Ihr Framework muss die Einsendung nie selbst verarbeiten.
<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>Oder mit fetch in Nuxt senden
Verwenden Sie diese Variante, wenn Sie client-seitige Erfolgs-/Fehlerzustände ohne vollständigen Seiten-Reload möchten.
<!-- 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>So funktioniert es
Das einfache Formular-Snippet funktioniert in jeder Nuxt-Seite (pages/contact.vue) ohne entsprechende server/api-Route. Für clientseitige Erfolgs-/Fehlerzustände verwendet das zweite Snippet $fetch - Nuxts eingebauten fetch-Wrapper - und eine ref, die die Status-State-Machine steuert. Beide gehen direkt an formhook.app/f/YOUR_API_KEY.
Was als Nächstes passiert
- Einsendung landet innerhalb einer Sekunde in Ihrem Formhook-Dashboard.
- Push-Benachrichtigung wird auf allen aktivierten Geräten ausgelöst.
- Antworten Sie direkt aus dem Dashboard (Pro und höher) - keine Nuxt-Server-API oder transaktionale E-Mail-Integration nötig.
Veröffentlichen Sie heute Ihr Nuxt-Kontaktformular.
Kostenlos registrieren, Formular erstellen, API-Schlüssel einfügen. Fünf Minuten.
Kostenlos startenKostenlose Stufe: 5 Formulare · 250 Einsendungen/Monat · Keine Kreditkarte.
Nuxt-Kontaktformular - FAQ
- Muss ich eine Nitro-Server-Route für das Formular schreiben?
- Nein. Das Formular sendet direkt an Formhook, was bedeutet, dass Ihre Nuxt-Seite vollständig statisch bleiben kann, wenn Sie das wollen. Keine /server/api/contact.ts zu warten.
- Funktioniert das mit `nuxt generate` (statische Seite)?
- Ja. Das Kontaktformular ist nur ein HTML-POST - es interessiert sich nicht dafür, ob der Rest Ihrer Nuxt-Seite statisch oder am Edge gerendert wird.
- Wo lege ich den API-Schlüssel ab? Ist es sicher, ihn zu committen?
- Der API-Schlüssel ist ein Pro-Formular-Identifikator, nicht ein Geheimnis im klassischen Sinn - er ist sowieso im HTML jedes Besuchers sichtbar. Behandeln Sie ihn als öffentlichen Endpoint-Identifikator und verlassen Sie sich auf Formhooks Pro-Formular-Rate-Limits, CORS-Allowlist und Turnstile-Schalter für den Schutz.
Anleitungen für andere Frameworks
Migrating from Formspree? See how Formhook compares.