重复问题
- 我搜索了现有的问题
最新版本
- 我测试了最新版本
重现步骤 🕹
步骤:
- 不要使用硬编码的文本,而是使用'useState'代替Popover中的子值。
例如:{text}。 // 这将导致问题
<Popover
id={id}
open={open}
anchorEl={anchorEl}
onClose={handleClose}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'left',
}}
>
<Typography sx={{ p: 2 }}>{text}</Typography>
</Popover>
例如:硬编码文本不会导致问题。
<Popover
id={id}
open={open}
anchorEl={anchorEl}
onClose={handleClose}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'left',
}}
>
<Typography sx={{ p: 2 }}>HARD CODE TEXT</Typography>
</Popover>
当前行为 😯
链接到实时示例:
https://codesandbox.io/s/nfxd61?file=/demo.tsx
问题:
当使用'useState'切换Popover内的文本时,请注意Popover关闭了,但您会看到带有空文本的div在完全关闭之前消失。然而,硬编码文本工作得很好。
屏幕录制:2023-03-27.at.10.55.06.AM.mov
代码:
import * as React from 'react';
import Popover from '@mui/material/Popover';
import Typography from '@mui/material/Typography';
import Button from '@mui/material/Button';
export default function BasicPopover() {
const [anchorEl, setAnchorEl] = React.useState<HTMLButtonElement | null>(null);
const [text, setText] = React.useState('');
const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
setText('hello');
setAnchorEl(event.currentTarget);
};
const handleClose = () => {
setAnchorEl(null);
setText('');
};
const open = Boolean(anchorEl);
const id = open ? 'simple-popover' : undefined;
return (
<div>
<Button aria-describedby={id} variant="contained" onClick={handleClick}>
Open Popover
</Button>
<Popover
id={id}
open={open}
anchorEl={anchorEl}
onClose={handleClose}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'left',
}}
>
<Typography sx={{ p: 2 }}>{text}</Typography>
</Popover>
</div>
);
}
预期行为 🤔
我认为它应该只是关闭,而不必看到淡出效果。
上下文 🔦
我只是想用'useState'关闭Popover中的文本
你的环境 🌎
我正在使用MUI的示例:
链接到MUI Popover: https://mui.com/material-ui/react-popover/
5条答案
按热度按时间vvppvyoh1#
当前的解决方法是检查'open && anchorEl'是否存在。
gojuced72#
这似乎是由于过渡不是立即发生的,所以我们在关闭阶段看到了内容的变化。这个问题也发生在使用useEffect和等待状态更新时。如果你们愿意分配给我,我可以明天提供更多细节和可能的解决方案!
q9rjltbz3#
@kriskw1999 - 听起来不错。我该如何指派给你?
6ljaweal4#
对不起,"你"我指的是一个维护者。
5cg8jx4n5#
@luan-dang-techlabs 我完成了我的调查,我尝试了一些用例,并确认这个问题与元素的过渡有关。
由于Popover的内容是一个动态的React子元素,它会随着时间的推移而发生变化,这也意味着在过渡期间会发生这种情况。
为了避免这种情况,你可以采取以下两种方法:
transitionDuration={0}
,这将删除动画效果,你将看不到破坏性的关闭过程