【问题标题】:Validate form in React js在 React js 中验证表单
【发布时间】:2020-08-10 14:33:39
【问题描述】:

我正在尝试在我的 React 应用程序中验证表单 onSubmit

这是在主文件中呈现的组件之一。通过点击设置警报按钮调用此组件。这并不重要,但重要的是,我将 getInfo() 函数从主组件发送到该组件作为道具。当验证返回 true

时,我需要调用此函数

表单由 3 个输入字段和一个按钮组成,但我不需要检查第一个。

由于我的应用是闹钟,当你点击设置闹钟按钮时会弹出这个表单,我需要检查是否

  • 第一个输入不为空,如果它的值不超过 24(在此输入中设置闹钟小时数)
  • 第二个输入不为空,如果它的值不超过 60(在这个输入中你设置闹钟的分钟数)

我的想法是为这些值创建 States 并创建应该更新状态的函数。特定输入的函数称为 onChange

const [validate,setValidate] = useState({
    message:'',
    hours:'',
    minutes:''
}) 

function updateHours(e){
    let value = e.target.value
    setValidate(prevState => ({
        ...prevState,
       hours:value
    }))
}

function updateMinutes(e){
    let value = e.target.value;
    setValidate(prevState => ({
        ...prevState,
        minutes:value
    }))
}

到目前为止,一切正常。然后我尝试创建将验证这些值并返回结果的新函数。这个函数将被调用onSubmit,如果返回true,则表示一切正常,将发送表单。

let getInfo = props.getInfo;

function validateForm(){
    if(validate.hours > 24){
        alert('enter correct hours !')
        return false;
    }

    if(validate.minutes > 60){
        alert('enter correct minutes !')
        return false;
    }

    return getInfo;
}

我已经尝试在 Google 上搜索如何在提交时执行此操作,但我只能找到这种方法,但它不起作用。它的行为就像没有调用任何函数。

<form onSubmit="return validateForm">
     <FontAwesomeIcon 
        icon={faTimesCircle} 
        className="closeIcon"
        onClick={() => setAlarm(false)} />

     <h3>Please set your alarm</h3>

     <label htmlFor="text">Message</label>
     <input type="text" id="text" autoComplete="off" autoFocus="on" />

     <div className="flex">
       <div className="inputNumber">
          <label htmlFor="hours">Hour</label>
          <input type="number" id="hours" name="hours" onChange={updateHours} />
       </div>
                                
       <div className="inputNumber">
          <label htmlFor="minutes">Minute</label>
          <input type="number" id="minutes" name="minutes" onChange={updateMinutes} />
       </div>
    </div>
    <button onClick={()=>setAlarm(false)}>SET ALARM</button>
</form>

有没有人遇到过这种问题,或者你能给我建议如何处理它?此外,我对一些更好的方法持开放态度。谢谢。

【问题讨论】:

    标签: javascript html reactjs forms validation


    【解决方案1】:

    首先我应该说,由于浏览器自己验证了一切,所以不需要自己在网络平台上进行验证。见Constraint Validation API。我知道这感觉很奇怪,因为大多数开发人员都是自己做的。不过我认为没有任何必要。

    您要做的是约束值,但不验证,并根据您的需要使用各种属性;类型、模式、最小、最大、最小长度、最大长度、必需等。

    您将被一些属性(validity 等)、方法(checkValidity 等)、属性(typepatternminmax 等)、伪类装备(:invalid:valid 等)和事件(invalid 等),如果用户输入对您的约束有效。

    使用这些您将有原因,以及何时无效,以及设置自定义无效状态消息或样式的机会。顺便说一句,无论您使用 React 之类的框架还是其他任何框架,它都仍然可以使用。

    【讨论】:

    • 感谢您的回答。但是我想做一些事情,例如如果小时数超过 24 ,您将无法发送该表格,并且会显示有关该特定输入的红色边框。我添加了诸如 min="1" max ="24" 之类的属性,但它仅在您单击这些数字时才有效,而不是通过键盘添加。第二件事。当我点击输入表单时不会发送(没有向状态数组添加警报)但它会消失,错误语句会弹出,但只会持续 1-2 秒。
    • @Pinnci 我没有理解您所说的“只有单击这些数字才有效,而不是通过键盘添加”。 min max 用于输入类型; numberrange与日期和时间相关的类型。只是提醒您将其中一个与这些一起使用。还有一个类型 time 输入,但支持各不相同,您不必使用它。您使用两个输入的方式在支持方面是可取的。我也在第二点进行澄清。回车时页面会重新加载吗?如果是这样,您需要在 onSubmit 处理程序中调用 event.preventDefault()
    • 对不起,我的意思是这句话-当您将鼠标悬停在输入类型编号上时,该输入内将显示小箭头。向上箭头和向下箭头。如果单击向上箭头,则该输入内的数字将增加一,如果单击向下箭头,则数字将减少。这就是我所说的“点击次数”。在这种情况下,最小和最大属性可以正常工作,并且您无法“单击”高于最大属性中的数字的数字。第二种情况,我已经描述了“通过键盘”-当您在该输入中单击时,只需键入例如 789,它就会让您键入它,当您点击时
    • 发送,然后它会通知您错误的数值。我一直在寻找类似当您输入小时数时输入的内容,例如数字 46,就在您输入 6 之后,该输入将获得红色边框样式,并且红色错误消息将在该输入下方弹出。我昨天解决了这个问题,一切都按我的意愿进行。 :) 但感谢您的回答和您的时间:)
    • 不客气。你仍然可以使用我告诉你的 API,避免泄漏验证逻辑和重复浏览器为你做的事情。在这种情况下,您需要在调用event.target.checkValidity() 的输入元素上注册blurinput 的事件处理程序。示例:developer.mozilla.org/en-US/docs/Web/API/…
    猜你喜欢
    • 2020-07-07
    • 2021-11-15
    • 2021-05-14
    • 1970-01-01
    • 2020-06-18
    • 2021-08-17
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多