Руководство
Контактная форма Gatsby (без бэкенда)
Gatsby собирает статический HTML, так что контактная форма Gatsby в runtime - это просто обычный HTML. Вставьте form action, или используйте небольшой React-компонент с fetch, если хотите inline-состояния успеха и ошибки.
Используйте обычную HTML-форму
API-маршрут не нужен. Форма POST'ит напрямую в Formhook, и вашему фреймворку никогда не приходится касаться отправки.
<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>Или отправить через fetch в Gatsby
Используйте этот вариант, если хотите состояния успех/ошибка на клиенте без полной перезагрузки страницы.
// src/components/contact-form.tsx
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>
);
}Как это работает
Обычный сниппет формы можно положить в любую страницу или компонент Gatsby - это чистый HTML, специфичный для Gatsby data-слой не нужен. React-компонент на fetch обрабатывает отправку на клиенте и POST'ит в formhook.app/f/YOUR_API_KEY. Никакого плагина gatsby-source-formhook для установки, никакой serverless-функции для деплоя.
Что происходит дальше
- Отправка попадает в панель Formhook в течение секунды.
- Push-уведомление срабатывает на каждом включённом устройстве.
- Отвечайте прямо из панели (Pro и выше) - держит ваш настоящий email подальше от статического HTML вашего сайта Gatsby.
Запустите вашу контактную форму на Gatsby сегодня.
Зарегистрируйтесь бесплатно, создайте форму, вставьте API-ключ. Пять минут.
Начать бесплатноБесплатный тариф: 5 форм · 250 отправок/мес · Без банковской карты.
Контактная форма Gatsby - FAQ
- Нужна ли Gatsby Function или Netlify-функция для этого?
- Нет. Форма POST'ит напрямую в Formhook. Ваш сайт Gatsby может оставаться чистой статической сборкой - адаптер для serverless-функций не требуется.
- Можно ли использовать это с `gatsby develop` локально?
- Да. Браузер делает POST независимо от того, как Gatsby отдал HTML. Просто убедитесь, что http://localhost:8000 находится в списке разрешённых origins формы во время разработки.
- Как бороться со спамом без добавления плагина Gatsby?
- Не нужно. Honeypot тихо отбрасывает ботов, а Cloudflare Turnstile - переключатель на форму в панели Formhook.
Руководства для других фреймворков
Migrating from Formspree? See how Formhook compares.