reactjs 为什么onChange处理程序延迟了ToggleButtonsGroup mui组件中的本地状态更新?

7z5jn7bk  于 2023-02-08  发布在  React
关注(0)|答案(2)|浏览(128)

我的material-ui库的ToggleButtonGroup组件有一个问题,就是在onChange处理程序中,一开始我的代码比较复杂,我把问题一个一个的排除掉,直到我得到了这段代码,但是我无法理解这段代码的行为。

export default function ToggleButtons() {
    
    // setting local state
    const [values, setValues] = useState(()=>[]);

    // toggle buttons handler
    const onChangeHandler =(event: any,newValues: string[]) => {
        setValues(newValues);
        console.log('newValues',newValues);
        console.log('state values',values);
      };

    
    return (
        <ToggleButtonGroup
            value={values}
            onChange={onChangeHandler}
        >
            <ToggleButton value='first' >first</ToggleButton>
            <ToggleButton value='second' >second</ToggleButton>
            <ToggleButton value='third' >third</ToggleButton>
        </ToggleButtonGroup>
    );
}

从外表上看一切都很完美,但内心深处却有一些东西吸引着我。

但请检查我的控制台##

*选中第一个按钮

*未选中第一个按钮

*选中第二个按钮,然后选中第三个按钮

好像本地状态总是延迟,是不是写错了,如果没有,问题在哪里?

qjp7pelc

qjp7pelc1#

React异步更新状态,因此console.log打印的是过时的数据。
如果使用React dev tools查看状态,则它工作正常:

dauxcl2d

dauxcl2d2#

尝试使useState语句与文档中的完全相同。https://mui.com/material-ui/react-toggle-button/
看一看=〉您完成了:const [values, setValues] = useState(()=>[])他们做到了:

const [alignment, setAlignment] = React.useState<string | null>('left');

为什么要用数组而不是简单字符串?2看看它们的实现:

import FormatAlignCenterIcon from '@mui/icons-material/FormatAlignCenter';
import FormatAlignRightIcon from '@mui/icons-material/FormatAlignRight';
import FormatAlignJustifyIcon from '@mui/icons-material/FormatAlignJustify';
import ToggleButton from '@mui/material/ToggleButton';
import ToggleButtonGroup from '@mui/material/ToggleButtonGroup';

export default function ToggleButtons() {
  const [alignment, setAlignment] = React.useState<string | null>('left');

  const handleAlignment = (
    event: React.MouseEvent<HTMLElement>,
    newAlignment: string | null,
  ) => {
    setAlignment(newAlignment);
  };

  return (
    <ToggleButtonGroup
      value={alignment}
      exclusive
      onChange={handleAlignment}
      aria-label="text alignment"
    >
      <ToggleButton value="left" aria-label="left aligned">
        <FormatAlignLeftIcon />
      </ToggleButton>
      <ToggleButton value="center" aria-label="centered">
        <FormatAlignCenterIcon />
      </ToggleButton>
      <ToggleButton value="right" aria-label="right aligned">
        <FormatAlignRightIcon />
      </ToggleButton>
      <ToggleButton value="justify" aria-label="justified" disabled>
        <FormatAlignJustifyIcon />
      </ToggleButton>
    </ToggleButtonGroup>
  );
}

相关问题