import { memo, useEffect, useRef } from "react"; import useToggle from "../../hooks/useToggle"; import "../../less/common/selector.less"; interface TVObject { text: string; value: string; } interface Props { className?: string; value: string; dataSource: TVObject[]; handleValueChanged?: (value: string) => void; } const nullItem = { text: "Select", value: "", }; const Selector: React.FC = (props: Props) => { const { className, dataSource, handleValueChanged, value } = props; const [showSelector, toggleSelectorStatus] = useToggle(false); const seletorElRef = useRef(null); let currentItem = nullItem; for (const d of dataSource) { if (d.value === value) { currentItem = d; break; } } useEffect(() => { if (showSelector) { const handleClickOutside = (event: MouseEvent) => { if (!seletorElRef.current?.contains(event.target as Node)) { toggleSelectorStatus(false); } }; window.addEventListener("click", handleClickOutside, { capture: true, once: true, }); } }, [showSelector]); const handleItemClick = (item: TVObject) => { if (handleValueChanged) { handleValueChanged(item.value); } toggleSelectorStatus(false); }; const handleCurrentValueClick = (event: React.MouseEvent) => { event.stopPropagation(); toggleSelectorStatus(); }; return (
{currentItem.text}
{dataSource.map((d) => { return (
{ handleItemClick(d); }} > {d.text}
); })}
); }; export default memo(Selector);