react中如何实现下拉菜单

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,
});

// 监听body的点击事件
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;
    // 找到选中的id所对应的下标
    const index = checkDeptIdData.findIndex((item) => item.id === selectData.id);
    // 38是每个选项的高度
    const scrollTop = index * 38;
    // 这里是我自己的一个处理,下标大于6我才需要滚动条滚动,可有可无看自己
    if (selectDomRef.current && index > 6) {
      selectDomRef.current.scrollTop = scrollTop;
    }
  }, [isShow]);
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值