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

React模态框表单添加required属性及按钮onClick双事件实现方法

React访客信息填写模态框功能实现方案

原始参考代码

export default function Modal({onClose}){
    const dispatch = useDispatch();
    const [Name, setName] =useState("");
    const [Email, setEmail] =useState("");

    return (
        <div className="background">
            <div className="modalContainer">

                <div className="title">
                    <h1>Continued As Guest</h1>
                </div>
                <br></br>
                <br></br>
                <div className="body">
                    <form className="Guest" >
                        <input type="text" name = "GuestName" placeholder="Name"  value={Name}
                               onChange={(event) => {setName(event.target.value);}}
                        />

                        <br></br>
                        <br></br>
                        <input type="Email" placeholder="Email" value={Email}
                               onChange={(event) => {setEmail(event.target.value);}}/>
                        <br></br>
                        <br></br>
                        <br></br>
                        <div className= "footer">
                            <button id = "cancel"
                                    onClick={()=>onClose(false)}>Cancel</button>
                                <button    
                                    type = "button"
                                    onClick={() => {
                                        dispatch(addGuest({
                                            Name:Name, Email:Email}));
                                    }}
                                >Continue</button>
                        </div>
                    </form>
                </div>


            </div>
        </div>
    )
}

功能实现说明

1. 必填校验实现

直接在GuestName输入框标签上加required原生属性即可触发浏览器自带的必填校验,注意要让校验生效,提交按钮不能设置type="button",需要改成默认的submit类型,同时把提交逻辑绑定在表单的onSubmit事件上,否则原生校验不会触发。如果需要给邮箱也加校验,同理给邮箱输入框加required属性,配合type="email"还能自动校验邮箱格式。

2. 提交+跳转逻辑实现

把原来绑定在按钮点击事件上的逻辑移到表单提交回调中,先执行dispatch派发action提交数据,再执行跳转逻辑即可:

  • 普通网页跳转直接用window.location.href = 目标地址
  • React Router单页应用跳转可以用路由提供的useNavigate钩子实现无刷新跳转

修改后可直接运行的完整代码

export default function Modal({onClose}){
    const dispatch = useDispatch();
    const [Name, setName] = useState("");
    const [Email, setEmail] = useState("");

    // 表单统一提交逻辑
    const handleFormSubmit = (e) => {
        // 阻止表单默认刷新页面行为
        e.preventDefault();
        // 第一步:派发action提交访客填写的数据
        dispatch(addGuest({Name, Email}));
        // 第二步:跳转到目标页面,替换为你自己的业务地址即可
        window.location.href = "/your-target-page";
        // React Router项目可替换为下面的单页跳转写法
        // const navigate = useNavigate();
        // navigate("/your-target-page");
    }

    return (
        <div className="background">
            <div className="modalContainer">
                <div className="title">
                    <h1>Continue As Guest</h1>
                </div>
                <br/>
                <br/>
                <div className="body">
                    <form className="Guest" onSubmit={handleFormSubmit}>
                        {/* 新增required属性实现姓名必填校验 */}
                        <input 
                            type="text" 
                            name="GuestName" 
                            placeholder="Name"  
                            value={Name}
                            required
                            onChange={(event) => {setName(event.target.value);}}
                        />
                        <br/>
                        <br/>
                        {/* 可选:给邮箱也加必填+格式校验 */}
                        <input 
                            type="email" 
                            placeholder="Email" 
                            value={Email}
                            required
                            onChange={(event) => {setEmail(event.target.value);}}
                        />
                        <br/>
                        <br/>
                        <br/>
                        <div className="footer">
                            <button 
                                id="cancel"
                                type="button"
                                onClick={()=>onClose(false)}
                            >
                                Cancel
                            </button>
                            {/* 按钮type改为submit,触发表单校验和提交 */}
                            <button type="submit">
                                Continue
                            </button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    )
}

注意:Cancel按钮必须保留type="button"属性,否则点击时会误触发表单提交逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:48:22