material-ui 使用'useState'在Popover内部处理字符串时无法正常工作,

mzsu5hc0  于 6个月前  发布在  其他
关注(0)|答案(5)|浏览(54)

重复问题

  • 我搜索了现有的问题

最新版本

  • 我测试了最新版本

重现步骤 🕹

步骤:

  1. 不要使用硬编码的文本,而是使用'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/

示例

vvppvyoh

vvppvyoh1#

当前的解决方法是检查'open && anchorEl'是否存在。

gojuced7

gojuced72#

这似乎是由于过渡不是立即发生的,所以我们在关闭阶段看到了内容的变化。这个问题也发生在使用useEffect和等待状态更新时。如果你们愿意分配给我,我可以明天提供更多细节和可能的解决方案!

q9rjltbz

q9rjltbz3#

@kriskw1999 - 听起来不错。我该如何指派给你?

6ljaweal

6ljaweal4#

对不起,"你"我指的是一个维护者。

5cg8jx4n

5cg8jx4n5#

@luan-dang-techlabs 我完成了我的调查,我尝试了一些用例,并确认这个问题与元素的过渡有关。
由于Popover的内容是一个动态的React子元素,它会随着时间的推移而发生变化,这也意味着在过渡期间会发生这种情况。
为了避免这种情况,你可以采取以下两种方法:

  • 使用超时延迟更新子元素的值(这将保持在关闭时的动画效果)
  • 设置transitionDuration={0},这将删除动画效果,你将看不到破坏性的关闭过程

相关问题