添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

react中进行表单验证毫无疑问是繁琐的,尤其对于动态添加或删除的表单,其验证逻辑更为复杂, 目前UI框架使用material ui ,但其表单处理不太理想,而后研究了一下另一个UI 框架 ant design, 其对表单的处理大大方便了逻辑的编写, 它使用async-validator处理验证逻辑

目前更换框架毫无疑问是不现实的,于是就想直接引入async-validator,下面描述一个简单的使用,具体信息可以去github上查看

validate.js

import Schema from 'async-validator';
* @params form: {
*   descriptor: 验证规则
*   source: 待验证字段
*   callback: 异步验证回调函数
* @return errInfo {
*   isAllValid: 验证是否通过
 *  errors: 验证失败的字段信息
* 不管验证结果成功还是失败,都会将结果信息写入errors中,方便调用者直接通过数组下标方式获取验证结果信息
function validate (form) {
    let errInfo = {};
    let errStatus = [];
    let descriptor = form.descriptor;
    let validator = new Schema(descriptor);
    validator.validate(form.source, {
        firstFields: true  // 如果一个字段对应多个验证规则, 只显示验证失败的第一个规则信息,并不再进行后续规则的验证
    }, (errors, fields) => {
        if (errors) {
            /* 如需异步验证需要传入回调函数callback */
            errors.forEach(item => {
                errStatus.push(item.message.errStatus);
            errInfo.errors = errors;
            errInfo.isAllValid = !errStatus.includes(true);
            form.callback && form.callback(errInfo);
    return errInfo;
export default validate;

Form.js

* Created by wxw on 18-4-26. import React from 'react' ; import {inject} from 'mobx-react' ; import { withStyles } from 'material-ui/styles' ; import validate from '../utils/validate' ; import {formTest2} from '../utils/validateRules' ; import Input, { InputLabel } from 'material-ui/Input' ; import { FormControl, FormHelperText } from 'material-ui/Form' ; import { MenuItem } from 'material-ui/Menu' ; import Select from 'material-ui/Select' ; import Button from 'material-ui/Button' ; const styles = theme => ({ container: { display: 'flex' , flexWrap: 'wrap' , formControl: { margin: theme.spacing.unit, button: { margin: theme.spacing.unit, color: '#fff' @inject( 'rootStore' ) @withStyles(styles) class FormTest2 extends React.Component { state = { name: { value: '' , errStatus: false , errMsg: '请输入name' age: { value: '' , errStatus: false , errMsg: '请选择age' handleChange =(field) => event => { if (field === 'name' ) { this .setState({ name: Object .assign( this .state.name, {value: event.target.value}) }); } else if (field === 'age' ) { this .setState({ age: Object .assign( this .state.age, {value: event.target.value}) }); handleCheck = (field) => () => { if (field === 'name' ) { let errInfo = validate({ descriptor: formTest2, source: { name: this .state.name.value, this .setState({ name: errInfo.errors[ 0 ].message}); } else if (field === 'age' ) { let errInfo = validate({ descriptor: formTest2, source: { age: this .state.age.value, this .setState({ age: errInfo.errors[ 1 ].message }); handleSubmit = () => { let {name, age} = this .state; let errInfo = validate({ descriptor: formTest2, source: { name: name.value, age: age.value errInfo.errors.forEach(item => { this .setState({ [item.field]: item.message if (errInfo.isAllValid) { console.log( '验证成功' ); } else { console.log( '验证失败' ); render () { const { classes } = this .props; const {name, age} = this .state; return ( < div className = "form2" > < FormControl className = {classes.formControl} error = {name.errStatus} > < InputLabel htmlFor = "name-simple" > Name </ InputLabel > < Input id = "name-simple" value = {name.value} onChange = {this.handleChange('name')} placeholder = "placeholder" onBlur = {this.handleCheck('name')} /> < FormHelperText id = "name-simple" > {name.errMsg} </ FormHelperText > </ FormControl > < FormControl className = {classes.formControl} error = {age.errStatus} > < InputLabel htmlFor = "age-simple" > Age </ InputLabel > < Select value = {age.value} onChange = {this.handleChange('age')} onBlur = {this.handleCheck('age')} inputProps = { { name: ' age ', id: ' age-simple ', < MenuItem value = {10} > Ten </ MenuItem > < MenuItem value = {20} > Twenty </ MenuItem > < MenuItem value = {30} > Thirty </ MenuItem > </ Select > < FormHelperText id = "age-simple" > {age.errMsg} </ FormHelperText > </ FormControl > < Button variant = "raised" color = "primary" className = {classes.button} onClick = {this.handleSubmit} > </ Button > </ div > export default FormTest2;

validateRules.js

* Created by wxw on 18-4-26. export const formTest2 = { name: { validator(rule, value, callback, source, options) { /* callback必须执行一次,带参数为错误信息,不带参数为正确 */ if (value) { callback({ errMsg: "请输入name" , value, errStatus: false } else { callback({ errMsg: "name不能为空" , value, errStatus: true age: { validator(rule, value, callback, source, options) { /* callback必须执行一次,带参数为错误信息,不带参数为正确 */ if (value) { callback({ errMsg: "请选择age" , value, errStatus: false } else { callback({ errMsg: "必选项" , value, errStatus: true

综上为一个小demo,在此基础上可以进行更深层次的封装以便使用

React 本机 表单验证 React Native 表单验证 器是一个简单的库,用于 使用 React Native来验证您的表单字段。 该库自愿 使用 方便。 您只需要在所需的 React 本机表单组件上扩展“ Valid ationComponent”类。 运行npm install' react -native-form- valid a tor '来获取库: npm install ' react -native-form- valid a tor ' --save 2.在您的应用程序 使用 它 在表单组件上扩展“ Valid ationComponent”类: import React from ' react ' ; import Valid ationComponent from ' react -native-form- valid a tor ' ; export default class MyForm exte let rules = { name: "required|min:3|max:10|alpha", username: "required|min:3|max:10|alpha_num", email: "required|email", lastName: "required_if:name,naomi", password: "required|min:8|max:25|alpha_num_punct|confirmed:password_confirmation", password_confirmation: "required 最近在实际开发 遇到需要验证合同编号是否在数据库已经存在,自定义 表单验证 。的 表单验证 大家都知道form绑定rules,prop绑定值与form.值一样,必填,失去焦点触发 提示信息。今天我们讲一讲自定义验证规则具体 使用 场景和它的三个参数意思和 使用 当我们明白了 valid a tor 3个参数意思,我们就可以随机组合我们自己的验证规则了自定义验证规则prop绑定值: [console.log('验证规则信息',rule);console.log('输入框的值',rule); React -js-验证器 该组件为 react js提供简单的输入验证。 使用 可以直接 使用 验证功能,也可以 使用 自定义输入 进行 验证。 直接 使用 方法或 使用 下面列出的自定义输入 验证方法: CustomRx 自定义输入组件: 电子邮件输入 字母数字输入 带有软件包名称的简单命令npm install命令 npm install react -js- valid a tor 使用 方法例 iimport React , { Component } from ' react '; import Container from '../Containers/Container'; import { Email,Numeric,Letter,AlphaNumeric,CustomRx,Required } from ' react -js- valid a tor ' class valid a tor : (_, value) => { return value.length > 20 ? Promise.reject('分类名称不能超过20个字符') : Promis... react 指令封装 - valid a tor 校验 React valid a tor 封装因form表单校验,可以引入针对于form表单的校验,但是个人嫌弃其他文件的校验方式引用文件比较大,所以自己封装了个简单的检验方式,而 react 又没有指令这个概念,所以个人仿照vue 的指令,简单的封装 了一个 valid a tor 的检验方式。优点:1、体积小,未压缩前3k,简单实现了非空校验跟正则校验。2、相对 React .PropTypes 在 React v15.5 版本后已经移到了 prop-types 库。 <script src="https://cdn.bootcss.com/prop-types/15.6.1/prop-types.js"></script> Props 验证 使用 propTypes,它可以保证我们的应用组件被正确 使用 React .PropTypes... { required: true, message: '用户名不能为空' }, { min: 4, message: '用户名至少4位' }, { max: 12, message: '用户名至多12位' }, { pattern: /^[a-zA-Z0-9_]+$/, message: '用户名必须需是英文,数字或下划线组成' }, 自定义 valid a tor 写法 valid atePwd = async (rule, v labelCol={{ span: 8, offset: 2 }} wrapperCol={{ span: 14, offset: 0 }} rules={[{ required: true }, { pattern: /^[0-9]*$/, message: '必须是数字格式' }]}