Zum Inhalt springen
FFormhook
Alle Anleitungen

Anleitung

SvelteKit-Kontaktformular (kein Backend nötig)

SvelteKit braucht keinen eigenen Form-Actions-Endpoint, um eine Kontakt-Einsendung zu empfangen. Sie können dasselbe einfache HTML-Formular in eine +page.svelte einfügen, oder - wenn Sie Inline-Erfolgs-/Fehlerzustände wollen - eine kleine Svelte-5-Komponente mit $state und fetch verwenden.

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 SvelteKit senden

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

src/routes/contact/+page.svelte
<!-- src/routes/contact/+page.svelte -->
<script lang="ts">
  let status = $state<"idle" | "sending" | "ok" | "error">("idle");

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

    const form = e.currentTarget as HTMLFormElement;
    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),
    });

    status = res.ok ? "ok" : "error";
    if (res.ok) form.reset();
  }
</script>

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

So funktioniert es

Das einfache Formular-Snippet funktioniert in jeder +page.svelte - kein +page.server.ts, kein SvelteKit-Form-Action-Handler. Wenn Sie clientseitige UX wollen, verwendet das zweite Snippet Svelte-5-Runes ($state) und sendet direkt an formhook.app/f/YOUR_API_KEY. Der Endpoint akzeptiert JSON, form-encoded oder multipart, also ist Object.fromEntries(new FormData(form)) als JSON serialisiert der einfachste Weg.

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), ohne Ihren eigenen Outbound-Mail-Server aufzusetzen.
  • Ihr SvelteKit-Deploy bleibt ein statischer (oder nahezu statischer) Build - kein Server-Adapter für das Kontaktformular nötig.

Veröffentlichen Sie heute Ihr SvelteKit-Kontaktformular.

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

Kostenlos starten

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

SvelteKit-Kontaktformular - FAQ

Muss ich eine SvelteKit-Form-Action oder eine +page.server.ts-Datei schreiben?
Nein. Das Formular sendet direkt an Formhook. Damit bleibt Ihr SvelteKit-Deploy static-friendly - funktioniert auf Cloudflare Pages, Vercel Static, GitHub Pages mit adapter-static, überall.
Wie behandle ich den Erfolgszustand ohne vollständigen Seiten-Reload?
Verwenden Sie das fetch-basierte Snippet. Es verfolgt eine $state-Variable durch idle → sending → ok/error und tauscht das Formular gegen eine Dankesnachricht, sobald der POST 200 zurückgibt. Das Formular wird nie nativ abgesendet, also navigiert der Browser nicht.
Funktioniert das mit adapter-static / GitHub Pages?
Ja. Da die Einsendung an formhook.app geht, braucht Ihre SvelteKit-Seite keine Server-Runtime. Statisch bauen, überall deployen.

Anleitungen für andere Frameworks

Migrating from Formspree? See how Formhook compares.