react中如何实现下拉菜单
思路:
1点击某个特定区域展示下拉框,点击其他任意区域隐藏下拉框
2选择某个选项隐藏下拉框,再次打开时滚动到选中的选项
html部分
<div className={styles.staticDep}>
<span className={styles.label}>统计单位</span>
<div ref={selectRef} onClick={() => setIsShow(!isShow)} className={styles.value}>
<span>{selectData1.name}</span>
{isShow1 ? (
<div className={[styles.selectList, styles.selectList].join(' ')}>
{statisDepData.map((item) => (
<div
onClick={handleChange(item)}
key={item.id}
className={[
styles.listItem,
item.id === selectData.id ? styles.selectItem : '',
].join(' ')}
>
{item.name}
</div>
))}
</div>
) : (
''
)}
</div>
</div>
逻辑部分
const selectRef = useRef<HTMLDivElement | null>(null);
const [isShow, setIsShow] = useState<boolean>(false);
const [selectData, setSelectData] = useState<ItemData>({
name: '',
id: null as any,
});
useEffect(() => {
const handleSelect = (e: any) => {
const result = findDOMNode(selectRef.current as HTMLDivElement)?.contains(e.target);
if (!result) {
setIsShow(false);
}
};
document.body.addEventListener('click', handleSelect);
return () => {
document.body.removeEventListener('click', handleSelect);
};
}, []);
const handleChange = (data: ItemData) => () => {
if (data.id !== selectData.id) {
setSelectData(data);
}
setIsShow(false);
};
useEffect(() => {
if (!checkDeptIdData.length) return;
const index = checkDeptIdData.findIndex((item) => item.id === selectData.id);
const scrollTop = index * 38;
if (selectDomRef.current && index > 6) {
selectDomRef.current.scrollTop = scrollTop;
}
}, [isShow]);