繁体   English   中英

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

[英]Open and close React Material UI Snackbar component programmatically

我正在尝试在 React/Material-UI 中编写 SPA,但遇到了一些问题。 我开发了一个从导航栏上的按钮启动的模式登录框。 当用户按下提交时,我使用 fetch 调用后端 api 并根据返回的状态代码的结果,我想打开带有某些信息的快餐栏组件或关闭模式登录 window。

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

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

我很确定我错过了一些明显的东西:)

Login.js 反应组件

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 框架。

非常感谢任何帮助!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM