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

Руководство

Контактная форма 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}

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

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

  • Отправка попадает в панель 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.

Настройки cookie

Мы используем строго необходимый cookie сессии и собственную аналитику без cookie. С вашего согласия мы также используем Google Analytics, чтобы понимать трафик на маркетинговых страницах.