Redux-form嵌套到实际项目开发案例七

11 篇文章 0 订阅
10 篇文章 1 订阅
本案例是异步请求验证,输入框失去焦点就验证官方案例

一、为了实现异步验证,需要给reduxForm装饰器传递一个异步验证函数,该函数以表单value,dispatch为参数,返回一个promise对象,该promise对象被拒绝的时候返回错误信息对象,在已经解决的时候则返回验证信息

二、asyncValidate.js代码

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))

const asyncValidate = (values/*, dispatch */) => {
    return sleep(1000) // simulate server latency
        .then(() => {
            if (['john', 'paul', 'george', 'ringo'].includes(values.username)) {
                throw {username: 'That username is taken'}
            }
        })
}

export default asyncValidate


----------


也可以直接写成
const asyncValidate = (value,/*dispatch*/) =>
    new Promise((resolve,reject)=>{
        setTimeout(()=>{
            if(['john', 'paul', 'george', 'ringo'].includes(values.username)){
                reject({username: 'That username is taken'})
            }else{
                resolve()
            }
        })
    })

三、validate.js代码

const validate = values => {
    const errors = {}
    if (!values.username) {
        errors.username = 'Required'
    }
    if (!values.password) {
        errors.password = 'Required'
    }
    return errors
}

export default validate

四、AsyncValidationForm.js代码

import React from 'react'
import {Field, reduxForm} from 'redux-form'
import validate from './validate'
import asyncValidate from './asyncValidate'

//将验证传递的传递进去(仅仅是装饰器)
const renderField = ({input, label, type, meta: {asyncValidating, touched, error}}) => (
    <div className="form-group">
        <label>{label}</label>
        <div>
            <input {...input} type={type} placeholder={label} className="form-control"/>
            {touched && error && <span>{error}</span>}
        </div>
    </div>
)

const AsyncValidationForm = (props) => {
    const {handleSubmit, pristine, reset, submitting} = props
    return (
        <form onSubmit={handleSubmit(val => console.log(val))}>
            <Field name="username" type="text" component={renderField} label="Username"/>
            <Field name="password" type="password" component={renderField} label="Password"/>
            <div>
                <button type="submit" className="btn btn-success" disabled={submitting} style={{marginRight:'20px'}}>Sign Up</button>
                <button type="button" className="btn btn-success" disabled={pristine || submitting} onClick={reset}>Clear Values</button>
            </div>
        </form>
    )
}

export default reduxForm({
    form: 'asyncValidation', // a unique identifier for this form
    validate,
    asyncValidate,
    asyncBlurFields: ['username'] //异步验证的
})(AsyncValidationForm)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水痕01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值