首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用react-modal组件关闭我的Modal?

如何使用react-modal组件关闭我的Modal?
EN

Stack Overflow用户
提问于 2020-12-12 22:34:26
回答 2查看 263关注 0票数 0

嗨,朋友们,我有一个问题,如果有人能帮助我,我将非常感激,我不知道为什么我的模式不能使用shouldCloseOnOverlayClick = {true}关闭,即使不使用它也不关闭,我会把代码: components/_App/ModalLogin.js

代码语言:javascript
复制
import React from 'react';
import ReactDOM from 'react-dom';
import Modal from 'react-modal';
import catchErrors from '../../utils/catchErrors';

const INITIAL_USER = {
    email: '',
    password: ''
}

const ModalLogin = ({isOpen, close }) => {
    const [user, setUser] = React.useState(INITIAL_USER);
    const [disabled, setDisabled] = React.useState(true);
    const [loading, setLoading] = React.useState(false);
    const [error, setError] = React.useState('');
    

    React.useEffect((modal) => {
        const isUser = Object.values(user).every(el => Boolean(el));
        isUser ? setDisabled(false) : setDisabled(true)
    }, [user]);

    const handleChange = (e) => {
        const { name, value } = e.target;
        setUser(prevState => ({ ...prevState, [name]: value }));
    }

    const handleSubmit = async e => {
        e.preventDefault();
        try {
            setLoading(true);
            setError('');
            const url = `${baseUrl}/api/login`;
            const payload = { ...user };
            const response = await axios.post(url, payload);
            handleLogin(response.data);
        } catch (error) {
            catchErrors(error, setError);
        } finally {
            setLoading(false);
        }
    }

    const customStyles = {
        content: {
            top: '50%',
            left: '50%',
            right: 'auto',
            bottom: 'auto',
            marginRight: '-50%',
            transform: 'translate(-50%, -50%)'
        }
    };
 console.log(close)

    return (
        <Modal
            isOpen={isOpen}
            style={customStyles}
            onRequestClose={close}
            shouldCloseOnOverlayClick={true}
        >

            <div className="">
                <div className="theme_login_box radius">
                    <header>
                        <h1>Fazer Login:</h1>
                        <p>Informe seu nome e e-mail para fazer login e acessar seus pedidos.</p>
                    </header>
                    <form method="POST" onSubmit={handleSubmit}>
                        <input className="radius" type="email" name="email" value={user.email} onChange={handleChange} placeholder="E-mail:" />
                        <input className="radius" type="password" name="password" value={user.password} onChange={handleChange} placeholder="Senha:" />
                        <button className="btn transition radius icon-success" type="submit" href="/" title="Minha conta" >Fazer Login</button>
                    </form>
                    <a href="#" title="Recuperar senha" className="theme_login_box_recover transition icon-alert">Esqueci minha senha</a>
                </div>
            </div>
        </Modal>
    )
};

export default ModalLogin;

我的文件,我在其中调用模式: components/_App/StaticHeader.js

代码语言:javascript
复制
import React from 'react';
import Link from "next/link";
import Router, { useRouter } from 'next/router';
import NProgress from 'nprogress';
import { handleLogout } from '../../utils/auth';
import ModalLogin from './ModalLogin';
import ReactDOM from 'react-dom';
import Modal from 'react-modal';

Router.onRouteChangeStart = () => NProgress.start();
Router.onRouteChangeComplete = () => NProgress.done();
Router.onRouteChangeError = () => NProgress.done();



const StaticHeader = ({ user }) => {


    const router = useRouter();
    const [menuActive, setMenuActive] = React.useState(false);
    const [search, setSearch] = React.useState({ search: '' });

    //console.log(user)
    const isRoot = user && user.role == 'root';
    const isAdmin = user && user.role == 'admin';
    const isRootOrAdmin = isRoot || isAdmin;
    const [modalIsOpen, setIsOpen] = React.useState(false);

    function openModal() {
        setIsOpen(true);
    }

    function closeModal() {
        setIsOpen(false);
    }

    const isActive = (route) => {
        return route == router.pathname;
    }

    const handleOnChange = (e) => {
        const { name, value } = e.target;
        setSearch(prevState => ({ ...prevState, [name]: value }))
    }

    const handleSearch = (e) => {
        Router.push({
            pathname: '/products',
            query: { term: search.search }
        })
    }

    const menuToggle = () => {
        setMenuActive(!menuActive)
    }


    return (
        <header className="main_header">
            <div className="container">
                <div className="main_header_nav">
                    <div className="main_header_nav_logo">
                        <a href="" title="WdpShoes | Home">
                            <img alt="logo" title="logo menu" src="/css/themes/logo/wdpshoes_logo_white.png" />
                        </a>
                    </div>
                    <div className="main_header_nav_search">
                        <form action="" method="post" className="radius">
                            <input type="text" name="s" placeholder="Pesquisar na loja:" />
                            <button className="icon-search icon-notext transition"></button>
                        </form>
                    </div>
                    <div className="main_header_nav_menu">
                        <a className="icon-cart icon-notext transition main_header_nav_menu_cart" href="/cart"><span>3</span></a>
                        <div className="main_header_nav_menu_user">
                            <a href="#" title="#" className="icon-user main_header_nav_menu_user_a radius transition" onClick={openModal} >
                                {modalIsOpen && <ModalLogin isOpen={openModal} close={closeModal}/> }

                            Login</a>
                            <nav className="radius">
                                <a href="#">Meus Pedidos</a>
                                <a href="#">Meus Pedeidos</a>
                                <a href="#">Meus endereços</a>
                                <a href="#">Sair</a>
                            </nav>
                        </div>
                    </div>
                </div>

                <ul className="main_header_departments">
                    <li className="main_header_departments_li">
                        Departamento
                    <ul className="main_header_departments_li_ul">
                            <li className="main_header_departments_li_ul_li"><a href="">Categoria</a></li>
                            <li className="main_header_departments_li_ul_li"><a href="">Categoria</a></li>
                            <li className="main_header_departments_li_ul_li"><a href="">Categoria</a></li>
                            <li className="main_header_departments_li_ul_li"><a href="">Categoria</a></li>
                        </ul>
                    </li>
                    <li className="main_header_departments_li">
                        Departamento
                    <ul className="main_header_departments_li_ul">
                            <li className="main_header_departments_li_ul_li"><a href="">Categoria</a></li>
                            <li className="main_header_departments_li_ul_li"><a href="">Categoria</a></li>
                            <li className="main_header_departments_li_ul_li"><a href="">Categoria</a></li>
                            <li className="main_header_departments_li_ul_li"><a href="">Categoria</a></li>
                        </ul>
                    </li>
                    <li className="main_header_departments_li">
                        Departamento
                    <ul className="main_header_departments_li_ul">
                            <li className="main_header_deprtaments_li_ul_li"><a href="">Categoria</a></li>
                            <li className="main_header_departments_li_ul_li"><a href="">Categoria</a></li>
                            <li className="main_header_departments_li_ul_li"><a href="">Categoria</a></li>
                            <li className="main_header_departments_li_ul_li"><a href="">Categoria</a></li>
                        </ul>
                    </li>
                    <li className="main_header_departments_li">
                        Departamento
                    <ul className="main_header_departments_li_ul">
                            <li className="main_header_departments_li_ul_li"><a href="">Categoria</a></li>
                            <li className="main_header_departments_li_ul_li"><a href="">Categoria</a></li>
                            <li className="main_header_departments_li_ul_li"><a href="">Categoria</a></li>
                            <li className="main_header_departments_li_ul_li"><a href="">Categoria</a></li>
                        </ul>
                    </li>

                </ul>
            </div>
        </header>
    );
}

export default StaticHeader;

如果有人能帮助我,我应该做些什么才能使我的模式正常工作呢?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-15 21:48:51

问题是您已经将您的模式封装在<a />标记中,并且在那里您有一个调用openModalonClick。一旦你在你的模式中点击"close“,event就会传播并触发点击<a />标签。

要解决这个问题,只需将<Modal />放在<a />标记之外即可。

代码语言:javascript
复制
<a href="#" title="#" className="icon-user main_header_nav_menu_user_a radius transition" onClick={openModal} >Login</a>

{modalIsOpen && <ModalLogin isOpen={modalIsOpen} close={closeModal}/> }
票数 2
EN

Stack Overflow用户

发布于 2020-12-12 22:41:38

在这一行中:

代码语言:javascript
复制
{modalIsOpen && <ModalLogin isOpen={openModal} close={closeModal}/> }

isOpen属性应接收布尔值,但实际上接收的是函数(openModal)。正确的值为isOpen={modalIsOpen}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65266103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档