การจัดการ Modal เป็นเรื่องที่พบเจอบ่อยสำหรับ Frontend Dev โดยเฉพาะถ้าคุณทำงานกับ React/Next.js หลายครั้งเราต้องเปิด, ปิด Modal และส่งข้อมูลให้แสดงผล ซึ่งบางทีก็มีโค้ดซ้ำซ้อนหรือต้องใช้ Context มาช่วย แต่วันนี้เราจะมาแชร์วิธีสร้าง Confirm Modal แบบ Minimal โดยใช้ Custom Hook ช่วยให้ชีวิตคุณง่ายขึ้น!
Step 1: สร้าง Confirm Modal Component
ไฟล์: ConfirmModal.tsx
import React from 'react';
interface ConfirmModalProps {
isOpen: boolean;
onClose: () => void;
onConfirm: () => void;
data: { info?: string; title?: string; infoMode?: boolean };
}
const ConfirmModal: React.FC<ConfirmModalProps> = ({ isOpen, onClose, onConfirm, data }) => {
if (!isOpen) return null;
return (
<div className="fixed inset-0 flex items-center justify-center z-50 bg-gray-900 bg-opacity-50">
<div className="bg-white rounded-lg p-6 shadow-lg w-full max-w-md">
{/* Close Button */}
<div className="flex justify-end">
<button onClick={onClose} className="text-gray-400 hover:text-gray-600">
✕
</button>
</div>
{/* Header */}
<div className="text-center mb-4">
{data.title && <h3 className="text-lg font-semibold mb-2">{data.title}</h3>}
{data.info && <p className="text-gray-600">{data.info}</p>}
</div>
{/* Buttons */}
<div className="flex justify-center gap-4 mt-4">
{!data.infoMode && (
<button
data-testid="buttonCancel"
className="px-4 py-2 bg-gray-300 text-gray-700 rounded hover:bg-gray-400"
onClick={onClose}
>
ยกเลิก
</button>
)}
<button
data-testid="buttonConfirm"
className="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600"
onClick={onConfirm}
>
ยืนยัน
</button>
</div>
</div>
</div>
);
};
export default ConfirmModal;
Key Features
- ใช้
propsเพื่อควบคุม Modal อย่างยืดหยุ่น (isOpen,onClose,onConfirm,data). - สามารถส่งข้อมูล
titleและinfoผ่านdataobject. - ปรับปุ่มให้แสดงหรือซ่อนตาม
infoMode.
Step 2: สร้าง Custom Hook สำหรับควบคุม Modal
ไฟล์: useModal.ts
import { useState } from 'react';
export const useModal = () => {
const [isOpen, setIsOpen] = useState(false);
const [modalData, setModalData] = useState<any>(null);
const openModal = (data: any) => {
setModalData(data);
setIsOpen(true);
};
const closeModal = () => {
setIsOpen(false);
setModalData(null);
};
return {
isOpen,
modalData,
openModal,
closeModal,
};
};
Custom Hook นี้ทำอะไร?
- จัดการ state
isOpenและmodalDataอย่างง่าย. - ฟังก์ชัน
openModalเปิด Modal พร้อมส่งข้อมูลที่ต้องการ. - ฟังก์ชัน
closeModalปิด Modal และรีเซ็ตข้อมูล.
Step 3: ใช้ ConfirmModal และ Hook ใน Component
ไฟล์: ExampleComponent.tsx
import React from 'react';
import ConfirmModal from './ConfirmModal';
import { useModal } from './useModal';
const ExampleComponent: React.FC = () => {
const { isOpen, modalData, openModal, closeModal } = useModal();
const handleConfirm = () => {
console.log('Confirmed!');
closeModal();
};
return (
<div className="p-6">
<button
className="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600"
onClick={() => openModal({ info: 'รายละเอียด', title: 'หัวข้อ', infoMode: false })}
>
เปิด Modal
</button>
{/* Modal */}
<ConfirmModal
isOpen={isOpen}
onClose={closeModal}
onConfirm={handleConfirm}
data={modalData}
/>
</div>
);
};
export default ExampleComponent;
สิ่งที่เกิดขึ้น
- ใช้ Hook
useModalเพื่อจัดการสถานะของ Modal (isOpen,modalData). - เปิด Modal พร้อมส่งข้อมูล (
title,info) ด้วยopenModal. - ปิด Modal ด้วย
closeModal. - จัดการการยืนยันผ่าน
onConfirm.
สรุป
ในบทความนี้ เราได้เรียนรู้การสร้าง Confirm Modal ใน React/Next.js อย่างมีประสิทธิภาพโดยใช้ Custom Hook (useModal) แทนการใช้ Service สไตล์ Angular ซึ่งช่วยให้โค้ดของคุณสะอาด, ยืดหยุ่น และง่ายต่อการนำไปใช้ซ้ำในโปรเจกต์อื่น ๆ อีกด้วย!