在 Mutation 中出现错误时显示 SnackBar Material UI

Posted

技术标签:

【中文标题】在 Mutation 中出现错误时显示 SnackBar Material UI【英文标题】:Show SnackBar Material UI when appear erron in Mutation 【发布时间】:2019-07-04 02:16:29 【问题描述】:

我使用来自Materia-UI 页面的 Snack bar(第一个示例 - 自定义 SnackBars)

const variantIcon = 
  success: CheckCircleIcon,
  warning: WarningIcon,
  error: ErrorIcon,
  info: InfoIcon,
;

const styles1 = theme => (
  success: 
    backgroundColor: green[600],
  ,
  error: 
    backgroundColor: theme.palette.error.dark,
  ,
  info: 
    backgroundColor: theme.palette.primary.dark,
  ,
  warning: 
    backgroundColor: amber[700],
  ,
  icon: 
    fontSize: 20,
  ,
  iconVariant: 
    opacity: 0.9,
    marginRight: theme.spacing.unit,
  ,
  message: 
    display: 'flex',
    alignItems: 'center',
  ,
);

function MySnackbarContent(props) 
  const  classes, className, message, onClose, variant, ...other  = props;
  const Icon = variantIcon[variant];

  return (
    <SnackbarContent
      className=classNames(classes[variant], className)
      aria-describedby="client-snackbar"
      message=
        <span id="client-snackbar" className=classes.message>
          <Icon className=classNames(classes.icon, classes.iconVariant) />
          message
        </span>
      
      action=[
        <IconButton
          key="close"
          aria-label="Close"
          color="inherit"
          className=classes.close
          onClick=onClose
        >
          <CloseIcon className=classes.icon />
        </IconButton>,
      ]
      ...other
    />
  );


MySnackbarContent.propTypes = 
  classes: PropTypes.object.isRequired,
  className: PropTypes.string,
  message: PropTypes.node,
  onClose: PropTypes.func,
  variant: PropTypes.oneOf(['success', 'warning', 'error', 'info']).isRequired,
;

const MySnackbarContentWrapper = withStyles(styles1)(MySnackbarContent);

const styles2 = theme => (
  margin: 
    margin: theme.spacing.unit,
  ,
);

class CustomizedSnackbar extends React.Component 
  state = 
    open: false,
  ;

  handleClick = () => 
    this.setState( open: true );
  ;

  handleClose = (event, reason) => 
    if (reason === 'clickaway') 
      return;
    
    this.setState( open: false );
  ;

  render() 
    return (
      <div>
        <Snackbar
          anchorOrigin=
            vertical: 'bottom',
            horizontal: 'left',
          
          open=this.state.open
          autoHideDuration=2000
          onClose=this.handleClose
        >
          <MySnackbarContentWrapper
            onClose=this.handleClose
            variant="error"
            message="This is an error message!"
          />
        </Snackbar>
      </div>
    );
  


export default withStyles(styles2)(CustomizedSnackbar);

在示例中,当点击按钮“OPEN SUCCESS SNACKBAR”时会显示小吃店

当我的表单上来自 Apollo 的 Mutation 出现错误时,我想显示错误小吃吧。

render()
 return(
  <div>
   <Mutation
    mutation=this.mutationQuery
    onError=() =>
     //here show Snack Bar
    
    onCompleted=data =>  console.log(data); 
   >
  mutation => (
//here is the form
)
)

问题是我不知道如何触发以在 on Error 函数中显示 SnackBar。如何更改小吃店的状态?我正在尝试来自here 的解决方案,但我收到一个错误

openSnackbarFn 不是函数

提前致谢。

【问题讨论】:

也是,但我想显示出现错误的消息 创建一个函数,然后从 onError 和 onComplete 调用它 但是这个函数应该是什么样子? 普通的 javascript 函数并调用它,就像你从你的反应组件调用事件监听器上的函数一样 但是这个函数将如何告诉 Snackbar 显示,它如何改变 Snackbar 中的状态? 【参考方案1】:

从根本上说,您希望您的 Snackbar 成为您的 Mutation 的兄弟,并让它们的共同父级(即您的组件)处理 Snackbar 的打开/关闭状态。

类式组件

class FormWithMutationAndSnackbar extends React.Component 
  state = 
    open: false
  

  handleOpen = () => this.setState( open: true )

  handleClose = () => this.setState( open: false )

  render() 
    const  open  = this.state
    return(
      <React.Fragment>
        <Mutation
          mutation=this.mutationQuery
          onError=(err) => 
            // use err to set Snackbar contents for example
            this.handleOpen()
          
          onCompleted=data =>  console.log(data); 
        >
          mutation => (
            //here is the form
          )
        </Mutation>
        <Snackbar
          open=open
          onClose=this.handleClose
          // other Snackbar props
        >
          // Snackbar contents
        </Snackbar>
      </React.Fragment>
    )
  

带有 Hooks 的功能组件

const FormWithMutationAndSnackbar = () => 
  const [open, setOpen] = useState(false)

  return(
    <React.Fragment>
      <Mutation
        mutation=this.mutationQuery
        onError=(err) => 
          // use err to set Snackbar contents for example
          setOpen(true)
        
        onCompleted=data =>  console.log(data); 
      >
        mutation => (
          //here is the form
        )
      </Mutation>
      <Snackbar
        open=open
        onClose=() => setOpen(false)
        // other Snackbar props
      >
        // Snackbar contents       
      </Snackbar>
    </React.Fragment>
  )

【讨论】:

***.com/questions/60508814/…

以上是关于在 Mutation 中出现错误时显示 SnackBar Material UI的主要内容,如果未能解决你的问题,请参考以下文章

从按钮操作中调用变量并在出现错误时显示错误消息

我在颤动中的捕获错误没有按我想要的那样工作。我想在出现错误但未显示时显示错误消息

Laravel 5刀片在出现错误而不是抛出异常时显示空白页面

Cocoapods 出现问题,在安装 pod 时显示错误“无法确定 URL 的 repo 类型”

discord.py - 出现 MissingRequiredArgument 错误时显示正确的命令语法

当 Apollo GraphQL 失败并出现错误时显示 MatSnackBar 消息