Перейти к содержимому

Работа с формами через API-маршруты

Стандартные HTML-формы вызывают перезагрузку страницы при отправке. Чтобы отправить данные без перезагрузки на API-эндпойнт, необходимо перехватить событие отправки с помощью JavaScript.

  1. Создайте API-эндпойнт POST по адресу /api/feedback, который будет принимать данные формы. Используйте request.formData() для их обработки.

    src/pages/api/feedback.ts
    export const prerender = false;
    import type { APIRoute } from "astro";
    export const POST: APIRoute = async ({ request }) => {
    const data = await request.formData();
    const name = data.get("name");
    const email = data.get("email");
    if (!name || !email) {
    return new Response(JSON.stringify({ message: "Заполните все поля" }), { status: 400 });
    }
    return new Response(JSON.stringify({ message: "Успешно!" }), { status: 200 });
    };
  2. Создайте компонент формы на вашем любимом фреймворке.

    src/components/FeedbackForm.tsx
    import { useState, FormEvent } from "react";
    export default function Form() {
    const [responseMessage, setResponseMessage] = useState("");
    async function submit(e: FormEvent<HTMLFormElement>) {
    e.preventDefault();
    const formData = new FormData(e.currentTarget);
    const response = await fetch("/api/feedback", {
    method: "POST",
    body: formData,
    });
    const data = await response.json();
    setResponseMessage(data.message);
    }
    return (
    <form onSubmit={submit}>
    <input type="text" name="name" required placeholder="Имя" />
    <input type="email" name="email" required placeholder="Email" />
    <button>Отправить</button>
    {responseMessage && <p>{responseMessage}</p>}
    </form>
    );
    }
  3. Добавьте компонент на страницу и не забудьте указать директиву client:load для гидратации.

    ---
    import FeedbackForm from "../components/FeedbackForm";
    ---
    <FeedbackForm client:load />