Aller au contenu
FFormhook
Tous les guides

Guide

Formulaire de contact SvelteKit (sans backend)

SvelteKit n'a pas besoin de son propre endpoint d'actions de formulaire pour recevoir une soumission de contact. Vous pouvez déposer le même formulaire HTML brut dans un +page.svelte, ou - si vous voulez des états succès/erreur inline - utiliser un petit composant Svelte 5 avec $state et fetch.

Utilisez un formulaire HTML brut

Vous n'avez pas besoin d'une route API. Le formulaire POSTe directement vers Formhook, et votre framework n'a jamais à toucher la soumission.

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>

Ou envoyez avec fetch dans SvelteKit

Utilisez cette version si vous voulez des états succès/erreur côté client sans rechargement de page.

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}

Comment ça marche

Le snippet de formulaire brut fonctionne dans n'importe quel +page.svelte - pas de +page.server.ts, pas de handler de form action SvelteKit. Si vous voulez une UX côté client, le deuxième snippet utilise les runes Svelte 5 ($state) et poste directement vers formhook.app/f/YOUR_API_KEY. L'endpoint accepte JSON, form-encoded ou multipart, donc Object.fromEntries(new FormData(form)) sérialisé en JSON est le chemin le plus simple.

Ce qui se passe ensuite

  • La soumission arrive dans votre tableau de bord Formhook en moins d'une seconde.
  • Une notification push se déclenche sur chaque appareil où vous l'avez activée.
  • Répondez directement depuis le tableau de bord (Pro et au-dessus) sans monter votre propre infrastructure d'envoi d'e-mails.
  • Votre déploiement SvelteKit reste un build statique (ou quasi-statique) - pas d'adaptateur serveur requis pour le formulaire de contact.

Lancez votre formulaire de contact SvelteKit aujourd'hui.

Inscrivez-vous gratuitement, créez un formulaire, collez la clé API. Cinq minutes.

Commencer gratuitement

Niveau gratuit : 5 formulaires · 250 soumissions/mois · Sans carte bancaire.

Formulaire de contact SvelteKit - FAQ

Dois-je écrire une form action SvelteKit ou un fichier +page.server.ts ?
Non. Le formulaire POSTe directement vers Formhook. Cela garde votre déploiement SvelteKit static-friendly - fonctionne sur Cloudflare Pages, Vercel static, GitHub Pages avec adapter-static, partout.
Comment gérer l'état de succès sans rechargement de page complet ?
Utilisez le snippet basé sur fetch. Il suit une variable $state à travers idle → sending → ok/error et remplace le formulaire par un message de remerciement quand le POST renvoie 200. Le formulaire n'est jamais soumis nativement, donc le navigateur ne navigue pas.
Est-ce que cela fonctionne avec adapter-static / GitHub Pages ?
Oui. Comme la soumission va vers formhook.app, votre site SvelteKit n'a pas besoin de runtime serveur. Compilez statiquement, déployez n'importe où.

Guides pour les autres frameworks

Migrating from Formspree? See how Formhook compares.