Hướng dẫn tạo form trong Next.js 14
Dưới đây là đoạn code hướng dẫn tạo form contact :
File src\components\ui\ContactForm.tsx
'use client'
import { Input } from '@headlessui/react';
import { Textarea } from 'flowbite-react';
import { useState } from 'react';
const ContactForm = () => {
const [formData, setFormData] = useState({ name: '', email: '', message: '' });
const [isSending, setIsSending] = useState(false);
const handleChange = (e: any) => {
setFormData({ ...formData, [e.target.name]: e.target.value });
};
const handleSubmit = async (e: any) => {
e.preventDefault();
setIsSending(true);
// await new Promise((resolve) => setTimeout(resolve, 2000)); // Giả lập gửi dữ liệu
try {
const response = await fetch('/api/contact', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(formData),
})
const result = await response.json();
console.log(response);
if (result.status === 1) {
setFormData({ name: '', email: '', message: '' });
} else {
alert('Đã xảy ra lỗi. Vui lòng thử lại. 1111');
}
} catch (e: any) {
console.error(e);
alert('sảy ra lỗi ' + e.message);
};
setIsSending(false);
// setFormData({ name: '', email: '', message: '' });
};
return (
<form onSubmit={handleSubmit} className="max-w-md mx-auto p-4 border rounded-lg shadow-md">
<div className="mb-4">
<label className="block text-gray-700">Name</label>
<Input
type="text"
name="name"
value={formData.name}
onChange={handleChange}
className="w-full px-3 py-2 border rounded-lg"
required
/>
</div>
<div className="mb-4">
<label className="block text-gray-700">Email</label>
<Input
type="email"
name="email"
value={formData.email}
onChange={handleChange}
className="w-full px-3 py-2 border rounded-lg"
required
/>
</div>
<div className="mb-4">
<label className="block text-gray-700">Message</label>
<Textarea
name="message"
value={formData.message}
onChange={handleChange}
className="w-full px-3 py-2 border rounded-lg"
required
></Textarea>
</div>
<button
type="submit"
className={`w-full px-3 py-2 text-white rounded-lg ${isSending ? 'bg-gray-500 cursor-not-allowed' : 'bg-blue-500 hover:bg-blue-600'}`}
disabled={isSending}
>
{isSending ? 'Sending...' : 'Send'}
</button>
</form>
);
};
export default ContactForm;
File server :src\app\api\contact\route.tsx
import { NextRequest, NextResponse } from "next/server";
export async function POST(request: NextRequest) {
try {
const formjson = await request.json();
// Sử dụng await để chờ dữ liệu JSON từ request body
console.log(formjson.name);
// Thực hiện các hành động với dữ liệu nhận được, ví dụ: gửi email, lưu vào database, v.v.
return NextResponse.json({ status: 1 });
} catch (error) {
console.error('Error processing request:', error);
return NextResponse.json({ status: 0, error: 'Failed to process request' }, { status: 500 });
}
}
Ở đây file server mình sẽ xử lý các thông tin ví dụ như lưu thông tin vào database