I want to use two dialog in sign up page and login page. the implement that I want to do are signup screen showing up when click to sign up button on the Top page, and login screen showing up when click to login Button on signup page.
I wrote open state on App.js. but the trouble is when it’s written in App.js, two of modal open..
Does anyone know how to settle it?
App.js
JavaScript
x
21
21
1
const App = () => {
2
3
const [open, setOpen] = useState(false);
4
5
const handleClickOpen = () => {
6
setOpen(true);
7
};
8
9
const handleClose = () => {
10
setOpen(false);
11
};
12
13
14
return (
15
<div>
16
<Top handleClickOpen={handleClickOpen}/>
17
<SignupModal open={open} handleClose={handleClose} />
18
<LoginModal open={open} handleClose={handleClose} />
19
</div>
20
)
21
Top.js
JavaScript
1
16
16
1
const Top = (props) => {
2
const classes = useStyles();
3
4
return (
5
<React.Fragment>
6
<div style={style}>
7
<Button variant="outlined" className={classes.loginButton} onClick={props.handleClickOpen}>
8
Login
9
</Button>
10
</div>
11
<h1>Toppage</h1>
12
</React.Fragment>
13
);
14
}
15
16
SignupModal.js
JavaScript
1
30
30
1
const SignupModal = (props) => {
2
return (
3
<div>
4
<Dialog
5
open={props.open}
6
onClose={props.handleClose}
7
aria-labelledby="alert-dialog-title"
8
aria-describedby="alert-dialog-description"
9
>
10
<DialogTitle id="alert-dialog-title" className={classes.title}>Sign up</DialogTitle>
11
<DialogContent className={classes.content}>
12
<div className={classes.text}>
13
<TextField id="standard-basic" label=“name” fullWidth/>
14
<TextField id="standard-basic" label=“email” fullWidth/>
15
<TextField id="standard-basic" label=“password” fullWidth/>
16
<TextField id="standard-basic" label=“pass”word fullWidth/>
17
</div>
18
</DialogContent>
19
<p className={classes.toLogin}>to Login</p>
20
<DialogActions>
21
<Button onClick={props.handleClose} className={classes.signUpButton}>
22
Send
23
</Button>
24
</DialogActions>
25
</Dialog>
26
</div>
27
);
28
}
29
30
LoginModal.ls
JavaScript
1
29
29
1
const LoginModal = (props) => {
2
return (
3
<div>
4
<Dialog
5
open={props.open}
6
onClose={props.handleClose}
7
aria-labelledby="alert-dialog-title"
8
aria-describedby="alert-dialog-description"
9
>
10
<DialogTitle id="alert-dialog-title" className={classes.title}>Login</DialogTitle>
11
<DialogContent className={classes.content}>
12
<div className={classes.text}>
13
<TextField id="standard-basic" label=“name” fullWidth/>
14
<TextField id="standard-basic" label=“pass”word fullWidth}/>
15
</div>
16
</DialogContent>
17
<DialogActions>
18
<Button onClick={props.handleClose} className={classes.signUpButton}>
19
Login
20
</Button>
21
</DialogActions>
22
</Dialog>
23
</div>
24
);
25
}
26
export default LoginModal
27
28
29
Advertisement
Answer
You are sharing the state on both of your modals that’s why.
The solution is simple, have 2 states; one that will determine if SignupModal
is opened or not and another one for LoginModal
.
JavaScript
1
16
16
1
const App = () => {
2
const [openLogin, setOpenLogin] = useState(false);
3
const [openSignup, setOpenSignup] = useState(false);
4
5
return (
6
<div>
7
<Top
8
onClickLogin={() => setOpenLogin(true)}
9
onClickSignup={() => setOpenSignup(true)}
10
/>
11
<SignupModal open={openLogin} handleClose={() => setOpenLogin(false)} />
12
<LoginModal open={openSignup} handleClose={() => setOpenSignup(false)} />
13
</div>
14
);
15
};
16
JavaScript
1
24
24
1
const Top = (props) => {
2
return (
3
<React.Fragment>
4
<div>
5
<Button
6
variant="outlined"
7
className={classes.loginButton}
8
onClick={props.onClickLogin}
9
>
10
Login
11
</Button>
12
<Button
13
variant="outlined"
14
className={classes.loginButton}
15
onClick={props.onClickSignup}
16
>
17
Signup
18
</Button>
19
</div>
20
<h1>Toppage</h1>
21
</React.Fragment>
22
);
23
};
24