Я пытаюсь добавить модальное окно на свою страницу, но оно остается открытым только на секунду, а затем снова закрывается.
Вот мой код:
Home.js
import './Home.css';
import React, {useState} from 'react';
import Modal from "./components/Modal";
function Home() {
const [openModal, setOpenModal] = useState(false);
return (
<div>
{console.info(openModal)}
<div className = "App">
<header className = "App-header">
<h1 className = "App-name">iScore</h1>
</header>
</div>
<div className = "Auth-form-container">
<form className = "Auth-form">
<div className = "Auth-form-content">
<h3 className = "Auth-form-title">Sign In</h3>
<div className = "form-group-both">
<div className = "form-group mt-3">
<label>Email address: </label>
<input
type = "email"
className = "form-control mt-1"
placeholder = "Enter email"
/>
</div>
</div>
<div className = "form-group-pass">
<div className = "form-group mt-3">
<label>Password: </label>
<input
type = "password"
className = "form-control mt-1"
placeholder = "Enter password"
/>
</div>
</div>
<div className = "popup">
<button className = "submit"
>
Submit
</button>
</div>
{openModal && <Modal setOpenModals = {setOpenModal}/>}
<p className = "forgot-password text-right mt-2">
Forgot <a href = "#">password?</a>
</p>
<p>
Need an account?
</p>
<button className = "sign-up" onClick = {() => {
setOpenModal(true);
}}>Register
</button>
</div>
</form>
</div>
</div>
);
}
export default Home;
Modal.js
import "./Modal.css";
import {useState} from "react";
function Modal({ setOpenModals }) {
const handleChangeEvent = (event) => {
console.info("Checked: ", event.target.checked)
setAgreement(event.target.checked);
}
return(
<div className = "modalBackground">
<div className = "modalContainer">
<article>
<button className = "Close" onClick = {() => setOpenModals(false)}> × </button>
{/*<form>*/}
<div className = "Auth-form-content">
<h3 className = "Auth-form-title">Register</h3>
<div className = "form-group mt-3">
<label>Email address: </label>
<input
type = "email"
className = "form-control mt-1"
placeholder = "Enter email"
/>
</div>
<div className = "form-group mt-3">
<label>Email address: </label>
<input
type = "name"
className = "form-control mt-1"
placeholder = "Enter first name"
/>
</div>
<div className = "form-group mt-3">
<label>Password: </label>
<input
type = "password"
className = "form-control mt-1"
placeholder = "Enter password"
/>
</div>
<div className = "form-group mt-3">
<label>Confirm Password: </label>
<input
type = "password"
className = "form-control mt-1"
placeholder = "Enter password again"
/>
</div>
<div>
<input type = "checkbox" name = "terms" value = "yes" onChange = {handleChangeEvent}/>
<label htmlFor = "terms"> I agree to the terms and conditions</label>
</div>
</div>
{/*</form>*/}
</article>
<footer>
<button disabled = {!agreement} onClick = {() => {handleSubmit();setOpenModals(false)}}>Register</button>
<button onClick = {() => setOpenModals(false)} >Close</button>
</footer>
</div>
</div>
)
}
export default Modal
Кажется, что как только я нажимаю Register, я вижу в консоли, что для openModal установлено значение True, но затем сразу же возвращается значение false.
Я немного не понимаю, что нужно изменить, чтобы попытаться заставить эту работу работать. С моей точки зрения, это должно быть сделано правильно.
Я что-то упустил здесь?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проблема в том, что в Modal.js в <button disabled = {!agreement} onClick = {() => {handleSubmit();setOpenModals(false)}}>Register</button> вы используете необъявленный
agreement переменная, которая вызывает Modal.js ошибку и не отображается. Вам нужно передать agreement как опору или добавить новое состояние const [agreement, setAgreement] = useState(false) или удалить disabled = {!agreement} с кнопки в Modal.js
Отредактировано
У вас есть тег form в Home.js, и когда вы нажимаете кнопку Register, он открывает модальное окно и отправляет форму. По умолчанию кнопка имеет встроенное свойство типа submit. При нажатии или активации внутри формы эта форма будет отправлена (и вызовет соответствующее событие отправки). Это событие отправки приводит к закрытию Modal. Добавьте type = "button" к кнопке регистрации в Home.js.
Я удалил disabled = {!agreement}, но все равно без радости. Ошибки нет, модальное окно всплывает на секунду.
@HLT Я отредактировал свой ответ, теперь он должен работать
С этим все в порядке, большое спасибо, это сводило меня с ума
в:
<button disabled = {!agreement} onClick = {() =>
{handleSubmit();setOpenModals(false)}}>Register</button>
Вы вызываете setOpenModals false сразу после handleSubmit(), что вызывает немедленное закрытие модального окна.
Вам нужно закрыть модальное окно в функции handleSubmit().
Это должно вызываться только onClick, верно? Он не выполняется при модальной загрузке. Во всяком случае, я попытался полностью удалить эту строку, но она все еще не работает.
Итак,
setAgreementиagreementотсутствуют в коде, а это означает, что может отсутствовать и другой код, который может быть причиной вашей проблемы.