如何在 ReactJS 中检查文本输入是不是具有有效的电子邮件格式?

Posted

技术标签:

【中文标题】如何在 ReactJS 中检查文本输入是不是具有有效的电子邮件格式?【英文标题】:How to check if it a text input has a valid email format in ReactJS?如何在 ReactJS 中检查文本输入是否具有有效的电子邮件格式? 【发布时间】:2017-01-14 08:57:00 【问题描述】:

在 ReactJS 中,验证输入的文本 (<TextField/>) 是否为电子邮件格式(例如使用 @)的正确方法是什么?

我已将应用程序连接到 MongoDB,那么我应该在客户端还是服务器端进行电子邮件格式检查?

任何示例或指导将不胜感激。

提前谢谢你!

【问题讨论】:

您出于用户体验的原因在客户端执行电子邮件验证;在服务器上,如果您明确需要来自客户端的电子邮件,则使用非 2XX(最好是 4XX)HTTP 状态代码进行响应。 【参考方案1】:

每个人都在这里提出了一些有效的观点,您必须遵循几乎所有这些观点来验证数据。

无论如何,到目前为止,我认为这将是推进电子邮件验证的更好方法。

    设置 <input type="email" /> 以便浏览器可以为您验证电子邮件 使用 javascript 验证它 在服务器上执行验证

你可以像这样渲染输入

<input type="email" value= this.state.email  onChange= handleOnChange  />

你的handleOnChange 函数代码看起来像这样

let handleOnChange = ( email ) => 

    // don't remember from where i copied this code, but this works.
    let re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]1,3\.[0-9]1,3\.[0-9]1,3\.[0-9]1,3])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]2,))$/;

    if ( re.test(email) ) 
        // this is a valid email address
        // call setState(email: email) to update the email
        // or update the data in redux store.
    
    else 
        // invalid email, maybe show an error to the user.
    


注意:根据您的设置方式,您可能需要使用 this.handleOnChange 而不是 handleOnChange 并将其绑定到 constructor 中,例如 this.handleOnChange = this.handleOnChange.bind(this);

...

当您使用email address 向服务器/api 发出发布请求时,验证服务器上的电子邮件,如果有效,将其存储在数据库中,否则返回错误。

您可以只使用 google node* 验证库并使用它们来处理所有验证,您可以使用此处的电子邮件验证代码...或根据需要进行验证。

【讨论】:

【参考方案2】:

可以使用javascript+正则表达式验证来进行

您可以禁用提交按钮或添加文本警告,直到电子邮件输入与正则表达式格式匹配。

html

<input type="text" name="email" id="email" placeholder="Email" onKeyPress="emailVerify(this.id)">

JAVASCRIPT:

function emailVerify(x)

var testEmail =    /^[ ]*([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]2,)[ ]*$/i;
  jQuery('input').bind('input propertychange', function() 
    if (testEmail.test(jQuery(this).val()))
    
       // action to be performed if email is valid

      
     else
     
       // action to be performed if email is invalid - like disabling the submit button
     
   );

函数 emailVerify() 应该在电子邮件文本框中的每次“按键”期间调用。

函数.bind() 记录所有按键按下事件,即每当您按下按键时,它都会检查您的电子邮件文本框输入是否与正则表达式匹配(testEmail 字符)

将考虑格式为 me@me.co 的电子邮件,而电子邮件 me/@me.co 将被视为无效

【讨论】:

根据浏览器的不同,电子邮件检查甚至不需要任何正则表达式检查。只需将type 设置为"email",浏览器就会警告用户输入的字符串不是电子邮件地址。您只对那些没有"email" 作为输入类型的恐龙时代的浏览器执行电子邮件检查。此外,也许考虑使用库进行电子邮件验证。对于 JavaScript,我们有 validator.js:github.com/chriso/validator.js【参考方案3】:

这取决于您的 TextField 组件是如何实现的,但通常使用 React 您可以通过 onChange 事件获取文本输入字段值并将其置于组件状态或其他位置(例如您的 redux 存储)。您的代码可能如下所示:

<input
    type="text"
    value=this.state.email
    onChange=event => this.setState(email: event.target.value)
/>

现在您可以在 onChange 处理程序中简单地检查电子邮件的有效性,但这可能过于昂贵(因为您基本上在每次按键时都重新检查)。另一种解决方案是在组件失去焦点时进行检查,如下所示:

<input
    type="text"
    value=this.state.email
    onChange=event => this.setState(email: event.target.value)
    onBlur=() => this.setState(
        emailIsValid: isValidEmailAddress(this.state.email)
    )
/>

然后您可以根据您的组件状态中的 emailIsValid 布尔值的值向用户提供反馈,例如使用 css 类。

编辑:Salehen Rahman 对 type="email" 选项提出了一个有效的观点。下面的段落可能不那么相关。

对于 isValidEmailAddress 实现,正则表达式是一个合理的选择。有或多或少复杂的正则表达式来确定有效的电子邮件,但只有一个非空字符串,然后是@,然后是另一个非空字符串是一个很好的近似值。所以这样的事情可以做到:

function isValidEmailAddress(address) 
    return !! address.match(/.+@.+/);

【讨论】:

【参考方案4】:

表单验证应该在双方完成:客户端和服务器端也是如此,这里有一个很好的example 来了解如何使用 Flux 架构在 React 中实现表单验证

【讨论】:

【参考方案5】:

您可以使用 Joi Library,它非常简单,并涵盖了您表单的所有不同情况https://www.npmjs.com/package/joi 你也可以将它与打字稿一起使用。 这是一个简单的: 创建一个包含所有输入的架构

schema = Joi.object(
 name: Joi.string().required(),
 email: Joi.string().email( tlds:  allow: false  ).required()
);

在您的 handleInputleChange 中,您可以调用您的验证函数来验证您的架构。

const errors = schema.validate(YourInputClass, 
  abortEarly: false,
  stripUnknown:  objects: true ,
);

errors 变量中,您应该找到一个包含detailserror object,如果您的表单无效,则描述所有相关的错误消息。

【讨论】:

【参考方案6】:
 function isValiEmail(val) 
    let regEmail = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]1,3\.[0-9]1,3\.[0-9]1,3\.[0-9]1,3])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]2,))$/;
    if (!regEmail.test(val)) 
      return 'Invalid Email Address';
    
  

【讨论】:

以上是关于如何在 ReactJS 中检查文本输入是不是具有有效的电子邮件格式?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ReactJS 将我的输入值保存到文本文件中?

reactjs错误-onChange不是函数错误

ReactJS - 在为新行输入数据时,如何将单元格文本包装在 MaterialTable 中?

Object.keys映射返回对象Object而不是ReactJS中的文本输入表单中的值

如何检查用户是不是在文本字段中输入了超过 1 个小数?

具有深层分层数据的 ReactJS 数据流