MUI Badge与Dialog配合使用问题:点击Badge无法关闭Dialog求助
MUI Badge与Dialog配合的正确实现方式
你不能直接把Dialog嵌套在Badge里,原因很简单:MUI的Dialog默认通过Portal渲染到body下的独立DOM节点,和Badge不在同一层级,Badge根本包裹不住Dialog,而且Dialog的层级比Badge高,自然点不到Badge上的关闭事件。
正确的做法是把Badge放在Dialog内部,作为关闭按钮的一部分,通过定位让它显示在Dialog的右上角。下面是两种可行的实现方式:
方式一:配合DialogTitle使用
适合需要标题栏的场景,把Badge定位在标题栏右上角:
import { Dialog, DialogTitle, Badge } from '@mui/material'; // 组件内部代码 <Dialog open={open} onClose={handleClose}> <DialogTitle sx={{ position: 'relative', paddingRight: 4 }}> 对话框标题 <Badge color="error" variant="dot" badgeContent="X" onClick={handleClose} sx={{ cursor: 'pointer', position: 'absolute', top: -6, right: -6, }} overlap="circular" /> </DialogTitle> <div style={{ padding: '0 24px 24px' }}>Hii everyone!</div> </Dialog>
方式二:直接在Dialog内容区定位Badge
不需要标题栏时,可以把Badge直接放在Dialog内部,通过绝对定位固定在右上角:
import { Dialog, Badge } from '@mui/material'; // 组件内部代码 <Dialog open={open} onClose={handleClose} sx={{ position: 'relative' }}> <Badge color="error" variant="dot" badgeContent="X" onClick={handleClose} sx={{ cursor: 'pointer', position: 'absolute', top: 12, right: 12, zIndex: 1, // 确保Badge在Dialog内容之上 }} overlap="circular" /> <div style={{ padding: 24 }}>Hii everyone!</div> </Dialog>
这两种方式都能让Badge显示在Dialog的右上角,点击时正常触发关闭事件,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Lavish Tyagi
相关产品推荐
相关产品推荐

