【问题标题】:Blank page on state change of Material UI ModalMaterial UI Modal 状态变化的空白页
【发布时间】:2021-08-15 21:42:09
【问题描述】:

嘿,我已经尝试了很多东西,但我似乎无法让这个东西发挥作用有谁知道为什么会发生这里是我的代码 一个

    import {Button,Modal} from "@material-ui/core";
import {useState} from "react";

import RegisterBody from '../Register/RegisterForm'
import LoginBody from '../Login/LoginForm'

const UserModel = () => {
    const [isOpen, setIsOpen] = useState(false)
    const [isLoginModel, setLoginModel] = useState();


    const [MainModelBody] = useState(LoginBody);

    function handleRegister() {
        if (!isLoginModel) {
            console.log("Register")
            //Todo: Send Register Request
        } else {
            MainModelBody.setState(RegisterBody)
            setLoginModel(false)
        }
    }

    function handleSignIn() {
        if (isLoginModel) {
            console.log("Login")
            //Todo: send Sign in request
        } else {
            MainModelBody.setState(LoginBody)
            setLoginModel(true)
        }
    }

    function handleUserModel() {
        setIsOpen(!isOpen)
    }

    return (
        <>
            <Button className="userActionButton" onClick={handleUserModel}>Sign In</Button>

            <Modal open={isOpen}
                   onClose={!isOpen}
                   disablePortal
                   disableEnforceFocus
                   disableAutoFocus
                   aria-labelledby="simple-modal-title"
                   aria-describedby="simple-modal-description"

            >
                <div className = 'UserModel'>
                    <LoginBody/>
                    <Button onClick={handleRegister}>Register</Button>
                    <Button onClick={handleSignIn}>Sign In</Button>
                </div>
            </Modal>
        </>
    );
}

export default UserModel

登录正文

import {useState} from 'react';

import  LoginElements from './LoginElements';
import {FormControl} from "@material-ui/core";

const LoginForm = ()=> {
    const [email, setEmail]  = useState('')
    const [password, setPassword]  = useState('')

    const handleSubmit = (e) => {
        e.preventDefault();
        const user = {email, password}
        console.log(user)
    };

    return (
      <div className="form">
          <FormControl noValidate autoComplete="off" onSubmit={handleSubmit}>
              <LoginElements
                  email={email}
                  password={password}
                  setEmail={setEmail}
                  setPassword={setPassword}
              />
          </FormControl>
      </div>
    );
}
export default LoginForm;

登录元素

import {Button, TextField} from "@material-ui/core";

const LoginElements = (props) => {
    return (
        <>
            <TextField label="Email" type="email" required value={props.email} onChange={(e) => props.setEmail(e.target.value)}/>
            <br/>
            <TextField label="Password" type="password" required value={props.password} onChange={(e) => props.setPassword(e.target.value)}/>
            <br/>
            <Button variant="contained" type="submit">Login</Button>
            <Button variant="contained" type="register">Register</Button>
            <br/>
            <label>{props.email}</label>
            <label>{props.password}</label>
        </>
    )
}

export default LoginElements;

注册正文

    import {useState} from 'react';

import  RegisterElements from './RegisterElements';

const LoginForm = ()=> {
    const [email, setEmail]  = useState('')
    const [confirmEmail, setConfirmEmail]  = useState('')
    const [password, setPassword]  = useState('')
    const [confirmPassword, setConfirmPassword]  = useState('')

    const handleSubmit = (e) => {
        e.preventDefault();
        const user = {email, password}
        console.log(user)
    };

    return (
        <div className="form">
            <form  noValidate autoComplete="off" onSubmit={handleSubmit}>
                <RegisterElements
                    email={email}
                    confirmEmail={email}
                    password={password}
                    confirmPassword={password}
                    setEmail={setEmail}
                    setConfirmEmail={setEmail}
                    setPassword={setPassword}
                    setConfirmPassword={setPassword}
                />
            </form>
        </div>
    );
}
export default LoginForm;

注册元素

import {Button, TextField} from "@material-ui/core";

const RegisterElements = (props) => {
    return (
        <>
            <TextField label="Confirm Email" type="email" required value={props.email}
                       onChange={(e) => props.setEmail(e.target.value)}/>
            <TextField label="Confirm Email" type="email" required value={props.confirmEmail}
                       onChange={(e) => props.setConfirmEmail(e.target.value)}/>
            <br/>
            <TextField label="Password"
                       type="password"
                       required value={props.password}
                       onChange={(e) => props.setPassword(e.target.value)}/>
            <TextField label="Confirm Password" required value={props.confirmPassword}
                       onChange={(e) => props.setConfirmPassword(e.target.value)}/>
            <br/>
            <Button variant="contained" type="Login">Login</Button>
            <Button variant="contained" type="submit">Login</Button>

            <label>{props.email}</label>
            <label>{props.password}</label>
        </>
    )
}

export default RegisterElements;

抱歉,我是 react 新手

【问题讨论】:

  • 你的 LoginBody 组件中有什么?
  • MainModelBody.setState(RegisterBody)MainModelBody.setState(LoginBody) 在做什么?请在您的问题中包含所有相关代码。这些对我来说似乎很可疑。您是否真的尝试有条件地渲染 RegisterBodyLoginBody 组件并传递额外的道具?
  • Main body.setState 只是尝试用状态更改主体我没有成功解决这个问题是当我在模型中设置 open={true} 时它完美地显示模型但是当我这样做时与 statechange 和 userActionButton 相同,由于某种我不知道的原因,它向我显示了空白页
  • 编辑您的帖子以包含代码,而不是将其作为评论发布
  • 正如你所说,是的,我正在尝试有条件地渲染其中一个,但如果你知道更好的方法,请告诉我

标签: javascript reactjs material-ui


【解决方案1】:

您正在“切换”isLoginModel 状态,但您只在 JSX 中呈现 LoginBody

您应该能够使用isLoginModel 状态并有条件地将LoginBodyRegisterBody 组件渲染到模态体中。确实不需要额外的状态来保存组件引用。

import {Button,Modal} from "@material-ui/core";
import {useState} from "react";

import RegisterBody from '../Register/RegisterForm'
import LoginBody from '../Login/LoginForm'

const UserModel = () => {
  const [isOpen, setIsOpen] = useState(false)
  const [isLoginModel, setLoginModel] = useState(true); // login by default

  function handleRegister() {
    if (!isLoginModel) {
      console.log("Register");
      // TODO: Send Register Request
    } else {
      setLoginModel(false);
    }
  }

  function handleSignIn() {
    if (isLoginModel) {
      console.log("Login");
      // TODO: send Sign in request
    } else {
      setLoginModel(true);
    }
  }

  function handleUserModel() {
    setIsOpen(isOpen => !isOpen);
  }

  return (
    <>
      <Button className="userActionButton" onClick={handleUserModel}>Sign In</Button>

      <Modal open={isOpen}
        onClose={!isOpen}
        disablePortal
        disableEnforceFocus
        disableAutoFocus
        aria-labelledby="simple-modal-title"
        aria-describedby="simple-modal-description"
      >
        <div className='UserModel'>
          {isLoginModel ? <LoginBody /> : <RegisterBody />} // <-- condition render
          <Button onClick={handleRegister}>Register</Button>
          <Button onClick={handleSignIn}>Sign In</Button>
        </div>
      </Modal>
    </>
  );
}

【讨论】:

  • 好吧,是的,回答了条件渲染,你能明白为什么当我使用状态布尔值打开模型时我得到空白屏幕吗?
  • @Bhavishya 我仔细研究了您的代码,除了我怀疑 CSS 之外,我没有看到任何明显的原因导致页面为空白。您可以尝试创建一个重现空白页问题的 running 代码框吗?我也试试。
  • codesandbox.io/s/nifty-ride-ns1dj 我希望这对你可见?
  • @Bhavishya 它是为我渲染的,我必须应用一些 CSS 让它看起来更像一个模态。请参阅我的codesandbox 尝试。由于 Modal 只是其他几个 MUI 组件的基础组件,您可能希望使用 Dialog 组件。
猜你喜欢
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
  • 2021-10-08
  • 2021-04-11
  • 2021-03-06
  • 1970-01-01
  • 2018-05-25
  • 2022-01-25
相关资源
最近更新 更多