antd的下拉菜单dropdown组件,如何控制点击空白处时,二级菜单一层一层收起,且阻止页面其他点击事件

本文介绍如何使用Antd UI库中的Dropdown组件实现多级下拉菜单的自定义行为,包括独立控制各层级的展开与收起,以及通过添加Modal组件作为蒙版阻止页面上的其他点击事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:下文中提到的下拉框、对话框以及其他UI组件都是antd UI库中的,更多操作请看antd官方文档API,点击此处跳转至antd的下拉菜单dropdown组件官网。

情景/目标:工作中遇到的需求:

1、当下拉菜单展开多层时(如下图  有二级下拉菜单展开),点击页面其他地方,只是收起二级菜单,一级菜单不收起,再次点击收起一级菜单。antd默认点击别处,展开的菜单全部收起

2、当页面中有下拉菜单展开时,点击空白处任何地方,都是收起一层下拉菜单,页面中下拉菜单全部收起后,点击、双击等操作才会出发页面中的其他点击事件

问题1的解决方法:Dropdown组件的 visible 和 onVisibleChange属性

visible属性控制Dropdown组件的显示与隐藏,true为显示,false为隐藏

onVisibleChange在visible被改变时调用

所以,当两个属性都不写的时候,就是系统的、点击页面空白处切换显示与隐藏

当指定visible属性,就根据visible的值来控制显隐,此时点击空白处不再能切换显隐除非再指定onVisibleChange属性来配合

两个属性一起使用,既可以通过visible控制显隐,又可以通过点击页面空白来控制显隐。

<Dropdown
    visibel={变量}//通过该变量来手动控制显隐
    onVisibleChange={visible=>变量:visible}//点击空白处时正常显隐,因为把变量改变了,显隐也就改变了
/>

到这里,我们知道了怎么单独控制菜单的显隐。所以我们可以在state里指定一个first变量来控制一级菜单的显隐,就可以让一级菜单的visible={first} 同理,令二级菜单的visible={second}

于是,在二级菜单里面可以设置visible和onVisibleChange:

visible={this.state.second}
//点击页面其他地方时:
onVisibleChange={visible=>
                  this.setState({
                    first:true,//保持一级依然显示
                    second:visible//二级菜单显示与隐藏
                  })
                }

这样二级菜单关闭时,就不会自动把一级菜单也关闭了。

然后控制一级菜单,在一级菜单里面设置visible和onVisibleChange:

visible={this.state.first}
onVisibleChange={this.handleFirstChange}//这一步操作不止一步,所以另写一个函数handleFirstChange来实现,方便阅读


//点击空白处时
handleFirstChange=(visible)=>{

    if(this.state.second){//判断,如果二级菜单依然在展开,就保持一级为true
        this.setState({
            first:true
        })
    }else{
        this.setState({
            first:visible//否则,二级菜单已经关闭了,一级菜单正常关闭
        })
    }
}


 

问题二:菜单弹出时,阻止页面其他点击动作,无论怎么点击,都只是收起一层菜单,直至菜单全部收起

解决方法:添加蒙版阻止其他事件。这里采用加了一个Modal组件。 

使mask层不显示、对话框也不显示:

 <Modal
        visible={this.state.first || this.state.second}//一级菜单、二级菜单,只要有一个是显示的,蒙层就显示
        style={{ display: "none" }}
        mask={false}
 >
</Modal>

Modal与Dropdown是兄弟关系即可

你可能已经注意到了Modal也有visible  与Dropdown相同,也是用来控制显隐。

个人工作整理,欢迎提建议!    完结撒花🎉

彩蛋:如果有些地方只能放一个子元素,但是我们想要放多个,必须在外层包一个div吗???-------------不必!用一对<> </>空标签包裹即可。

antd中的Dropdown组件通常需要一个触发元素,比如一个按钮或图标,来展示下拉菜单。如果你希望Dropdown在没有子元素的情况下依然能够点击触发弹出菜单,你可以通过添加一个透明的占位元素(比如一个无样式的`div`)来作为触发器。你可以将这个占位元素设置为Dropdown的`trigger`属性,并通过点击这个占位元素来打开下拉菜单。此外,你还可以通过设置`overlay`属性来定义下拉菜单的内容,即使这个内容是空的,你也可以用它来控制菜单的显示与隐藏。 这里提供一个基本的示例代码,说明如何实现这一点: ```jsx import { Dropdown, Menu } from 'antd'; import React, { useState } from 'react'; const DropDownExample = () => { const [visible, setVisible] = useState(false); const showDropdown = () => { setVisible(true); }; const hideDropdown = () => { setVisible(false); }; return ( <> <div onClick={showDropdown} onContextMenu={hideDropdown} // 右键点击隐藏下拉菜单 > 点击我显示下拉菜单(即使没有内容) </div> <Dropdown visible={visible} onVisibleChange={setVisible} overlay={ // 这里可以放置你想要的下拉内容,即使为空,也可以用一个空的Menu来占位 <Menu /> } > <div className="dropDownButton">下拉菜单</div> </Dropdown> </> ); }; export default DropDownExample; ``` 请注意,上面的代码示例中添加了一个透明的占位元素`dropDownButton`来模拟触发 Dropdown 的动作,同利用了`visible`状态来控制 Dropdown 的显示与隐藏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值