react和验证库

IT技术 jquery reactjs validation
2021-05-03 09:47:13

TL;DR:React 提供受控组件 HOC,这是 NPM 中 React 验证库的基本思想。但是,弱点是与React Select现有组件的集成以及错误消息的自定义显示位置

我正在从传统的 jQuery 和 PHP 编码迁移(多年来用于真实和大型项目,而不是学生学习玩代码)。我大部分时间都在 FORM 上,因为客户的要求总是关于 FORM。

现在有了 FORM,最重要的部分是验证方法/插件。首先忘记一些人告诉我们“使用 React 你可以轻松地做受控组件,所以我们不需要验证插件”。我们在生产中的 FORM 需要数百个带有许多选项卡的字段(例如人事表格或一些疯狂的组织报告),因此每个字段的编码是不切实际的,就像传统的 js 编码来验证表单一样。

来到图书馆,我测试发现这三个可能已经足够了。

  1. react验证
  2. react验证混合
  3. 福尔摩斯

我不会详细介绍这些库,但它们的工作方式是相似的。我们必须为 input、select、textarea 和 form 创建一个组件才能使它们工作。在 Input 组件中,我们定义了 Input 边框如何更改类以使边框错误为红色以及错误消息如何出现(在 Input 下方的 div 或 span 中)。

(还有其他验证库,但他们的方法是对表单进行 json 验证,甚至使用 json 创建表单,这不是我的选择,因为我只想通过输入中的一个简单属性来验证表单,例如[required, email],而不是在大量定义上浪费时间json)

现在我在这些情况下坚持使用这种技术:

1. 存在优秀组件的集成

我从 NPM 下载了优秀的组件来解决一些特定的功能(比如React Select)。现在开始真正的工作,我们必须验证这些自定义组件的输入。这是一项额外的工作,我们必须将验证集成到任何发现的额外组件中。我一头撞在墙上想出使用 HOC 来验证React Select像这样(React-Validation 代码)。为了完成这项工作,我必须修改 origin HOC 以创建自定义 HOC。

  // Define own Input component 
  function MySelect({ error, isChanged, isUsed, ...selectProps }) {
      return(
         
        <div>
            <Select onChange={selectProps.onChange.bind(this)} {...selectProps} {...( isChanged && isUsed && error ? {
            className: `is-invalid-input ${selectProps.className}`
          } : { className: selectProps.className } )} />
            <input type="hidden"  {...selectProps}  />
          {isChanged && isUsed && error}
        </div>
      ) 
  } 

  const MyValidationSelect = controlSelect(MySelect); //My custom HOC

现在,我想不出更多在未来使用这种技术。想象一下,我们有项目并且需要一个额外的组件。我们没有太多时间来编写自己的代码,所以下载一个库。BOOM*,我们拼命想弄清楚如何使自定义组件验证。我们将把时间浪费在“副项目”上,而不是主要任务(客户端请求功能)上。

2. 验证消息的自定义位置

组件很好,但它也将代码包装在布局中。错误信息必须是输入组件的一部分。现在是困难的部分,一些疯狂的客户端需要将错误消息放在表单顶部或模式框中。在这种情况下,如果在组件中使用包装输入和错误,我仍然想不出解决方案。

3.我的肮脏解决方案

jQuery 出现的时间足以让 jQuery lib 变得成熟。使用 jquery 的验证可以通过所谓的jQuery Validation解决使用这个库(自定义错误位置、自定义字段、自定义验证器、自定义错误格式(不仅仅是 css)...)

我只是使用 React 表单进行 jQuery 验证,ComponentDidMount并且它按原样工作。通过使用errorPlacement, highlight,success函数 API写入“验证配置文件” 为任何自定义react组件集成验证也很简单


感谢任何人到达这条线,这真的是一个很长的话题。这是我的问题:我试图“在react中思考”,但无法解决最简单的问题:react表单验证。

感谢您对我解决此问题的任何提示。

4个回答

我已经构建了一个自定义 Hook 以方便表单验证,也许您会发现它很有用。

Github:https : //github.com/bluebill1049/react-hook-form 网站:https : //react-hook-form.now.sh

下面的快速代码示例

import React from 'react'
import useForm from 'react-hook-form'

function App() {
  const { register, handleSubmit, errors } = useForm() // initialise the hook
  const onSubmit = (data) => { console.log(data) } // callback when validation pass

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input name="firstname" ref={register} /> {/* register an input */}

      <input name="lastname" ref={register({ required: true })} /> {/* apply required validation */}
      {errors.lastname && 'Last name is required.'} {/* error message */}

      <input name="age" ref={register({ pattern: /\d+/ })} /> {/* apply a Refex validation */}
      {errors.age && 'Please enter number for age.'} {/* error message */}

      <input type="submit" />
    </form>
  )
}

我遇到了同样的问题,因此我自己写了一个小包:

https://www.npmjs.com/package/validate-react

这会处理简单的验证,不需要 redux 或重命名的标签。

使用react-forms-validator对react进行流畅的表单验证

react形式验证器

为 React 组件提供简单表单验证的组件。

如果您发现任何错误或错误,请随时提出问题。也欢迎拉取请求。

安装

npm i -S react-forms-validator

示例用法

首先导入module。

而已。我们现在可以在我们的 React 组件中使用它:

从'react-forms-validator'导入验证器;

import React, { Component } from 'react';
import Validator from 'react-forms-validator';

class Login extends React.Component{

    constructor( props ){
        super( props );
        this.state = {
            contact_no:"",
            password:"",
            submitted:false,
        };
        this.handleChange = this.handleChange.bind(this);
        this.handleFormSubmit = this.handleFormSubmit.bind(this);
        this.isValidationError = this.isValidationError.bind(this);
        this.flag= true;
        this.isFormValidationErrors = false;
    }


    handleChange(event){
        let { name, value } = event.target;
        this.setState( { [name]:value } );
        let { submitted } = this.state;
    }
    isValidationError(flag){
        this.isFormValidationErrors = flag;
    }

    handleFormSubmit(event){
        event.preventDefault();
        this.setState( { submitted:true } );
        let { contact_no, password } = this.state;
        if ( !this.isFormValidationErrors ){
            //you are ready to dispatch submit action here.
        }
    }

    render() {
        let { contact_no, password, submitted } = this.state;
        return(
            <div>
                <form noValidate onSubmit={this.handleFormSubmit}>
                    <div className="formgroup">
                        <Input 
                            type="text" name="email" 
                            placeholder="Contact number" 
                            value={ contact_no } 
                            onChange={ this.handleChange }/>
                            <Validator 
                                isValidationError={this.isValidationError}
                                isFormSubmitted={submitted} 
                                reference={contact_no}
                                validationRules={{required:true,number:true,maxLength:10}} 
                                validationMessages={{required:"This field is required",number:"Not a valid number",maxLength:"Not a valid number"}}/>
                    </div>
                    <div className="formgroup">
                        <Input 
                            type="password" 
                            name="password" 
                            placeholder="Password" 
                            value={ password } 
                            onChange={ this.handleChange } 
                            autoComplete/>
                            <Validator 
                                isFormSubmitted={submitted} 
                                reference={password} 
                                validationRules={{required:true}} 
                                validationMessages={{required:"This field is required",}}/>

                    </div>
                    <div>
                        <button type="submit">Sign In</button>
                    </div>
                </form>
            </div>  
        )
    }
}

组件和props

react-forms-validator提供一个Validator组件。还提供五 (5) 个必需的props。现在所有的props都是必需的。

isValidationError 功能。

isFormSubmitted 布尔值 [真|假]。

reference参考输入值。状态值一样contact_no,并password在上面的例子。

validationRules目的。查一下下面的可用规则。

validationMessages 目的。

注意:validationRules对象的validationMessages应该是相同的并且是必需的。

在功能组件的情况下。功能组件库 在类组件案例中。类组件的库

点击两者的href并获取它。如果有帮助,请投票!