// 自定义下拉选择组件 - MD3 风格 import { useState, useRef, useEffect } from 'react'; export interface SelectOption { value: T; label: string; } interface CustomSelectProps { options: SelectOption[]; value: T; onChange: (value: T) => void; label: string; className?: string; disabled?: boolean; } export function CustomSelect({ options, value, onChange, label, className = '', disabled = false }: CustomSelectProps) { const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); const selectedOption = options.find(opt => { if (typeof opt.value === 'number' && typeof value === 'number') { return opt.value === value; } return opt.value === value; }); // 点击外部关闭下拉菜单 useEffect(() => { function handleClickOutside(event: MouseEvent) { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsOpen(false); } } document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); return (
{/* 触发按钮 */} {/* 下拉箭头 */} {/* 下拉菜单 */} {isOpen && (
{options.map((option) => { const isSelected = typeof option.value === 'number' && typeof value === 'number' ? option.value === value : option.value === value; return ( ); })}
)}
); }