Skip to content

React

use-formspark

TIP

Check out our official React hooks: use-formspark.

jsx
import { useState } from "react";
import { createRoot } from "react-dom/client";
import { useFormspark } from "@formspark/use-formspark";

const FORMSPARK_FORM_ID = "your-form-id";

const Application = () => {
  const [submit, submitting] = useFormspark({
    formId: FORMSPARK_FORM_ID,
  });

  const [message, setMessage] = useState("");

  const onSubmit = async (e) => {
    e.preventDefault();
    await submit({ message });
    alert("Form submitted");
  };

  return (
    <form onSubmit={onSubmit}>
      <textarea value={message} onChange={(e) => setMessage(e.target.value)} />
      <button type="submit" disabled={submitting}>
        Send
      </button>
    </form>
  );
};

createRoot(document.getElementById("root")).render(<Application />);

Fetch

jsx
import { useState } from "react";
import { createRoot } from "react-dom/client";

const FORMSPARK_ACTION_URL = "https://submit-form.com/your-form-id";

const Application = () => {
  const [message, setMessage] = useState("");

  const onSubmit = async (e) => {
    e.preventDefault();
    await fetch(FORMSPARK_ACTION_URL, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        Accept: "application/json",
      },
      body: JSON.stringify({
        message,
      }),
    });
    alert("Form submitted");
  };

  return (
    <form onSubmit={onSubmit}>
      <textarea value={message} onChange={(e) => setMessage(e.target.value)} />
      <button type="submit">Send</button>
    </form>
  );
};

createRoot(document.getElementById("root")).render(<Application />);

React Hook Form

React Hook Form pairs nicely with use-formspark for validation and field state.

jsx
import { useForm } from "react-hook-form";
import { useFormspark } from "@formspark/use-formspark";

const FORMSPARK_FORM_ID = "your-form-id";

export default function ContactForm() {
  const [submit, submitting] = useFormspark({ formId: FORMSPARK_FORM_ID });
  const {
    register,
    handleSubmit,
    formState: { errors },
    reset,
  } = useForm();

  const onSubmit = async (data) => {
    await submit(data);
    reset();
    alert("Form submitted");
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <label>
        <span>Email</span>
        <input type="email" {...register("email", { required: true })} />
      </label>
      {errors.email && <p>An email address is required.</p>}

      <label>
        <span>Message</span>
        <textarea {...register("message", { required: true, minLength: 10 })} />
      </label>
      {errors.message && <p>Please write at least 10 characters.</p>}

      <button type="submit" disabled={submitting}>
        Send
      </button>
    </form>
  );
}