Zum Inhalt springen
FFormhook
Alle Anleitungen

Anleitung

Next.js-Kontaktformular (kein Backend nötig)

Next.js braucht keinen eigenen Formular-Empfänger. Sie können dasselbe einfache HTML-Formular-Action in jede Server-Komponente einfügen, oder - wenn Sie clientseitige Erfolgs- und Fehlerzustände wollen - eine kleine Client-Komponente mit fetch verwenden. Beide POSTen direkt an Formhook.

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.

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>

Oder mit fetch in Next.js senden

Verwenden Sie diese Variante, wenn Sie client-seitige Erfolgs-/Fehlerzustände ohne vollständigen Seiten-Reload möchten.

components/contact-form.tsx
"use client";

import { useState } from "react";

export function ContactForm() {
  const [status, setStatus] = useState<"idle" | "sending" | "ok" | "error">("idle");

  async function onSubmit(e: React.FormEvent<HTMLFormElement>) {
    e.preventDefault();
    setStatus("sending");

    const form = e.currentTarget;
    const data = Object.fromEntries(new FormData(form));

    const res = await fetch("https://formhook.app/f/YOUR_API_KEY", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify(data),
    });

    setStatus(res.ok ? "ok" : "error");
    if (res.ok) form.reset();
  }

  if (status === "ok") return <p>Thanks - we'll be in touch.</p>;

  return (
    <form onSubmit={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>
      {status === "error" && <p>Something went wrong. Please try again.</p>}
    </form>
  );
}

So funktioniert es

Das einfache Formular-Action funktioniert in jeder Next.js-Seite oder jedem Layout, einschließlich Server-Komponenten. Kein app/api/contact/route.ts, keine Server Action, keine Middleware. Wenn Sie eine clientseitige UX mit Erfolgs- und Fehlerzuständen wollen, zeigt das zweite Snippet das kanonische Muster: "use client", useState, onSubmit, fetch an formhook.app/f/YOUR_API_KEY. Das Honeypot-Feld (_gotcha) und optional _redirect sind dieselben Sonderfelder aus der HTML-Anleitung.

Was als Nächstes passiert

  • Einsendung erscheint 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) - praktisch für Kundenarbeit, bei der jedes Projekt seine eigene Kontakt-Route hat.

Veröffentlichen Sie heute Ihr Next.js-Kontaktformular.

Kostenlos registrieren, Formular erstellen, API-Schlüssel einfügen. Fünf Minuten.

Kostenlos starten

Kostenlose Stufe: 5 Formulare · 250 Einsendungen/Monat · Keine Kreditkarte.

Next.js-Kontaktformular - FAQ

Muss ich eine API-Route oder eine Server Action hinzufügen?
Nein. Das Formular sendet direkt an Formhook. Ohne API-Route haben Sie eine Oberfläche weniger zu rate-limiten und einen Cold-Start weniger auf Serverless-Deployments.
Kann ich das in einer Server-Komponente verwenden?
Ja - das einfache HTML-Formular-Snippet funktioniert in jeder Server-Komponente. Nur die fetch-basierte Version muss eine Client-Komponente sein, da sie useState verwendet.
Wie behandle ich Spam, ohne Rate-Limit-Middleware zu schreiben?
Spam-Schutz liegt auf Formhooks Seite. Das Honeypot-Feld verwirft Bots stillschweigend, und Cloudflare Turnstile ist ein Schalter pro Formular im Dashboard. Per-IP- und Per-Formular-Rate-Limits werden ebenfalls serverseitig durchgesetzt.

Anleitungen für andere Frameworks

Migrating from Formspree? See how Formhook compares.