Перейти к содержимому
FFormhook
Все руководства

Руководство

Контактная форма SvelteKit (без бэкенда)

SvelteKit не нужен свой form actions эндпоинт для приёма контактной отправки. Можно вставить ту же обычную HTML-форму в +page.svelte, или - если нужны inline-состояния успеха/ошибки - использовать небольшой Svelte 5 компонент с $state и fetch.

Используйте обычную HTML-форму

API-маршрут не нужен. Форма POST'ит напрямую в Formhook, и вашему фреймворку никогда не приходится касаться отправки.

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>

Или отправить через fetch в SvelteKit

Используйте этот вариант, если хотите состояния успех/ошибка на клиенте без полной перезагрузки страницы.

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}

Как это работает

Обычный сниппет формы работает в любом +page.svelte - никакого +page.server.ts, никакого обработчика form action SvelteKit. Для клиентского UX второй сниппет использует Svelte 5 runes ($state) и POST'ит напрямую в formhook.app/f/YOUR_API_KEY. Эндпоинт принимает JSON, form-encoded или multipart, поэтому Object.fromEntries(new FormData(form)) сериализованный в JSON - самый простой путь.

Что происходит дальше

  • Отправка попадает в панель Formhook в течение секунды.
  • Push-уведомление срабатывает на каждом включённом устройстве.
  • Отвечайте прямо из панели (Pro и выше), не поднимая свой исходящий email.
  • Ваш SvelteKit-деплой остаётся статической (или почти статической) сборкой - для контактной формы серверный адаптер не нужен.

Запустите вашу контактную форму на SvelteKit сегодня.

Зарегистрируйтесь бесплатно, создайте форму, вставьте API-ключ. Пять минут.

Начать бесплатно

Бесплатный тариф: 5 форм · 250 отправок/мес · Без банковской карты.

Контактная форма SvelteKit - FAQ

Нужно ли писать SvelteKit form action или +page.server.ts?
Нет. Форма POST'ит напрямую в Formhook. Это сохраняет ваш SvelteKit-деплой static-friendly - работает на Cloudflare Pages, Vercel static, GitHub Pages с adapter-static, где угодно.
Как обрабатывать состояние успеха без полной перезагрузки страницы?
Используйте сниппет с fetch. Он отслеживает $state-переменную через idle → sending → ok/error и заменяет форму на сообщение благодарности, когда POST возвращает 200. Форма никогда не сабмитится нативно, так что браузер не навигирует.
Работает ли это с adapter-static / GitHub Pages?
Да. Поскольку отправка идёт в formhook.app, вашему сайту SvelteKit не нужен серверный runtime. Соберите статически, деплойте куда угодно.

Руководства для других фреймворков

Migrating from Formspree? See how Formhook compares.