You need to enable JavaScript to run this app. 如何为React.js结合Firebase实现的表单添加指定校验规则?
优惠活动
大模型
产品
解决方案
定价
更多

如何为React.js结合Firebase实现的表单添加指定校验规则?

表单校验功能实现方案

我们只需要在原有代码基础上新增状态管理、校验逻辑、错误提示三部分内容即可完成需求,具体修改如下:

核心修改点

  • 新增错误状态存储字段,用于记录各输入项的校验失败提示
  • 新增独立校验函数,实现所有要求的校验规则
  • 提交逻辑前置校验步骤,校验不通过则不触发Firebase提交
  • 表单内新增错误提示展示,方便用户直观感知错误原因

完整修改后代码

import React, { useState } from "react";
import {db} from './firebase'

const Contact = () => {
  const [senderName,setSenderName] = useState("");
  const [senderEmail,setSenderEmail] = useState("");
  const [senderMessage,setSenderMessage] = useState("");
  // 新增错误状态管理
  const [errors, setErrors] = useState({});

  // 新增表单校验函数
  const validateForm = () => {
    const formErrors = {};
    // 用户名校验
    const trimmedName = senderName.trim();
    if (!trimmedName) {
      formErrors.senderName = "用户名不能为空";
    } else if (trimmedName.length > 40) {
      formErrors.senderName = "用户名长度不可超过40字符";
    }
    // 邮箱校验
    const trimmedEmail = senderEmail.trim();
    const emailReg = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    if (!trimmedEmail) {
      formErrors.senderEmail = "邮箱不能为空";
    } else if (!emailReg.test(trimmedEmail)) {
      formErrors.senderEmail = "邮箱格式不符合要求";
    }
    // 消息内容校验
    const trimmedMessage = senderMessage.trim();
    if (!trimmedMessage) {
      formErrors.senderMessage = "消息内容不能为空";
    } else if (trimmedMessage.length > 400) {
      formErrors.senderMessage = "消息内容长度不可超过400字符";
    }

    setErrors(formErrors);
    // 没有错误则返回校验通过
    return Object.keys(formErrors).length === 0;
  }

  const handleSubmitForm = (e) => {
      e.preventDefault();
      // 提交前先校验,校验不通过直接终止后续逻辑
      if (!validateForm()) return;

      db.collection('Contact_Form').add({
        User_name:senderName,
        User_email:senderEmail,
        User_message:senderMessage  
      })
      .then(()=>{
          alert("Message submitted")
      })
      .catch((error) => {
          alert(error.message);
      });

      setSenderName("");
      setSenderEmail("");
      setSenderMessage("");
      setErrors({});
  };

  return(
    <>
        <div className="contact_us_body">
        <div className="contact_us_container">
        <div className="contact_us_content">
           
        <div className="contact_us_right_side">
        <div className="text_heading">Send us a message</div>
        
        <form className="form" onSubmit={handleSubmitForm}  >
        

            <div className="contact_us_input_box">
                <input type="text" placeholder="Enter your name" value={senderName}
                onChange = {(e) => setSenderName(e.target.value)} />
                {/* 用户名错误提示 */}
                {errors.senderName && <p style={{color:'red',fontSize:'12px',margin:'5px 0 0 0'}}>{errors.senderName}</p>}
            </div>

            <div className="contact_us_input_box">
                <input type="text" placeholder="Enter your email"value={senderEmail}
                 onChange={(e) => setSenderEmail(e.target.value)} />
                {/* 邮箱错误提示 */}
                {errors.senderEmail && <p style={{color:'red',fontSize:'12px',margin:'5px 0 0 0'}}>{errors.senderEmail}</p>}
            </div>

            <div className="contact_us_input_box message-box">
                 <textarea name="messageText" id="" cols="30" rows="10"
                 placeholder="Type your Message"value={senderMessage}
                 onChange={(e) => setSenderMessage(e.target.value)} >
                 </textarea>
                {/* 消息错误提示 */}
                {errors.senderMessage && <p style={{color:'red',fontSize:'12px',margin:'5px 0 0 0'}}>{errors.senderMessage}</p>}
            </div>

            <div className="contact_us_button">
                <input type="submit" value="Send Now" />
            </div>

        </form>
                </div>
            </div>
        </div>
    </div>

     </>
  )
}

export default Contact;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 10:06:05