React 문의 양식 통합(Vite 및 단일 페이지 앱)
Vite로 구축된 React 단일 페이지 애플리케이션(SPA)에 연락처 및 피드백 양식을 추가하는 방법 또는 허니팟 스팸 방어 및 즉각적인 받은 편지함 알림 기능을 갖춘 React 앱 생성.
1. Vite가 포함된 표준 React 문의 양식 구성 요소
이 경량 React 구성 요소는 표준 React 후크(useState)와 브라우저 Fetch API를 사용하여 Lugatu 공개 엔드포인트에 직접 제출합니다. 외부 양식 라이브러리나 백엔드 서버가 필요하지 않습니다.
import React, { useState } from 'react';
export function ContactForm() {
const [formData, setFormData] = useState({ name: '', email: '', message: '', _gotcha: '' });
const [status, setStatus] = useState<'idle' | 'submitting' | 'success' | 'error'>('idle');
const [errorMessage, setErrorMessage] = useState('');
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
if (formData._gotcha) return; // Silent discard for automated bot traps
setStatus('submitting');
setErrorMessage('');
try {
const response = await fetch('https://www.lugatu.com/api/v1/public/forms/YOUR_PUBLIC_FORM_ID/submissions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
},
body: JSON.stringify({
fields: {
name: formData.name,
email: formData.email,
message: formData.message,
},
honeypot: formData._gotcha,
}),
});
if (!response.ok) {
throw new Error('Failed to deliver message');
}
setStatus('success');
setFormData({ name: '', email: '', message: '', _gotcha: '' });
} catch (err: any) {
setStatus('error');
setErrorMessage(err.message || 'Submission error. Please try again.');
}
};
return (
<form onSubmit={handleSubmit} className="space-y-4 max-w-md">
<div>
<label htmlFor="react-name" className="block text-sm font-semibold mb-1">Your Name</label>
<input
id="react-name"
type="text"
required
value={formData.name}
onChange={(e) => setFormData({ ...formData, name: e.target.value })}
className="w-full border rounded-xl p-2.5"
/>
</div>
<div>
<label htmlFor="react-email" className="block text-sm font-semibold mb-1">Email Address</label>
<input
id="react-email"
type="email"
required
value={formData.email}
onChange={(e) => setFormData({ ...formData, email: e.target.value })}
className="w-full border rounded-xl p-2.5"
/>
</div>
<div>
<label htmlFor="react-message" className="block text-sm font-semibold mb-1">Message</label>
<textarea
id="react-message"
rows={4}
required
value={formData.message}
onChange={(e) => setFormData({ ...formData, message: e.target.value })}
className="w-full border rounded-xl p-2.5"
/>
</div>
<!-- Honeypot spam defense -->
<input
type="text"
name="_gotcha"
value={formData._gotcha}
onChange={(e) => setFormData({ ...formData, _gotcha: e.target.value })}
style={{ display: 'none' }}
tabIndex={-1}
autoComplete="off"
/>
<button
type="submit"
disabled={status === 'submitting'}
className="btn-primary-editorial py-2.5 px-6"
>
{status === 'submitting' ? 'Sending...' : 'Send Message'}
</button>
{status === 'success' && (
<p className="text-sm text-green-700 font-medium">Thank you! Your message was delivered.</p>
)}
{status === 'error' && (
<p className="text-sm text-red-600">{errorMessage}</p>
)}
</form>
);
}
2. React Hook Form 및 Formik과 통합
Lugatu 표준 JSON 제출 모델은 React Hook Form, Formik 또는 Zod와 같은 양식 검증 라이브러리와 쉽게 통합됩니다. 직렬화된 값을 필드 페이로드 객체에 직접 전달합니다.
// React Hook Form submission handler
const onSubmit = async (data: FormValues) => {
const res = await fetch(`https://www.lugatu.com/api/v1/public/forms/${import.meta.env.VITE_LUGATU_FORM_ID}/submissions`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ fields: data }),
});
return res.ok;
};
3. React의 환경 변수 및 비밀 분리
Vite에서는 공용 변수 앞에 VITE_가 붙습니다. 공개 양식 ID로 VITE_LUGATU_FORM_ID를 사용하세요. 클라이언트 측 소스 코드 또는 저장소 내부에 서버 간 API 키(lug_live_...)를 노출하지 마십시오.
lug_live_로 시작하는 라이브 API 키는 서버 간 실행을 위해 엄격하게 예약되어 있습니다. 라이브 API 키로 전송된 모든 브라우저 요청은 HTTP 403으로 거부됩니다.
보안 및 인증 불변
보안 불변성: 라이브 API 키 앞에 VITE_ 또는 REACT_APP_를 붙이지 마세요. 브라우저 클라이언트는 API 키 없이 퍼블릭 엔드포인트에만 독점적으로 제출해야 합니다.
문제 해결 및 일반적인 수집 오류
공개 엔드포인트(https://www.lugatu.com/api/v1/public/forms/YOUR_PUBLIC_FORM_ID/submissions)에 제출하고 있는지 확인하세요. 서버 간 엔드포인트(POST /api/v1/forms/{id}/submissions)는 브라우저 원본을 명시적으로 차단합니다.
자주 묻는 질문
Lugatu와 함께 React Hook Form 또는 Formik을 사용할 수 있나요?
예. Lugatu는 필드 객체가 포함된 표준 JSON을 허용합니다. 모든 React 양식 라이브러리는 값을 직렬화하고 공개 엔드포인트에 제출할 수 있습니다.
양식 끝점을 만들 준비가 되셨나요?
몇 초 안에 무료로 시작해 보세요. 신용 카드가 필요하지 않습니다.