import React, { useState, useRef, useEffect } from 'react'; interface DropdownOption { id: string; label: React.ReactNode; value: string; } interface DropdownProps { options: DropdownOption[]; value?: string; onChange: (value: string) => void; placeholder?: string; label?: string; error?: string; className?: string; disabled?: boolean; } const Dropdown: React.FC = ({ options, value, onChange, placeholder = '请选择', label, error, className = '', disabled = false }) => { const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); const selectedOption = options.find(option => option.value === value); // 处理点击外部关闭下拉菜单 useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsOpen(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, []); const toggleDropdown = () => { if (!disabled) { setIsOpen(!isOpen); } }; const handleOptionSelect = (optionValue: string) => { onChange(optionValue); setIsOpen(false); }; return (
{label && ( )}
{isOpen && (
{options.map((option) => (
handleOptionSelect(option.value)} > {option.label}
))}
)}
{error &&

{error}

}
); }; export default Dropdown;