You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React中实现点击按钮弹出表单弹窗并在提交后自动关闭

React弹窗表单实现方案

步骤1:改造Contact组件适配弹窗逻辑

你需要给Contact组件新增关闭弹窗的回调能力,同时添加弹窗容器结构:

import React, {useState} from 'react';
import './contactModal.css'

const initialFormValues = {
    firstName: '',
    lastName: '',
    email: '',
    phone: '',
    message: ''
}

// 新增接收onClose关闭回调
export default function Contact({ onClose }){

    const [contacts, setContacts] = useState([]);
    const [formValues, setFormValues] = useState(initialFormValues);

    const inputChange= (name, value) => {
        setFormValues({...formValues, [name]: value})
    }
    const onChange = e => {
        const {name, value} = e.target;
        inputChange(name, value);
    }
    const postNewContact = newContact => {
        setContacts([newContact, ...contacts])
        setFormValues(initialFormValues);
        // 提交成功后调用关闭弹窗方法
        onClose?.()
    }
    const formSubmit = () => {
        const newContact = {
            firstName: formValues.firstName.trim(),
            lastName: formValues.lastName.trim(),
            email: formValues.email.trim(),
            phone: formValues.phone.trim(),
            message: formValues.message.trim()
        }
        postNewContact(newContact)
    }
    const onSubmit = e => {
        e.preventDefault();
        formSubmit();
    }

    return (
        // 新增弹窗外层遮罩,点击遮罩关闭弹窗
        <div className="modal-mask" onClick={onClose}>
            {/* 弹窗内容区,阻止点击冒泡避免点内容也关闭 */}
            <div className="modal-content" onClick={e => e.stopPropagation()}>
                <div className='contact container'>
                    <h1>联系我们</h1>
                    <form id='contact-form' onSubmit={onSubmit}>
                        <div className='form-group inputs'>
                            <label>
                                名字:
                                <input 
                                type='text'
                                value={formValues.firstName}
                                onChange={onChange}
                                name="firstName"
                                />
                            </label>
                            <label>
                                姓氏:
                                <input 
                                type='text'
                                value={formValues.lastName}
                                onChange={onChange}
                                name="lastName"
                                />
                            </label>
                            <label>
                                邮箱:
                                <input 
                                type='email'
                                value={formValues.email}
                                onChange={onChange}
                                name="email"
                                />
                            </label>
                            <label>
                                手机号码:
                                <input 
                                type='text'
                                value={formValues.phone}
                                onChange={onChange}
                                name="phone"
                                />
                            </label>
                            <label>
                                留言:
                                <input 
                                type='text'
                                value={formValues.message}
                                onChange={onChange}
                                name="message"
                                />
                            </label>
                        </div>
                        <div className='form-group submit'>
                            <button id='contact-btn'>提交联系信息</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    )
}

步骤2:改造Footer组件控制弹窗显隐

给Footer添加弹窗显隐状态,点击Contact链接时触发弹窗显示:

import React, { useState } from 'react';
import Contact from './Contact'; // 替换为你实际的Contact组件路径
import './footer.css'

function Footer()
{
    // 新增控制弹窗显隐的状态
    const [isModalOpen, setIsModalOpen] = useState(false)

    return (
        <div className="Footer">
            <div className="container">
                <div className="row">

                    <div className="col">
                        <h4 className="block ">About Us</h4>
                    </div>

                    <div className="col">
                        {/* 给Contact添加点击事件,打开弹窗 */}
                        <h4 className="block" style={{cursor: 'pointer'}} onClick={() => setIsModalOpen(true)}>Contact</h4>
                    </div>

                    <div className="col">
                        <h4><a className="block" href={"https://www.cdc.gov/coronavirus/2019-ncov/faq.html"}>COVID-19 FAQ</a></h4>
                    </div>

                    <div className="col">
                        <h4 className="block"><a className="block" href={"https://www.cdc.gov/coronavirus/2019-ncov/if-you-are-sick/quarantine.html"}>CDC Guidelines</a></h4>
                    </div>

                </div>
            </div>
            {/* 弹窗状态为true时渲染Contact组件,传入关闭方法 */}
            {isModalOpen && <Contact onClose={() => setIsModalOpen(false)} />}
        </div>
    );
}

export default Footer;

步骤3:添加弹窗基础样式

新建contactModal.css文件,添加如下样式实现基础弹窗效果:

.modal-mask {
    position: fixed;
    top: 0;
    left: 0;
    width: 100vw;
    height: 100vh;
    background-color: rgba(0,0,0,0.5);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 9999;
}

.modal-content {
    background-color: #fff;
    padding: 2rem;
    border-radius: 8px;
    max-width: 500px;
    width: 90%;
}

以上代码实现后即可达成需求:点击Footer的Contact文字弹出表单,提交表单后弹窗自动关闭,点击遮罩也可以手动关闭弹窗。

内容的提问来源于stack exchange,提问作者user5019516

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:06:02