以编程方式打开和关闭React Material UI Snackbar组件

时间:2019-09-18 20:48:04

标签: javascript reactjs material-ui

我正在尝试在React / Material-UI中编写SPA,但遇到一些问题。我已经开发了一个模式登录框,该对话框是通过导航栏上的按钮启动的。当用户按下Submit时,我会使用fetch调用后端api,然后根据返回的状态代码的结果,我想打开包含某些信息的小吃店组件或关闭模式登录窗口。

我已经学会通过单击链接来打开小吃店,但是我该如何以编程方式打开小吃店?我还需要在api调用成功后关闭我的模式窗口,我也不知道该如何实现。我也可以通过手动单击导航栏上与原始按钮绑定的链接来实现此目的。

我已经尝试使用文档中的基本快餐栏示例并将其放在单独的组件中,但是它仅显示了如何通过单击实际Snackbar功能组件中已经存在的链接来启动它们。我需要知道如何通过另一个组件以编程方式显示小吃店。

我很确定我缺少明显的东西:)

Login.js React组件

import React, {Component} from 'react'
import Button from '@material-ui/core/Button'
import TextField from '@material-ui/core/TextField'
import CustomizedSnackbars from './CustomSnackbars'

class LoginDialog extends Component {

    constructor(props) {
        super(props);
        this.state = {username: "",
                      password: ""};

        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
    }

    handleChange(event) {
      <some code>
    }

    handleSubmit(event) {
        event.preventDefault();
        const data = {
            "username":this.state.username,
            "password":this.state.password
        }

        fetch("https://mywebsite.com/auth/login", {
            method: "POST",
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
            },
            body:  JSON.stringify(data)
        })
        .then(function(response){
            if (response.status === 200) {
                console.log("good boye") 
                //---------------------------------
                // WANT TO CLOSE LOGIN DIALOG HERE;
                //---------------------------------
            } else if (response.status === 401) {
                console.log("naughty naughty")
                //---------------------------------
                // WANT TO DISPLAY SNACKBAR HERE
                //---------------------------------
            } else if (response.status === 502) {
                console.log("off it's hinges, innit")
            } else {
                console.log("sumat went bang")
            }
            return response.json();
        });
    }

    render() {
        return (
            <div className="modal-outer">
            <div className="modal-inner">
                <h3>Login</h3>
                <TextField
                />
                <br />
                <TextField
                />
                <Button variant="outlined" onClick={this.props.closePopup} color="secondary">
                    Cancel
                </Button>
                &nbsp;
                <Button variant="outlined" onClick={(event) => this.handleSubmit(event)} color="primary">
                    Login
                </Button>
            </div>
            </div>
        );
  }
}

export default LoginDialog

我可以在Snackbar组件上调用/制作某种displaySnackbar方法吗?如何在功能组件上调用方法或函数?

我很难理解React如何组合在一起。我是一个后端开发人员,但是过去我曾经使用过JQuery和其他Javascript框架。

任何帮助,不胜感激!

1 个答案:

答案 0 :(得分:0)

在React中,您只能显示render()内部的内容。这意味着您需要在渲染器中包括快餐栏组件。您可以使用条件渲染来决定是否显示它们。通常,这是通过组件状态中的某个值来完成的。您应该在构造函数中将状态标志初始化为false,然后在获取响应代码中调用setState()以将其设置为true