【问题标题】:Dismiss Snackbar Onclick of React Alert component关闭 React Alert 组件的 Snackbar Onclick
【发布时间】:2020-04-21 18:15:16
【问题描述】:

我有一个 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>
);
}

【问题讨论】:

    标签: javascript reactjs snackjs


    【解决方案1】:

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

    所以

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

    应该是

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

    您还依赖道具中的open 来处理snackbar 组件的状态(打开/关闭)。因此,除非 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>
      );
    }
    

    【讨论】:

    • 这解决了错误,但不会关闭或关闭 Snackbar。任何关闭 Snackbar 的帮助将不胜感激。
    • 这个很好理解。您将 Snackbar 的当前状态保留在同一个组件中,并在必要时对其进行更新。
    • 正确。这样您就可以管理小吃店的状态。如果您不想这样做,那么您将不得不调用作为 open 所有者的父级的方法,这将更新状态
    • 那么在这种情况下发生的情况是,一旦你关闭了snackbar并且你再次发出请求而不刷新浏览器,除非你刷新浏览器,否则Snackbar不会显示。所以最有效的方法是让作为所有者的父级更新状态。
    • 我整晚都在尝试采用第二种方法,以便让 Snackbar 显示多次,而不仅仅是一次。任何帮助我处理来自父母的状态的代码将不胜感激。 @Sushanth
    猜你喜欢
    • 2020-01-19
    • 2022-01-23
    • 2021-12-19
    • 2020-11-28
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    相关资源
    最近更新 更多