关闭 React Alert 组件的 Snackbar Onclick

Dismiss Snackbar Onclick of React Alert component

我有一个在父组件中调用的 React Snackbar 组件,我根据严重性、消息和打开传递了 props 到 Snackbar 组件。我能够访问子 Snackbar 组件中的道具。但是,当关闭 Snackbar 或尝试关闭它时,我收到错误 TypeError: setOpen is not a function.

 export default function MessageSnackbars(props) {
 const classes = useStyles();
 const [setOpen] = React.useState(false);
 const message = props.message;
 const severity = props.severity;
 const open = props.open;

 const handleClose = (event, reason) => {
    if (reason === 'clickaway') {
    return;
 }

setOpen(false);
};

return (
<div className={classes.root}>
  <Snackbar
    autoHideDuration={6000}
    onClose={handleClose}
    open={open}
  >
    <Alert
      onClose={handleClose}
      severity={severity}
    >
      {message}
    </Alert>
  </Snackbar>
</div>
);
}

数组中的第一项是状态,第二项是状态更新函数。

所以

const [setOpen] = React.useState(false);

应该是

const [ ,setOpen] = React.useState(false);

您还依赖道具中的 open 来处理 snackbar 组件的状态 (open/close)。因此,除非 props.open 在父级中更新,否则它不会真正关闭组件。

另一种方法是使 props.open 在组件内保持同步,这将按预期工作。

export default function MessageSnackbars(props) {
  const classes = useStyles();
  const {message, severity, open} = props;
  // Uses props.open to keep track of the open state 
  const [isLocalOpen, setIsLocalOpen] = React.useState(open);

  // Used to keep the props.open in sync
  // as part of the local state
  useEffect(() => {
    setIsLocalOpen(open);
  }, [open]);

  const handleClose = (event, reason) => {
    if (reason === 'clickaway') {
      return;
    }

    setIsLocalOpen(false);
  };

  return (
    <div className={classes.root}>
      <Snackbar autoHideDuration={6000} onClose={handleClose} open={isLocalOpen}>
        <Alert onClose={handleClose} severity={severity}>
          {message}
        </Alert>
      </Snackbar>
    </div>
  );
}