Guide
Formulaire de contact Remix (sans backend)
Remix est construit autour des routes serveur, mais un formulaire de contact n'a pas besoin d'en être une. Vous pouvez poster directement vers Formhook depuis le navigateur en utilisant un form action simple - ou, si vous voulez l'amélioration progressive de Remix, utilisez useFetcher pour gérer l'état de la soumission.
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.
<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 Remix
Utilisez cette version si vous voulez des états succès/erreur côté client sans rechargement de page.
// app/routes/contact.tsx
import { useFetcher } from "@remix-run/react";
export default function Contact() {
const fetcher = useFetcher();
const status = fetcher.state === "submitting" ? "sending" : fetcher.data?.ok ? "ok" : "idle";
if (status === "ok") return <p>Thanks - we'll be in touch.</p>;
return (
<fetcher.Form
method="post"
action="https://formhook.app/f/YOUR_API_KEY"
encType="application/x-www-form-urlencoded"
>
<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>
</fetcher.Form>
);
}Comment ça marche
Le snippet de formulaire simple fonctionne comme un formulaire HTML standard - le <Form> de Remix routerait la soumission vers une action Remix, mais pointer l'action vers formhook.app/f/YOUR_API_KEY contourne Remix entièrement et envoie les données directement à Formhook. La version useFetcher conserve l'amélioration progressive de Remix tout en POSTant en externe : le navigateur fait une soumission XHR, et vous obtenez fetcher.state pour piloter votre UI.
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) - pas d'intégration Resend/SendGrid requise dans votre app Remix.
Lancez votre formulaire de contact Remix aujourd'hui.
Inscrivez-vous gratuitement, créez un formulaire, collez la clé API. Cinq minutes.
Commencer gratuitementNiveau gratuit : 5 formulaires · 250 soumissions/mois · Sans carte bancaire.
Formulaire de contact Remix - FAQ
Dois-je écrire une fonction action Remix ?
useFetcher fonctionnera-t-il encore si l'action est sur une origine différente ?
Est-ce que cela fonctionne avec `unstable_singleFetch` de Remix ou React Router 7 ?
Guides pour les autres frameworks
Migrating from Formspree? See how Formhook compares.