← All Guides
React Forms
Two ways to add codaForms to your React application: quick embed or custom component.
5 minutes
Intermediate
Prerequisites
- A codaForms account (sign up free)
- A React application (Create React App, Vite, etc.)
Option 1: Embed Script (Quickest)
Best for landing pages and simple use cases.
Use a useEffect hook to load the embed script:
import { useEffect, useRef } from 'react';
function ContactForm() {
const containerRef = useRef(null);
useEffect(() => {
const script = document.createElement('script');
script.src = 'https://codasite.ai/forms-embed.js';
script.setAttribute('data-form', 'cf_xxxxx');
containerRef.current?.appendChild(script);
return () => {
// Cleanup on unmount
script.remove();
};
}, []);
return <div ref={containerRef} />;
}
export default ContactForm; Option 2: Custom Component (Full Control)
Best when you need custom styling or validation.
Build your own form and submit directly to the codaForms API:
import { useState } from 'react';
function ContactForm() {
const [status, setStatus] = useState('idle');
const FORM_ID = 'cf_xxxxx';
const handleSubmit = async (e) => {
e.preventDefault();
setStatus('submitting');
const formData = new FormData(e.target);
const data = {
_formId: FORM_ID,
name: formData.get('name'),
email: formData.get('email'),
message: formData.get('message'),
};
try {
const res = await fetch('https://codasite.ai/forms/api/submit', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data),
});
const result = await res.json();
if (result.success) {
setStatus('success');
e.target.reset();
} else {
setStatus('error');
}
} catch (error) {
setStatus('error');
}
};
if (status === 'success') {
return <p>Thanks! We'll be in touch soon.</p>;
}
return (
<form onSubmit={handleSubmit}>
<input name="name" placeholder="Name" required />
<input name="email" type="email" placeholder="Email" required />
<textarea name="message" placeholder="Message" required />
<button type="submit" disabled={status === 'submitting'}>
{status === 'submitting' ? 'Sending...' : 'Send'}
</button>
{status === 'error' && (
<p>Something went wrong. Please try again.</p>
)}
</form>
);
}
export default ContactForm; With React Hook Form
For complex forms with validation, use React Hook Form:
import { useForm } from 'react-hook-form';
function ContactForm() {
const { register, handleSubmit, formState: { errors, isSubmitting } } = useForm();
const FORM_ID = 'cf_xxxxx';
const onSubmit = async (data) => {
const res = await fetch('https://codasite.ai/forms/api/submit', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ _formId: FORM_ID, ...data }),
});
const result = await res.json();
if (result.success) {
alert('Form submitted!');
}
};
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register('name', { required: true })} placeholder="Name" />
{errors.name && <span>Name is required</span>}
<input {...register('email', { required: true, pattern: /^S+@S+$/i })} placeholder="Email" />
{errors.email && <span>Valid email required</span>}
<textarea {...register('message', { required: true })} placeholder="Message" />
{errors.message && <span>Message is required</span>}
<button type="submit" disabled={isSubmitting}>
{isSubmitting ? 'Sending...' : 'Send'}
</button>
</form>
);
} API Reference
When submitting via the API, include these fields:
| Field | Required | Description |
|---|---|---|
_formId | Yes | Your form ID from the dashboard |
[field_id] | Varies | Each field from your form builder |