// app/components/ui/Modal.tsx import React, { useEffect } from 'react'; interface ModalProps { isOpen: boolean; onClose: () => void; title: React.ReactNode; children: React.ReactNode; footer?: React.ReactNode; width?: number | string; } export function Modal({ isOpen, onClose, title, children, footer, width = 500 }: ModalProps) { // 点击ESC键关闭模态框 useEffect(() => { const handleEsc = (e: KeyboardEvent) => { if (e.key === 'Escape' && isOpen) { onClose(); } }; window.addEventListener('keydown', handleEsc); return () => window.removeEventListener('keydown', handleEsc); }, [isOpen, onClose]); // 禁用背景滚动 useEffect(() => { if (isOpen) { document.body.style.overflow = 'hidden'; } else { document.body.style.overflow = ''; } return () => { document.body.style.overflow = ''; }; }, [isOpen]); if (!isOpen) return null; return (
{ if (e.target === e.currentTarget) onClose(); }} >
e.stopPropagation()} >

{title}

{children}
{footer && (
{footer}
)}
); }